Excel 运行时错误';5';:无效的过程调用或参数

Excel 运行时错误';5';:无效的过程调用或参数,excel,pivot-table,vba,Excel,Pivot Table,Vba,我的工作簿中有两个数据透视表,我有以下代码来动态更改数据源和刷新数据透视表。代码在每个pt循环的第一个循环中运行良好,并且第一个透视表被刷新。但是,当为第二个透视表循环时,代码在pt.ChangePitvotCache处崩溃,并出现错误: 运行时错误='5':过程调用或参数无效 当我的代码中有一个以上的透视表时,有人能帮助我解释为什么这不起作用吗 Dim ws As Worksheet Dim pvtCache As PivotCache Dim pt As PivotTable Dim new

我的工作簿中有两个数据透视表,我有以下代码来动态更改数据源和刷新数据透视表。代码在每个pt循环的第一个
循环中运行良好,并且第一个透视表被刷新。但是,当为第二个透视表循环时,代码在
pt.ChangePitvotCache
处崩溃,并出现错误:

运行时错误='5':过程调用或参数无效

当我的代码中有一个以上的透视表时,有人能帮助我解释为什么这不起作用吗

Dim ws As Worksheet
Dim pvtCache As PivotCache
Dim pt As PivotTable
Dim newRange As String 

Set DataSource = DataSht.Range("A1", DataSht.Range("A1").End(xlToRight).End(xlDown))

newRange = DataSht.Name & "!" & DataSource.Address(ReferenceStyle:=xlR1C1)

Set pvtCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=newRange)

For Each ws In ActiveWorkbook.Worksheets
    For Each pt In ws.PivotTables
        pt.ChangePivotCache pvtCache
        pt.RefreshTable
    Next pt
Next ws
pvtCache
设置为第一个
数据透视表后,需要“重置”它

因此,您需要为ws.PivotTables
循环中的每个pt设置
pvtCache
并在
中“重置”它

请尝试以下代码:

For Each ws In ActiveWorkbook.Worksheets
    For Each pt In ws.PivotTables
        Set pvtCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=newRange)
        pt.ChangePivotCache pvtCache
        pt.RefreshTable
        Set pvtCache = Nothing
    Next pt
Next ws

通过将数据源转换为表并将数据透视表的源更改为表名,避免了每次生成数据集时都必须更改数据透视缓存的问题

Activesheet.ListObjects.Add(xlSrcRange, Range(Cells(1, "A").End(xlDown), Cells(1, "A").End(xlToRight)), , xlYes).Name = "DataTable"

谢谢Shai,您的建议有效,但仅在第二个PT与第一个PT不共享数据透视缓存的情况下有效。我现在在新工作表上添加了一个克隆的PT,现在代码在ws.PivotTables循环中的每个PT的第一个PT上都给出了该错误…实际上它也适用于这种情况,您是否在循环之前删除了set-pvtCache?我已经删除了我在循环之前跳过了pvtCache,但仍然得到了相同的错误。我已经设法缩小了问题的范围,似乎只有当有切片器连接到克隆的数据透视表时,问题才会出现。所有工作表中的所有数据透视表都共享相同的数据透视缓存?是的,只有两个表共享相同的cac他说。我刚刚找到了解决问题的方法。我添加了一行代码,使源数据在每次刷新时都成为表,并将数据透视表链接到表名,因此我现在不需要更改数据透视缓存。感谢您的帮助!