我正在编写一个脚本来解析数据文件,对数据进行一些分析,并显示一些图表;我遇到了这个怪癖。我在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?
的替代品答案 0 :(得分:0)
在.Select
和Set 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