Excel VBA 更新图表系列

Posted

技术标签:

【中文标题】Excel VBA 更新图表系列【英文标题】:Excel VBA Updating Chart Series 【发布时间】:2017-10-04 12:05:25 【问题描述】:

我有一个将范围复制到某个单元格并将数据源更改为图表的代码。该图表具有组合图表类型,具有堆叠列和xlLineMarker 与最后一个系列(总计)。系列集合的数量根据用户选择(2个或更多)而有所不同。

它可以工作,但有时图表不会像所附图像那样完全更新(显示系列名称为“series1,series2,...”的空图表)。发生这种情况时,右键单击图表并单击选择数据,然后只需选择 series1 以外的任何系列即可更新图表。不刷新或重新分配数据源。只需在数据选择窗口中选择“series2”或其他,然后单击“取消”,我怀疑宏没有完全执行...,

我做错了吗?或者有什么方法可以完全更新图表?

Sub chtupdate()

    Dim rng As Range
    Dim i As Integer
    Dim n As Integer

    Set rng = Range("G37").CurrentRegion

    ActiveSheet.ChartObjects("Chart1").Activate
    With ActiveChart
        .ChartArea.ClearContents
        .SetSourceData Source:=rng, PlotBy:=xlRows

        n = ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Count                
        For i = 1 To n - 1
            .SeriesCollection(i).ChartType = xlColumnStacked
        Next i    

        .SeriesCollection(n).ChartType = xlLineMarkers
    End With

End Sub

【问题讨论】:

“我怀疑宏没有完全执行” -- 你为什么不通过调试器来验证呢? atm 我想到的唯一建议是 1) 不是Activate 图表(不需要); 2) 在宏期间禁用屏幕更新; 3)由于您在With clause 内,请将n = ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Count 替换为更简单的n = .SeriesCollection.Count @Danny Yun 在下面我的答案中尝试代码 感谢您的评论。我已经摆脱了激活图表。我确实有代码可以在下面的代码之间禁用和启用屏幕更新代码。我只是没有在这里添加。根据您的建议,我在调试器中使用了“Step In”。问题仍然存在。它起初有效,但第二次失败。我不确定为什么它有时会起作用而不起作用。并感谢有关“.SeriesCollection.Count”的提示。是的,它更干净。无论如何,问题仍然存在。 【参考方案1】:

试试下面的代码,我添加了ChartObjectSeries 对象变量以获得更简单和“更干净”的代码。另外,为了避免使用ActiveSheetActiveChart - 一种不可靠的方法。

代码

Option Explicit

Sub chtupdate()

Dim MyCht       As ChartObject
Dim Ser         As Series

Dim Rng As Range
Dim i As Long
Dim n As Long

' fully qualify all your Ranges and Cells
With Worksheets("Sheet3") ' <-- replace "Sheet1| with your sheet's name
    Set Rng = .Range("G37").CurrentRegion

    ' set the chart object
    Set MyCht = .ChartObjects("Chart1")
End With

With MyCht
    .Chart.ChartArea.ClearContents
    .Chart.SetSourceData Source:=Rng, PlotBy:=xlRows

    For Each Ser In .Chart.SeriesCollection
        Ser.ChartType = xlColumnStacked
    Next Ser

    ' modify the last one
    Set Ser = .Chart.SeriesCollection(.Chart.SeriesCollection.Count)
    Ser.ChartType = xlLineMarkers
End With

End Sub

【讨论】:

谢谢。但它仍然是一样的。我有一张带有一张数据透视表、一张普通表(在转置视图中复制的数据透视表)、一张图表的多张工作表。我将数据透视表复制到常规表的原因是数据透视图在 Mac Excel 中不起作用。所以我将数据透视表复制到选定的范围,并将这个复制的范围设置为图表数据源。 每张工作表都有一个或多个下拉按钮。通过选择这些下拉按钮,数据透视表得到更新(删除现有行字段并将选定字段添加到行字段/删除现有值项将选定值项添加到值字段/删除现有列字段并将选定字段添加到列字段)。 所以,我有一个代码 addRow()、addColumn() 和 addValue()。这些代码分配给“下拉”按钮。然后,一旦数据透视表得到更新,我就会在 Worksheet_PivotTableUpdate 事件中调用 copyPivotTable() 和 chtupdate() 代码。我使用此事件触发“chtupdate”的原因是切片器。我正在使用切片器进行过滤,但我无法将宏分配给切片器,因此我使用数据透视表更新事件。这是我使用 ActiveSheet 而不是工作表名称的原因之一。 (在 Mac 上,工作表事件不起作用,所以我又添加了一个按钮来执行“复制枢轴”和“chtupdate”) 顺便说一句,您更新图表的代码非常干净。谢谢你。但它仍然做同样的事情。当我将下拉列表从一个切换到另一个时,它会起作用。但它有时也有同样的问题。它会完全更新图表,有时会显示带有“series1”、“series2”......的空白图表,如果我再次打开选择数据弹出窗口并选择“series1”以外的系列,则图表会完全更新。

以上是关于Excel VBA 更新图表系列的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Excel 2007 VBA 中使用 Option Strict Off 进行后期绑定

Excel EXCEL中怎样用VBA来写图表

准时下班系列!Excel合集之第3集—VBA怎么做双条件受控动态图表

VBA:使用默认颜色提取图表中线条的 RGB 值

更改 excel 图表图例颜色而不影响系列

VBA Excel - 访问查询不可更新