【问题标题】:Excel 2003 vba chart failedExcel 2003 vba 图表失败
【发布时间】:2013-04-11 21:29:49
【问题描述】:

所以我收到一个图表失败错误,似乎是因为我的名字 WBname 但我无法弄清楚。早些时候有一个类似的问题,但由于这有点不同,我想我会提出一个新问题。这是我遇到问题的代码:

Dim WBname As String
WBname = Replace(ActiveWorkbook.Name, ".xls", "")
Worksheets(WBname).Activate
Charts.Add
ActiveChart.ChartType = xlXYScatterSmoothNoMarkers
ActiveChart.SeriesCollection(1).XValues = Worksheets(WBname).Range("A4:A5000")
ActiveChart.SeriesCollection(1).Values = Worksheets(WBname).Range("B4:B5000")
ActiveChart.SeriesCollection(1).Name = Worksheets(WBname).Range("B3")
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(2).XValues = Worksheets(WBname).Range("A4:A5000")
ActiveChart.SeriesCollection(2).Values = Worksheets(WBname).Range("C4:C5000")
ActiveChart.SeriesCollection(2).Name = Worksheets(WBname).Range("C3")
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(3).XValues = Worksheets(WBname).Range("A4:A5000")
ActiveChart.SeriesCollection(3).Values = Worksheets(WBname).Range("D4:D5000")
ActiveChart.SeriesCollection(3).Name = Worksheets(WBname).Range("D3")
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(4).XValues = Worksheets(WBname).Range("A4:A5000")
ActiveChart.SeriesCollection(4).Values = Worksheets(WBname).Range("I4:I5000")
ActiveChart.SeriesCollection(4).Name = Worksheets(WBname).Range("I3")

WBname 如我所愿,但我仍然收到错误。

Method 'SeriesCollection' of object '_Chart' Failed

工作表名称是动态变化的,并且与 WBname 仅供参考。

编辑:我添加了

ActiveChart.SetSourceData Source:=Sheets(WBname).Range("A4:A5000") 

它似乎有效

【问题讨论】:

  • 错误是什么?!?!?!
  • 我得到对象'_Chart'的方法'SeriesCollection'失败
  • 我添加了 ActiveChart.SetSourceData Source:=Sheets(WBname).Range("A4:A5000") 现在似乎可以工作,但我不明白为什么

标签: excel vba charts excel-2003


【解决方案1】:

您收到该错误是因为您尝试将值分配给不存在的系列;)

您需要先添加系列,然后为其分配值。看这个例子

Sub Sample()
    Dim WBname As String
    WBname = Replace(ActiveWorkbook.Name, ".xls", "")
    Worksheets(WBname).Activate

    Charts.Add
    ActiveChart.ChartType = xlXYScatterSmoothNoMarkers

    ActiveChart.SeriesCollection.NewSeries '<~~~~~ SEE THIS

    ActiveChart.SeriesCollection(1).XValues = Worksheets(WBname).Range("A4:A5000")
    ActiveChart.SeriesCollection(1).Values = Worksheets(WBname).Range("B4:B5000")
    ActiveChart.SeriesCollection(1).Name = Worksheets(WBname).Range("B3")
End Sub

跟进

您将获得额外的系列 sometimes,因为您的光标位于数据中,例如单元格 B5I10 或其他单元格中。在这种情况下,当您说Charts.Add 时,Excel 默认会添加系列。确保在运行宏时未选择任何数据。另一种方法是删除Charts.Add 之后的系列集合。看这个例子

Sub Sample()
    Dim WBname As String
    Dim i As Long

    WBname = Replace(ActiveWorkbook.Name, ".xls", "")
    Worksheets(WBname).Activate
    Charts.Add

    With ActiveChart
        On Error Resume Next
        For i = .SeriesCollection.Count To 1 Step -1
            .SeriesCollection(i).Delete
        Next i
        On Error GoTo 0

        .ChartType = xlXYScatterSmoothNoMarkers

        .SeriesCollection.NewSeries
        .SeriesCollection(1).XValues = Worksheets(WBname).Range("A4:A5000")
        .SeriesCollection(1).Values = Worksheets(WBname).Range("B4:B5000")
        .SeriesCollection(1).Name = Worksheets(WBname).Range("B3")

        .SeriesCollection.NewSeries
        .SeriesCollection(2).XValues = Worksheets(WBname).Range("A4:A5000")
        .SeriesCollection(2).Values = Worksheets(WBname).Range("C4:C5000")
        .SeriesCollection(2).Name = Worksheets(WBname).Range("C3")

        .SeriesCollection.NewSeries
        .SeriesCollection(3).XValues = Worksheets(WBname).Range("A4:A5000")
        .SeriesCollection(3).Values = Worksheets(WBname).Range("D4:D5000")
        .SeriesCollection(3).Name = Worksheets(WBname).Range("D3")

        .SeriesCollection.NewSeries
        .SeriesCollection(4).XValues = Worksheets(WBname).Range("A4:A5000")
        .SeriesCollection(4).Values = Worksheets(WBname).Range("I4:I5000")
        .SeriesCollection(4).Name = Worksheets(WBname).Range("I3")
    End With
End Sub

【讨论】:

  • 当我使用它时,我会添加一个没有数据的额外数据系列
  • 对不起,我没听懂你刚才说的话。
  • 当我将 ActiveChart.SeriesCollection.NewSeries 添加到我的代码中时,我有一个第 5 个系列(应该只有 4 个)。但是当我把它拿出来时,我应该只有 4 个系列。不过我可能做错了什么
  • 您的问题中发布的代码并未显示您有任何系列(您说有 4 个?)您正在使用Charts.Add,然后直接将值分配给不存在的系列集合...
  • 我更新了上面的代码以反映代码的剩余部分
【解决方案2】:

您并没有告诉您要处理哪个工作表。 (假设确实需要 Workbook,但大多数情况下并非如此):

Workbooks(WBname).Sheets("Sheet1").Range("A4:A5000")

应该会更好。

(在这种情况下,只需使用宏记录器来获取正确的执行方式,然后根据您的需要进行调整)

【讨论】:

  • 我不能使用 sheet1,因为工作表名称会动态变化并且工作表名称与 WBname 匹配
  • 嗯...使用 Workbooks(WBname).Sheets(1) 或 Workbooks(WBname).Sheets(WBName)
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多