繁体   English   中英

使用Excel VBA更改图表对象

[英]Changing a chart object with 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行的情况下运行得很好。 我可能无法正确处理此问题,但是我尝试创建一个数组来保存图表对象。

请注意, 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个图表的工作表中),要么不必要地复制了一堆额外的图表。 您需要解决该问题。

或者,将ChartObjects.AddChart属性链接起来,例如:

Set Charts(graphIndex) = ActiveSheet.ChartObjects.Add(Left:=chartTopLeftX, Top:=chartTopLeftY, Width:=chartWidth, Height:=chartHeight).Chart

但是,我认为与其使用恒定的Charts作为Charts集合的索引成员,还不如将其用作对象变量的最佳方法。 如果您不喜欢使用ChartObject ,只需结合上面的两个方法即可:

Dim cht as Chart
Set cht = ActiveSheet.ChartObjects.Add( _
    Left:=chartTopLeftX, _
    Top:=chartTopLeftY, _
    Width:=chartWidth, _
    Height:=chartHeight).Chart
cht.Parent.Name = activeSheetName & graphIndex
cht.ChartType = xlXYScatter

以@ 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,我总是添加一个图表并填充并设置其格式,然后添加下一个图表。 否则,它太复杂了,簿记太多了,我总是担心太多会出错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM