Excel 更改透视表数据源

Excel 更改透视表数据源,excel,vba,Excel,Vba,没有什么比透视表更让我对VBA感到沮丧了。我只想使用VBA为透视表指定一个数据源 Dim pvtcache As PivotCache Dim Range1 As Range ActiveSheet.PivotTables("PivotTable4").ChangePivotCache _ ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ ThisWorkbook.Worksheets("Busin

没有什么比透视表更让我对VBA感到沮丧了。我只想使用VBA为透视表指定一个数据源

Dim pvtcache As PivotCache
Dim Range1 As Range

ActiveSheet.PivotTables("PivotTable4").ChangePivotCache _
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
ThisWorkbook.Worksheets("Business Process Identification").Range("A1:Bc1693").Address(ReferenceStyle:=xlR1C1) _
, Version:=6)
我试图从SP站点打开工作簿,然后引用数据源的数据,刷新,然后关闭工作簿

我得到一个运行时错误'-2147024809',表示: 数据透视表字段名称无效。若要创建数据透视表,必须使用以列表形式组织并带有标记列的数据。如果要更改数据透视表字段的名称,必须为字段键入新名称

如果我手动将数据源更改为代码中指定的范围,则只有在运行此宏时才会出现问题

注意:现在的参考数据在同一个工作簿中,我得到了同样的错误。
注意:我没有隐藏的列或行,我所有的列标题都标记正确,这是导致此问题的常见原因。

在尝试了许多不同的方法和变体后,我发现如果您将所需的范围转换为一个表,并使用“ListObjects”,则更改数据透视表上的源数据将起作用:

Workbooks("SubLOBs").Worksheets("APQCL2").PivotTables("PivotTable4").ChangePivotCache _
Workbooks("SubLOBs").PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
ThisWorkbook.Worksheets("Business Process Identification").ListObjects("Table1"))

我不知道为什么。我不知道为什么一个名为“SourceData”的参数不能简单地引用一个范围,而必须位于一个表中并被称为listobject。透视表可以吸鸡巴

在尝试了许多不同的方法和变体之后,我发现如果您将所需的范围转换为一个表,并使用“ListObjects”更改数据透视表上的源数据,那么:

Workbooks("SubLOBs").Worksheets("APQCL2").PivotTables("PivotTable4").ChangePivotCache _
Workbooks("SubLOBs").PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
ThisWorkbook.Worksheets("Business Process Identification").ListObjects("Table1"))

我不知道为什么。我不知道为什么一个名为“SourceData”的参数不能简单地引用一个范围,而必须位于一个表中并被称为listobject。透视表可以吸鸡巴

Issel您想更改sourcedata是因为它在您的工作表中不断增长,还是来自完全不同的来源?一旦我弄清楚问题所在,我计划定义一个范围,并将其用作源数据,它将每月更改一次,并且将有多个透视表。目前我正在使用静态引用来简化和排除故障。源数据将来自另一个保存在SP站点上的工作簿。使用
ListObject
作为数据源,您再也不需要对捕获的所有行进行四次检查。@Issel您可以在工作簿上使用一个简单的命名区域,引用其他工作簿,如下所示:
=OFFSET(SHEETNAME!A1,0,0,COUNTA(SHEETNAME!a:a),COUNTA(SHEETNAME!1:1))
这将为您提供一个随工作表增长的动态范围,虽然您需要打开另一个工作簿来刷新它,但是…Mathieu Guindon,如果我可以对该帖子进行42次投票,我会这样做。ListObjects(或Tables)是Excel最未充分利用的功能之一。很多时候,我看到人们为了维护范围做了很多工作,而这些工作几乎可以通过使用ListObject轻松完成。当您具备在整个表格中自动扩展公式的功能、创建公式时所使用的简单得多的语法以及添加/删除行的方便性时,ListObjects将成为Excel中最好的数据管理工具之一。Issel是否要更改源数据,因为它会在工作表中增长,或者它来自一个完全不同的来源?一旦我弄清楚问题所在,我计划定义一个范围,并将其用作源数据,它将每月更改一次,并且将有多个透视表。目前我正在使用静态引用来简化和排除故障。源数据将来自另一个保存在SP站点上的工作簿。使用
ListObject
作为数据源,您再也不需要对捕获的所有行进行四次检查。@Issel您可以在工作簿上使用一个简单的命名区域,引用其他工作簿,如下所示:
=OFFSET(SHEETNAME!A1,0,0,COUNTA(SHEETNAME!a:a),COUNTA(SHEETNAME!1:1))
这将为您提供一个随工作表增长的动态范围,虽然您需要打开另一个工作簿来刷新它,但是…Mathieu Guindon,如果我可以对该帖子进行42次投票,我会这样做。ListObjects(或Tables)是Excel最未充分利用的功能之一。很多时候,我看到人们为了维护范围做了很多工作,而这些工作几乎可以通过使用ListObject轻松完成。当您能够在整个表格中自动扩展公式、创建公式时看到的非常简单的语法以及添加/删除行的方便性时,ListObjects将成为Excel中最好的数据管理工具之一。