更改图表工作表的数据源(无嵌入工作表)



我有一个数据集非常简单。当我在末尾添加数据时,我想在我的图表表中自动获取它。

例如:

此时,图表工作表存在数据源"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 用于生成免费全局范围对象变量的标识符可以(并且应该)在需要引用该工作表时在代码中的任何位置使用。

按名称从SheetsWorksheets集合中获取该对象会使代码面临风险:除非工作簿结构受到保护,否则用户可以随时更改该"选项卡名称",这将中断代码中的每个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")

最新更新