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

时间:2018-03-19 15:21:20

标签: excel vba charts

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

例如:

此时,图表表中存在数据源" A1:Q10"。在Datascource所在的工作表中输入一些值后,它应该更改为A1:R10。

但它确实起作用。这里的代码最终在

  

"应用程序或对象定义的错误"

Sheets("_Chartsheet-sheet").Select
Activesheet.Chartobjects(1).Activate
ActiveChart.SetSourceDate Source:=Range("A10:" & ActualLetter & "10")

1 个答案:

答案 0 :(得分:0)

作为ashleedawg notedSetSourceDate不是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用于的标识符在需要引用该工作表时,生成可以(并且)在代码中的任何位置使用的自由全局范围对象变量。

通过名称从SheetsWorksheets集合中获取该对象会使您的代码处于危险之中:除非工作簿结构受到保护,否则用户可以随时更改该“选项卡名称”,并且将打破代码中的每个Worksheets("name")调用。

如果代码是在工作表的代码隐藏中编写的,那么非限定Range调用将隐含地引用该工作表。在这种情况下,使用Range明确限定Me会使代码更明确地显示其意图。

最后,此处不需要.Select.ActivateAvoid Select and Activate,它的宏录制器代码与代码一样脆弱。相反,使用对象引用 - 这里我假设代码是在源表的代码隐藏中编写的,因此Me前面的Range限定符:

Dim chartSheet As Chart
Set chartSheet = ThisWorkbook.Sheets("_Chartsheet-sheet")
chartSheet.SetSourceData Source:=Me.Range("A10:" & ActualLetter & "10")