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