Excel VBA根据参考值更改数据源

我无法弄清楚如何用VBA来更改数据透视表的数据源。

我有Sheet 1中的数据源和Sheet 2中的数据透视表

Sheets("Sheet1").Select LastRow = ActiveSheet.Range("A1").Offset(ActiveSheet.Rows.count - 1, 0).End(xlUp).Row sNewSource = ActiveSheet.Name & "!" & Range("A19:X" & LastRow).Address(ReferenceStyle:=xlR1C1) ActiveSheet.PivotTables("PivotTable1").ChangePivotCache _ ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _ SourceData:=sNewSource, Version:=xlPivotTableVersion14) 

此刻我收到错误消息:无法正确获取Worksheet类的数据透视表

我试着看其他的解决scheme,但我不知道它不工作。

有任何想法吗?

这不是对你的问题的直接回答,更多的是解释如何做得更好的机会。

所有这些选项都涉及创build一个命名的范围表名称 ,您将使用该名称作为数据透视表的数据源

选项1

为您的数据命名一个范围,并让VBA更新该命名范围

 With ThisWorkbook.Names.Item("myRange") .RefersTo = Range(.RefersToRange, .RefersToRange.End(xlDown)) End With 

选项2

给你的数据一个dynamic的命名范围 。 源参考可能如下所示:

 =OFFSET(A1,,,COUNTA(A:A),COUNTA(1:1)) 

请注意, OFFSET是一个易失性函数,会减慢更大的工作簿

选项3

把你的数据放入数据表 。 当您将数据格式化为表格时,当您在下面添加新数据时,Excel将自动resize

使用SelectActiveSheet时经常出现问题。 当Sheet1上可能没有数据透视表(如上所述,数据透视表在Sheet2上)时,您试图访问Sheet1上的数据透视表。

这可以通过完全限定您的参考资料来解决 – 这意味着明确指出您希望使用哪个工作簿和哪个工作表。

考虑到这一点,这是否工作? (另)

 With ThisWorkbook.Worksheets("Sheet1") LastRow = .Range("A1").Offset(.Rows.count - 1, 0).End(xlUp).Row sNewSource = .Name & "!" & .Range("A19:X" & LastRow).Address(ReferenceStyle:=xlR1C1) End With With ThisWorkbook.Worksheets("Sheet2") .PivotTables("PivotTable1").ChangePivotCache .PivotCaches.Create(SourceType:=xlDatabase, SourceData:=sNewSource, Version:=xlPivotTableVersion14) End With 

感谢所有的build议。 最后,我设法使它与以下代码一起工作:

 Sheets("Sheet1").Select ' Data Source LastRow = ActiveSheet.Range("A1").Offset(ActiveSheet.Rows.Count - 1, 0).End(xlUp).Row sNewSource = ActiveSheet.Name & "!" & Range("A1:B" & LastRow).Address(ReferenceStyle:=xlR1C1) sNewSource = "C:\xxx\[test.xlsm]" & sNewSource Sheets("Sheet2").Select ' Pivot Table ActiveSheet.PivotTables("PivotTable1").ChangePivotCache ActiveWorkbook. _ PivotCaches.Create(SourceType:=xlDatabase, SourceData:=sNewSource, Version:= _ xlPivotTableVersion14)