excel - 如何使用 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
有人可以帮忙吗?
谢谢!
解决方案
不得不重新编写代码,但现在很好:
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,一切顺利。
推荐阅读
- python - 我不知道如何使用 Tweepy;你能告诉我吗?
- anylogic - Anylogic,使用不同的时间单位
- vba - Excel VBA:错误 1004 vlookup '无法获取 Vlookup 属性'
- google-bigquery - BigQuery:在自定义分区字段上运行 Select 时处理的数据
- javascript - JavaScript 本地存储在 Chrome 和 Edge 中被删除,但在 Firefox 中没有
- ember-cli - Ember:未捕获的错误:找不到模块“apollo-cache”
- javascript - 动态使用 React Flow
- docker-compose - 如何将现有的简单机器论坛 (SMF) 安装移动到 docker-compose?
- loops - 在python中迭代字典的键和值
- r - 在 R 中加载 lmSupport 包的问题