【问题标题】:Add data series fails when using range使用范围时添加数据系列失败
【发布时间】:2017-09-03 02:22:27
【问题描述】:

我有以下循环尝试为一系列列附加数据系列:

Do Until wb.Worksheets("RTS Raw Data").Cells(1, k) = ""
  Set c1 = Cells(3, k)
  Set c2 = Cells(lr, k)
  ActiveChart.SeriesCollection.Add Source:=wb.Worksheets("RTS Raw Data").Range(Cells(3, k), Cells(lr, k))
  ActiveChart.SeriesCollection(11 + k).XValues = wb.Worksheets("RTS Raw Data").Range("B3:B" & lr)
  ActiveChart.SeriesCollection(11 + k).Name = wb.Worksheets("RTS Raw Data").Cells(2, k)

  If (wb.Worksheets("RTS Raw Data").Cells(3, k) = "-999") Then
    mcwb.Shapes("CheckBox" & 8 + k).TextFrame.Characters.Text = "Unused"
  Else
    mcwb.Shapes("CheckBox" & 8 + k).TextFrame.Characters.Text = wb.Worksheets("RTS Raw Data").Cells(2, k)
  End If

  ActiveChart.SeriesCollection(11 + k).AxisGroup = xlPrimary

  k = k + 1
Loop

代码在ActiveChart.SeriesCollection.Add Source:=wb.Worksheets("RTS Raw Data").Range(Cells(3, k), Cells(lr, k)) 上失败,但在使用.Range("E3:E" & lr) 时不会失败。

提前致谢。

【问题讨论】:

  • 代码运行时RTS Raw Data是活动表吗? .Range 正在查看 RTS Raw Data 但范围定义内的单元格正在查看当前活动的工作表。您需要将具有工作表名称的人员限定为 - 搜索 With... End With 以缩短代码。

标签: vba excel range worksheet


【解决方案1】:

看起来 ActiveChart 不在 RTS Raw Data 上。

在您的代码中,Range 被定义为在RTS Raw Data 上,但Cells 的两次出现不符合工作表,因此它使用的是活动表。
ActiveChart.SeriesCollection.Add Source:=wb.Worksheets("RTS Raw Data").Range(Cells(3, k), Cells(lr, k))

尝试使用With...End With 块来缩短您的代码:

With wb.Worksheets("RTS Raw Data")
    ActiveChart.SeriesCollection.Add Source:=.Range(.Cells(3, k), .Cells(lr, k))
End With

这和写法一样:

 ActiveChart.SeriesCollection.Add Source:=wb.Worksheets("RTS Raw Data").Range(wb.Worksheets("RTS Raw Data").Cells(3, k), wb.Worksheets("RTS Raw Data").Cells(lr, k))  

https://msdn.microsoft.com/en-us/library/wc500chb.aspx

【讨论】:

    【解决方案2】:

    为了使所有对象(RangeCells)都符合“RTS 原始数据”表,请使用 With wb.Worksheets("RTS Raw Data") 并在下面使用 . 嵌套所有对象(代码也更清晰眼睛,而且更短)。

    另外,如果你定义了Dim Ser As Series,它也会对你以后的编码和调试有很大帮助。

    试试下面的代码:

    Dim Ser As Series
    
    With wb.Worksheets("RTS Raw Data")
        Do Until .Cells(1, k) = ""
            Set c1 = .Cells(3, k)
            Set c2 = .Cells(lr, k)
    
            Set Ser = ActiveChart.SeriesCollection.Add ' <-- set Series to a variable, easier to code and debug later
            Ser.Values = .Range(.Cells(3, k), .Cells(lr, k))
            Ser.XValues = .Range("B3:B" & lr)
            Ser.Name = .Cells(2, k)
    
            If .Cells(3, k) = "-999" Then
                mcwb.Shapes("CheckBox" & 8 + k).TextFrame.Characters.Text = "Unused"
            Else
                mcwb.Shapes("CheckBox" & 8 + k).TextFrame.Characters.Text = .Cells(2, k)
            End If
    
            Ser.AxisGroup = xlPrimary
            k = k + 1
        Loop
    End With
    

    【讨论】:

    • 当我运行你的代码时,我得到Run-time error '450': Wrong number of arguments or invalid property assignment。这发生在Set Ser = ActiveChart.SeriesCollection.Add
    • @charwayne 在哪一行?
    • 我编辑了我的最后一个回复,包括在我看到你要求之前包含哪一行
    • @charwayne 您是否还添加了定义它的行?将 Ser 作为系列?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2018-08-03
    • 2017-02-06
    • 1970-01-01
    • 2020-09-13
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多