我有一个非常简单的数据集。当我在最后添加数据时,我想在我的图表中自动获取数据。
例如:
此时,图表表中存在数据源" A1:Q10"。在Datascource所在的工作表中输入一些值后,它应该更改为A1:R10。
但它确实起作用。这里的代码最终在
"应用程序或对象定义的错误"
Sheets("_Chartsheet-sheet").Select
Activesheet.Chartobjects(1).Activate
ActiveChart.SetSourceDate Source:=Range("A10:" & ActualLetter & "10")
答案 0 :(得分:0)
作为ashleedawg noted,SetSourceDate
不是Chart
类的成员 - 使用Option Explicit
和VBE的 IntelliSense &自动完成将有助于防止这些。把它写成拼写错误,代码还有另一个问题......
Source:=Range("A10:" & ActualLetter & "10")
Range
是不合格的,如果该代码是用标准代码模块编写的,它隐含地引用了ActiveSheet
的任何内容 - 在这种情况下......
Sheets("_Chartsheet-sheet").Select
...图表工作表,不是Worksheet
,因此没有Range
属性。
明确的无条件Range
电话,内容如下:
[_Global].Range("address")
解决方案是使用您要使用的Range
对象实例正确限定Worksheet
调用 - 假设为Sheet1
:
Source:=Sheet1.Range("address")
Sheet1
是一个全局范围的Worksheet
对象,您可以免费获得该对象,因为您的工作表在编译时存在。在VBE的 Project Explorer 中选择“Microsoft Excel Objects”下的工作表,然后查看其属性(F4):您会注意到它具有Name
属性,其值对应于它的“选项卡名称”(您用于按名称获取工作表的名称),但它也有一个(Name)
属性,其值与其“代码名称”相对应 - 这是VBA用于的标识符在需要引用该工作表时,生成可以(并且应)在代码中的任何位置使用的自由全局范围对象变量。
通过名称从Sheets
或Worksheets
集合中获取该对象会使您的代码处于危险之中:除非工作簿结构受到保护,否则用户可以随时更改该“选项卡名称”,并且将打破代码中的每个Worksheets("name")
调用。
如果代码是在工作表的代码隐藏中编写的,那么非限定Range
调用将隐含地引用该工作表。在这种情况下,使用Range
明确限定Me
会使代码更明确地显示其意图。
最后,此处不需要.Select
和.Activate
。 Avoid Select and Activate,它的宏录制器代码与代码一样脆弱。相反,使用对象引用 - 这里我假设代码是在源表的代码隐藏中编写的,因此Me
前面的Range
限定符:
Dim chartSheet As Chart
Set chartSheet = ThisWorkbook.Sheets("_Chartsheet-sheet")
chartSheet.SetSourceData Source:=Me.Range("A10:" & ActualLetter & "10")