Excel 如何以像素为单位设置图表的宽度和高度?

Excel 如何以像素为单位设置图表的宽度和高度?,excel,vba,charts,Excel,Vba,Charts,设置图表对象或其形状的宽度和高度不起作用。它们似乎都只是嵌入图表的白色矩形的内部部分。另外,图表区似乎不是我感兴趣的对象 我希望下面示例中导出的文件的尺寸为800x600(我并不是说重新缩放导出的图像或反复尝试,直到大小意外匹配为止)。图表周围一定有我忽略的东西 Sub mwe() Dim filepath As String Dim sheet As Worksheet Dim cObj As ChartObject Dim c As Chart Dim cShape As Shape Di

设置
图表对象
或其
形状
的宽度和高度不起作用。它们似乎都只是嵌入图表的白色矩形的内部部分。另外,
图表区
似乎不是我感兴趣的对象

我希望下面示例中导出的文件的尺寸为800x600(我并不是说重新缩放导出的图像或反复尝试,直到大小意外匹配为止)。图表周围一定有我忽略的东西

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
更新:

原来属于同一张
图表的
图表对象
形状
已经将
工作表
作为父对象,但宽度和高度不是以像素为单位指定的,而是以点为单位指定的,其中1点=1/72英寸,大多数情况下,窗口似乎假定为96像素/英寸

感谢Steve的评论,我现在使用以下内容,这是非常可靠的

导出时未激活的
ChartObject
似乎会生成一个宽度和高度比其应高1的文件

还有待了解如何自动确定系数
px2ptH
px2ptV

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

尺寸以点为单位,而不是以像素为单位。每英寸72点

800像素/72=11.11111。。。。导出图像的大小将是以英寸/计算机显示器dpi为单位的大小,通常为96(与您的情况相同,但您不能总是依赖它…使用WIN API调用来查找当前值)

Randy Birch已经发布了代码,您可以使用这些代码访问WinAPI调用以获得屏幕分辨率等


转到并使用左侧的搜索功能查找GETDEVICECAPS

为什么不在设置cobj之后添加
debug.print cobj.parent.name
?这应该给你一个正确的提示。我认为你没有得到精确的800 x 400的原因是excel使用英寸而不是像素,精度是.01英寸,因此你没有得到精确的800 x 400!由于您已正确指出导出图片的大小取决于它当前在屏幕上的显示方式,因此您无法实际期望能够控制文件的大小。即使在图纸上放大或缩小,也会影响文件的大小。我不相信你能在没有更复杂的解决方案的情况下改变这一点。我建议您确保尺寸正确,然后根据需要调整文件的大小。@iDevlop:它给出了工作表的名称。所以我们找的不是一个封闭的物体。但这里还有什么其他的原因?宽度和高度的默认单位不是像素而是mm或其他单位吗?尺寸单位是点,不是像素。每英寸72点。800像素/72=11.11111。。。。导出图像的大小将是以英寸/计算机显示器的dpi为单位的大小,通常为96(就像您的情况一样,但您不能总是指望它…使用WIN API调用来查找当前值)。完美,我为我的问题添加了解决方案。