设置ChartObject
或其Shape
的宽度和高度不会执行此操作。它们似乎都只是该白色矩形(即嵌入式图表)的内部部分。而且ChartArea
似乎不是我感兴趣的对象。
在以下示例中,我希望导出的文件具有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
更新:
事实证明,属于同一
ChartObject
的Shape
和Chart
已经以Worksheet
作为父级,但是宽度和高度不是以像素为单位,而是以点为单位,其中1点= 1/72英寸,并且在大多数情况下,Windows似乎假设每英寸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调用以获取屏幕分辨率等。
转到http://vbnet.mvps.org/index.html并使用左侧的搜索功能查找GETDEVICECAPS
关于excel - 如何设置图表的宽度和高度(以像素为单位)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14629418/