vba: comment définir la largeur et la hauteur d'un tableau excel en pixels?

une question en apparence simple. mais le réglage de la largeur et de la hauteur de la ChartObject ou de ses Shape ne pas le faire, ils ont tous deux semblent être juste une partie intérieure du rectangle blanc qui est le embeded graphique. aussi la ChartArea ne semble pas être l'objet que je suis intéressé.

ce que je veux, c'est le fichier exporté dans l'exemple suivant pour avoir des dimensions 800x600 (et je ne veux pas dire redimensionnement de l'image exportée ou d'essai et d'erreur jusqu'à ce que la taille accidentellement fits). il doit y avoir un objet sur le graphique que j'ai négligé.

Sub mwe()

Dim filepath As String
Dim sheet As Worksheet
Dim cObj As ChartObject
Dim c As Chart
Dim cShape As Shape
Dim cArea As chartArea

filepath = Left(ThisWorkbook.FullName, InStrRev(ThisWorkbook.FullName, "\"))
Set sheet = ActiveSheet
Set cObj = sheet.ChartObjects(1)
Set c = cObj.chart
Set cShape = sheet.Shapes(cObj.Name)
Set cArea = c.chartArea


cObj.Width = 800
cObj.Height = 400
MsgBox cArea.Width & " x " & cArea.Height  '793x393
c.Export filepath & "test1.png"            '1067x534, this is also the size on screen

cShape.Width = 800
cShape.Height = 400
MsgBox cArea.Width & " x " & cArea.Height  '794x393
c.Export filepath & "test2.png"            '1068x534, this is also the size on screen

End Sub

mise à jour:

il s'avère que la ChartObject et la Shape appartenant à la même Chart ont déjà la Worksheet en tant que parent. mais la largeur et la hauteur ne sont pas spécifiées en pixels comme je le pensais, mais dans les points, où 1 point = 1 /72e de pouce.

et la plupart du temps, windows semble supposer 96 pixels par pouce.

merci à steve commentaire, je suis en utilisant la suite maintenant, ce qui est tout à fait fiable. un ChartObject qui n'est pas activé au moment de son exportation semble produire un fichier où la largeur et la hauteur est de 1 plus élevé qu'il devrait être.

il reste à savoir comment déterminer les facteurs px2ptH et px2ptV automatiquement.

Sub mwe()

Dim filepath As String
Dim sheet As Worksheet
Dim cObj As ChartObject
Dim c As Chart

Dim px2ptH As Double: px2ptH = 72 / 96
Dim px2ptV As Double: px2ptV = 72 / 96
Dim w As Double: w = 800 * px2ptH
Dim h As Double: h = 400 * px2ptV


filepath = Left(ThisWorkbook.FullName, InStrRev(ThisWorkbook.FullName, "\"))
Set sheet = ActiveSheet
Set cObj = sheet.ChartObjects(1)
Set c = cObj.Chart

'otherwise image size may deviate by 1x1
cObj.Activate

cObj.Width = w
cObj.Height = h

c.Export filepath & "test.png"

End Sub
Pourquoi ne pas ajouter debug.print cobj.parent.name juste après cObj ? cela devrait vous donner le bon conseil.
Je pense que la raison que vous êtes de ne pas obtenir exactement 800 x 400 est qu'excel utilise les pouces et pas de pixels et la précision est .01 pouces et à cause de cela vous n'obtenez exactement 800 400!
Depuis que vous avez correctement indiqué que l'exportation de l'image est de taille, basé sur la façon dont elle apparaît à l'écran, vous ne pouvez pas raisonnablement s'attendre à être en mesure de contrôler la taille du fichier. Même si vous effectuez un zoom avant ou arrière sur votre feuille, cela a un impact sur la taille du fichier. Je ne crois pas que vous pouvez modifier sans avoir une bien plus compliqué solution. Je vous suggère de vous assurer dimensions sont correctes et ensuite le transformer le fichier en tant que de besoin.
il donne le nom de la feuille de calcul. il n'est donc pas un englobante de l'objet que nous recherchons. mais quoi d'autre est en jeu ici? est l'unité par défaut pour la largeur et la hauteur en pixels, mais mm ou quelque chose?
Les dimensions sont dans les points, pas de pixels. 72 points par pouce. 800 pixels / 72 = 11.11111.... La taille de l'image exportée sera la taille en pouces/résolution de l'affichage de votre ordinateur, généralement 96 (comme c'est votre cas, mais vous ne pouvez pas toujours compter sur elle ... utilisation de REMPORTER des appels d'API pour trouver la valeur actuelle)

OriginalL'auteur peter | 2013-01-31