Charts.Add方法会导致FormulaR1C1出现意外结果

时间:2014-01-23 08:18:37

标签: excel-vba vba excel

我正在编写一个脚本来解析数据文件,对数据进行一些分析,并显示一些图表;我遇到了这个怪癖。我在Excel 2010(Microsoft Office Professional Plus)中使用VBA7。

需要大量搜索,但似乎在调用Charts.Add方法后出现问题。在该调用之后对单元格的FormulaR1C1的赋值不会产生我期望的结果。在下面的代码中,我希望单元格E3中的=R[0]C[-1] - R[-1]C[-1]转换为=D3-D2。相反,我得到=XFD1 - XFD1048576

删除新创建的图表可恢复预期的行为。这不是一个理想的解决方案。

Option Explicit
Sub main()

Dim x As Double
Dim ch As Chart

With ThisWorkbook.Sheets("Sheet1")
    'some data to work on
    .Cells(1, 1).Value = "Charts.Add free"
    .Cells(1, 4).Value = "Charts.Add called"
    .Cells(1, 7).Value = "Chart.Delete called"
    For x = 2 To 10
        .Cells(x, 1).Value = Sin(x)
        .Cells(x, 4).Value = Sin(x)
        .Cells(x, 7).Value = Sin(x)
    Next x

    'Desired behavior
    .Cells(3, 2).FormulaR1C1 = "=R[0]C[-1] - R[-1]C[-1]"
    .Cells(3, 2).AutoFill Destination:=.Range(.Cells(3, 2), .Cells(10, 2))

    'after Charts.Add is called, undesired behavior
    Set ch = ThisWorkbook.Charts.Add
    .Cells(3, 5).FormulaR1C1 = "=R[0]C[-1] - R[-1]C[-1]"
    .Cells(3, 5).AutoFill Destination:=.Range(.Cells(3, 5), .Cells(10, 5))

    'after that chart is deleted, desired behavior resumes
    ch.Delete
    .Cells(3, 8).FormulaR1C1 = "=R[0]C[-1] - R[-1]C[-1]"
    .Cells(3, 8).AutoFill Destination:=.Range(.Cells(3, 8), .Cells(10, 8))
End With
End Sub

我能够用上面的代码重现这个怪癖。自动填充语句对于演示不需要的行为并不是必需的。但是他们说明了我为什么要使用相对引用而不是绝对引用。

我想我可以通过使用A1参考样式解决我的数据解析脚本中的这个错误。但是,使用R1C1比将列字母转换为数字更容易(也更易读)。

另一种解决方法是简单地等到数据解析结束时再进行。分析循环来创建图表。但是我必须做更多的记录保存(因为我需要使用第二个循环中第一个循环的信息)。

这只是VBA的一个怪癖还是我在这里误解了什么?我肯定会承认我对R1C1很新,但为什么图表与excel如何将R1C1转换为A1引用有关?在使用Charts.Add(除了Chart.Delete!)之外,我应该做些什么“清理”吗?或者也许是Charts.Add?

的替代品

1 个答案:

答案 0 :(得分:0)

.SelectSet ch = ThisWorkbook.Charts.Add之间添加.Cells(3, 5).FormulaR1C1 = "=R[0]C[-1] - R[-1]C[-1]"语句。添加新图表后,它会创建一个新选项卡,然后是活动工作表。要重新激活Sheet1,您需要.Select

请参阅下面的新代码。



Option Explicit
Sub main()

Dim x As Double
Dim ch As Chart

With ThisWorkbook.Sheets("Sheet1")
    'some data to work on
    .Cells(1, 1).Value = "Charts.Add free"
    .Cells(1, 4).Value = "Charts.Add called"
    .Cells(1, 7).Value = "Chart.Delete called"
    For x = 2 To 10
        .Cells(x, 1).Value = Sin(x)
        .Cells(x, 4).Value = Sin(x)
        .Cells(x, 7).Value = Sin(x)
    Next x

    'Desired behavior
    .Cells(3, 2).FormulaR1C1 = "=R[0]C[-1] - R[-1]C[-1]"
    .Cells(3, 2).AutoFill Destination:=.Range(.Cells(3, 2), .Cells(10, 2))

    'after Charts.Add is called, undesired behavior
    Set ch = ThisWorkbook.Charts.Add
    .Select   'This statement re-activates 'Sheet1'
    .Cells(3, 5).FormulaR1C1 = "=R[0]C[-1] - R[-1]C[-1]"
    .Cells(3, 5).AutoFill Destination:=.Range(.Cells(3, 5), .Cells(10, 5))

    'after that chart is deleted, desired behavior resumes
    ch.Delete
    .Cells(3, 8).FormulaR1C1 = "=R[0]C[-1] - R[-1]C[-1]"
    .Cells(3, 8).AutoFill Destination:=.Range(.Cells(3, 8), .Cells(10, 8))
End With
End Sub