使用Excel VBA更改图表对象

时间:2018-02-01 18:58:57

标签: excel vba

我正在开展一个更大的项目,涉及制作一个包含多达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行,代码运行完全正常。我可能没有正确处理这个,但我试图创建一个数组来保存图表对象。

2 个答案:

答案 0 :(得分:0)

观察ChartTypeChart对象的成员,而不是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,我总是添加一个图表并填充并格式化,然后添加下一个图表。否则它太复杂,记账太多,我总是害怕太多可能出错。