1

我正在尝试使用 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 属性。为什么以及有没有办法解决这个问题?

奇怪的是,在 Chart 菜单中手动执行此操作 --> |Source Data... 工作得非常好。实际上,如果您在手动执行此操作的同时录制宏,结果如下:

ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(4).XValues = "=Sheet2!R4C31:R32003C31"
ActiveChart.SeriesCollection(4).Values = "=Sheet2!R4C32:R32003C32"

但是当重新播放此宏时,Excel 会出错!

手动执行此操作不是一个令人愉快的前景。我想我可以在单元格中粘贴虚假数据,创建系列,然后删除虚假数据。我真的必须拉这样的诱饵并打开Excel吗?

4

4 回答 4

1

您可以尝试复制范围(两列),并使用特殊粘贴将其添加到图表中:

TwoColumnRange.Copy
chtMap.SeriesCollection.Paste Rowcol:=xlColumns, SeriesLabels:=False, _
    CategoryLabels:=True, Replace:=False, NewSeries:=True
于 2011-04-12T12:37:14.290 回答
0

我建议(就像我自己做的那样)在某处隐藏一些虚假数据,并让所有系列默认指向那里。.LineStyle=xlNone还可以使用and.MarkeStyle=xlNone和 even隐藏情节中的系列ActiveChart.Legend.LegendEntries(i).Delete。然后,当客户填写数据时,运行一个宏来替换系列点的位置,设置线条/标记样式,以及ActiveChart.HasLegend = True重新创建图例条目。如果事实是我必须关闭图例然后再次打开才能正确重置。

祝你好运。

于 2011-04-06T20:31:59.147 回答
0

我决定添加一个工作表按钮,该按钮调用一个可以在输入数据添加系列的子程序。它还在实际添加每个系列之前检查各种范围是否为空。这感觉像是最干净的解决方案。

于 2011-04-12T16:57:38.063 回答
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

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

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

于 2016-10-18T13:39:51.933 回答