在Excel图表上添加一个空系列

时间:2011-04-06 19:01:20

标签: excel vba excel-vba charts series

我正在尝试使用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?

4 个答案:

答案 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

这也运行良好,系列引用了工作表中的预期范围。

所以我不知道问题是什么。