我正在开展一个更大的项目,涉及制作一个包含多达100个不同图表的工作表(在本例中为XY散点图)。我在其他线程上看到,每次想要进行更改时激活图表效率都不高。在这个子程序中,我只是通过一个循环来创建120个空白图表,稍后将添加数据和格式。这是我的代码:
Global Const numCharts = 120
Private Charts()
ReDim Charts(numCharts)
Sub createCharts()
For graphIndex = 1 To numCharts
'adds the new chart in the specified loaction
Set Charts(graphIndex) = ActiveSheet.ChartObjects.Add(Left:=chartTopLeftX, Top:=chartTopLeftY, Width:=chartWidth, Height:=chartHeight)
Charts(graphIndex).Name = activeSheetName & graphIndex
Charts(graphIndex).ChartType = xlXYScatter
'changes the top left coordinate varibales for the following chart
If graphIndex Mod 2 = 1 Then
chartTopLeftX = chartTopLeftX + chartWidth + chartGap
'chartTopLeftY = chartTopLeftY
Else
chartTopLeftX = chartTopLeftX - chartWidth - chartGap
chartTopLeftY = chartTopLeftY + chartHeight + chartGap
End If
Next graphIndex
End Sub
Charts(graphIndex).Name
行正常,但我在Charts(graphIndex).ChartType
行上收到错误。如果我先激活图表,我可以使用ActiveChart.ChartType
,但我试图避免这种情况。希望这是有道理的。我在使用图表对象时遇到过这个问题,但似乎无法找到原因的好解释?
编辑:对不起,我应该已经指定了这个,但是在该子模块之外的模块中有许多变量已经过去。没有Charts(graphIndex).ChartType
行,代码运行完全正常。我可能没有正确处理这个,但我试图创建一个数组来保存图表对象。
答案 0 :(得分:0)
观察ChartType
是Chart
对象的成员,而不是ChartObject
对象的成员。因此,要分配ChartType
,您需要处理ChartObject.Chart
。
Sub createCharts()
Dim newChart as ChartObject
For graphIndex = 1 To numCharts
'adds the new ChartObject in the specified loaction
Set newChart = ActiveSheet.ChartObjects.Add(Left:=chartTopLeftX, Top:=chartTopLeftY, Width:=chartWidth, Height:=chartHeight)
newChart.Name = activeSheetName & graphIndex
'handles the .Chart:
newChart.Chart.ChartType = xlXYScatter
注意:除非图表已存在,否则这可能会因索引超出范围错误而失败。因此,您的代码根本不起作用(您不能以这种方式添加图表,在其上有0个图表的工作表),或者它不必要地复制了一堆额外的图表。你需要解决这个问题。
或者,链接Chart
的{{1}}属性,如:
ChartObjects.Add
但是我认为使用对象变量的第一种方法不是将它们作为Set Charts(graphIndex) = ActiveSheet.ChartObjects.Add(Left:=chartTopLeftX, Top:=chartTopLeftY, Width:=chartWidth, Height:=chartHeight).Chart
集合的索引成员不断引用。如果您不喜欢使用Charts
,请结合上述两种方法:
ChartObject
答案 1 :(得分:0)
以@ David-Zemens的答案为基础:
ChartObjects.Add
语法较旧,仍然可以正常使用,但在这种情况下,较新的语法可能会更好地为您提供服务。
使用它来构建图表(2007 +):
Dim cht as Chart
Set cht = ActiveSheet.Shapes.AddChart( _
XlChartType:= xlXYScatter, _
Left:=chartTopLeftX, _
Top:=chartTopLeftY, _
Width:=chartWidth, _
Height:=chartHeight).Chart
cht.Parent.Name = activeSheetName & graphIndex
或者这(2013 +):
Dim cht as Chart
Set cht = ActiveSheet.Shapes.AddChart2( _
Style:=240, _
XlChartType:= xlXYScatter, _
Left:=chartTopLeftX, _
Top:=chartTopLeftY, _
Width:=chartWidth, _
Height:=chartHeight, _
NewLayout:=True).Chart
cht.Parent.Name = activeSheetName & graphIndex
AddChart插入带有Office 2007默认样式的图表,AddChart2插入一个带有Office 2013样式的图表,并可选择应用不同的样式。样式240是2013年XY散点图的默认样式,其他图表类型有自己的样式。
FWIW,我总是添加一个图表并填充并格式化,然后添加下一个图表。否则它太复杂,记账太多,我总是害怕太多可能出错。