首页 > 解决方案 > 如何使用 VBA 动态更新散点图系列?

问题描述

我有一个包含大约 30 个图表的工作表,我想使用 VBA 宏动态更新。我在处理这个系列时遇到了一些问题,但我无法找出问题所在。

代码应该运行几个图表(以下代码中只有 3 个),清除旧内容,并添加 6 个新系列,其中数据取自电子表格。相反,它不会删除旧系列,而是在每次运行时再次添加一个新系列,然后在第 22 行以“参数无效”错误退出。我一直在努力解决这个问题现在几周了,最令人沮丧的部分是代码基本上是来自另一个项目的复制+粘贴,效果很好。

这是代码:

Public Sub Refresh_NB_Graphs()

    Dim cht As Chart
    Dim chtObj As ChartObject
    Dim vi As Integer
    Dim s As Object
    Dim j As Integer
    Dim k As Integer
    Dim seriesIndex As Integer
    Dim xRange As Range
    Dim yRange As Range

    'Application.ScreenUpdating = False
    On Error GoTo Errorcatch

    'Graph fetching and update cycle
    For vi = 1 To 3
        Set chtObj = Sh_NBGain.ChartObjects("Ch_Gain_Vs" & CStr(vi))
        Set cht = chtObj.Chart
        ' Adding or removing this section makes no difference -------
        For Each s In cht.SeriesCollection
            s.Delete
        Next s
        ' -----------------------------------------------------------
        cht.ChartArea.ClearContents
        'Format Font Type and Size
        cht.ChartType = xlXYScatterLinesNoMarkers                                   ' scatter plot
        cht.ChartArea.Format.TextFrame2.TextRange.Font.Name = "Arial"
        cht.ChartArea.Format.TextFrame2.TextRange.Font.Size = 14
        cht.HasTitle = False      ' No chart title
        ' Add series: data origin in Sh_NBGainProcess
        seriesIndex = 0
        For j = 0 To 5
                seriesIndex = seriesIndex + 1
                cht.SeriesCollection.NewSeries
1               cht.SeriesCollection(seriesIndex).Name = CStr(Sh_Vars.Range("A8").Offset(j, 0).Value)
                Set xRange = Sh_NBGainProcess.Range("C42:C1642").Offset(1600 * (vi - 1), 20 * j)
                Set yRange = Sh_NBGainProcess.Range("D42:D1642").Offset(1600 * (vi - 1), 20 * j)
10              cht.SeriesCollection(seriesIndex).XValues = "='" & Sh_NBGainProcess.Name & "'!" & xRange.Address
20              cht.SeriesCollection(seriesIndex).Values = "='" & Sh_NBGainProcess.Name & "'!" & yRange.Address
22              With cht.SeriesCollection(seriesIndex)
23                  Debug.Print seriesIndex
30                  .Format.Line.Weight = 2.25
40                  .Format.Line.Visible = msoTrue
50                  .Format.Line.ForeColor.RGB = ECOPalette(j)    ' Array with defined colors
60                  .MarkerStyle = xlMarkerStyleNone
                End With
        Next j

        '.....................

     Next vi
End Sub

有人可以帮忙吗?

谢谢!

标签: excelvbaexcel-charts

解决方案


不得不重新编写代码,但现在很好:

    Dim cht As Chart
    Dim s As Series
    Dim vi As Integer
    Dim j As Integer
    Dim xRange As Range
    Dim yRange As Range

    'Application.ScreenUpdating = False
    On Error GoTo Errorcatch

    'Graph fetching and update cycle
    For vi = 1 To 3
        ' Gain charts (Vs 1 to 3) ***********************************************************************************************************
        Set cht = Sh_NBGain.ChartObjects("Ch_Gain_Vs" & CStr(vi)).Chart
        ' Clear existing data
        For Each s In cht.SeriesCollection
            s.Delete
        Next s
        cht.ChartArea.ClearContents
        cht.ChartType = xlXYScatterLinesNoMarkers                                   ' scatter plot

        ' Add series: data origin in Sh_NBGainProcess
        For j = 0 To 5
            If Not Sh_NBGainProcess.Range("C42").Offset(1601 * (vi - 1), 20 * j).Value = "" Then
10              Set s = cht.SeriesCollection.NewSeries
40              s.Name = CStr(Sh_Vars.Range("A8").Offset(j, 0).Value)
50              Set xRange = Sh_NBGainProcess.Range("C42:C1642").Offset(1601 * (vi - 1), 20 * j)
60              Set yRange = Sh_NBGainProcess.Range("D42:D1642").Offset(1601 * (vi - 1), 20 * j)
90               s.XValues = "='" & Sh_NBGainProcess.Name & "'!" & xRange.Address
100              s.Values = "='" & Sh_NBGainProcess.Name & "'!" & yRange.Address
110              With s
130                  .Format.Line.Weight = 2.25
140                  .Format.Line.Visible = msoTrue
150                  .Format.Line.ForeColor.RGB = ECOPalette(j)
160                  .MarkerStyle = xlMarkerStyleNone
                End With
            End If
        Next j

我认为主要问题是由于使用了系列集合索引,这在某种程度上行为不端(我仍然不明白为什么)。通过在创建时直接引用系列对象,使用 Set s = cht.SeriesCollection.NewSeries,一切顺利。


推荐阅读