我正在尝试使用VBA向图表添加许多系列,如下面的代码所示。
For i = 0 To 9
Set serNew = chtMap.SeriesCollection.NewSeries
With serNew
.XValues = Range("Y4").Cells(1, 1 + 2 * i).Resize(32000, 1)
.Values = Range("Y4").Cells(1, 2 + 2 * i).Resize(32000, 1)
End With
Next i
某些系列的范围在其单元格中尚无数据;用户稍后将写入/加载此数据。我们的想法是让图表做好准备。
问题:当循环达到如此空的范围时,我收到错误1004:无法设置Series类的XValues属性。为什么并且有办法解决这个问题?
奇怪的是,在图表菜单中手动执行此操作 - > |源数据......完美无缺。实际上,如果您在手动执行此操作时录制宏,结果如下:
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(4).XValues = "=Sheet2!R4C31:R32003C31"
ActiveChart.SeriesCollection(4).Values = "=Sheet2!R4C32:R32003C32"
但重新播放此宏时Excel会出错!
手动执行此操作并不是一个令人愉快的前景。我想我可以在单元格中粘贴假数据,创建系列,然后删除假数据。我是否真的必须拉这样的诱饵并打开Excel?
答案 0 :(得分:1)
您可以尝试复制范围(两列),并使用paste special将其添加到图表中:
TwoColumnRange.Copy
chtMap.SeriesCollection.Paste Rowcol:=xlColumns, SeriesLabels:=False, _
CategoryLabels:=True, Replace:=False, NewSeries:=True
答案 1 :(得分:0)
我建议(就像我自己一样)在某处隐藏一些虚假数据并将所有系列默认指向那里。同时使用.LineStyle=xlNone
和.MarkeStyle=xlNone
甚至ActiveChart.Legend.LegendEntries(i).Delete
隐藏图表中的系列。然后,当客户填写数据时,运行一个宏来替换系列指向的位置,并设置行/标记样式,以及ActiveChart.HasLegend = True
来重新创建图例条目。事实上,我必须关闭传奇然后再打开才能正确重置。
答案 2 :(得分:0)
我决定添加一个工作表按钮来调用一个sub,可以在输入数据后添加系列。它还会在实际添加每个系列之前检查各种范围是否为空。这感觉就像最干净的解决方案。
答案 3 :(得分:0)
老问题但是......
我刚刚编写了这段代码,并在Excel 2010和2016中进行了测试。它为现有的XY散点图添加了一个新系列,新系列公式链接到用于.Name,.Values和.XValues的空白范围:
Sub AddBlankSeries()
Dim srs As Series
Set srs = ActiveChart.SeriesCollection.NewSeries
With srs
.Name = "=" & ActiveSheet.Range("E2").Address(, , , True)
.Values = ActiveSheet.Range("E3:E8")
.XValues = ActiveSheet.Range("D3:D8")
End With
End Sub
然后我回到原始代码:
Sub AddSeveralBlankSeries()
Dim i As Long
Dim chtMap As Chart
Dim serNew As Series
Set chtMap = ActiveSheet.Shapes.AddChart(xlXYScatterLines).Chart
For i = 0 To 9
Set serNew = chtMap.SeriesCollection.NewSeries
With serNew
.XValues = Range("Y4").Cells(1, 1 + 2 * i).Resize(32000, 1)
.Values = Range("Y4").Cells(1, 2 + 2 * i).Resize(32000, 1)
End With
Next i
End Sub
这也运行良好,系列引用了工作表中的预期范围。
所以我不知道问题是什么。