Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 更改透视缓存的简单方法_Vba_Excel_Excel 2010 - Fatal编程技术网

Vba 更改透视缓存的简单方法

Vba 更改透视缓存的简单方法,vba,excel,excel-2010,Vba,Excel,Excel 2010,这不管用 Sub changeData_Error() Dim pc As PivotCache Set pc = ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=Range("A1:B2")) Excel.Sheets("Sheet1").PivotTables("PivotTable1").ChangePivotCache pc ThisWorkbook.RefreshAll End Sub 最后得

这不管用

Sub changeData_Error()

Dim pc As PivotCache
Set pc = ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=Range("A1:B2"))
Excel.Sheets("Sheet1").PivotTables("PivotTable1").ChangePivotCache pc

ThisWorkbook.RefreshAll
End Sub
最后得出的结论似乎过于复杂。可以简化吗

Sub changeData()

 ':: this is the table I'd like to change the data
Dim mainP As PivotTable
Set mainP = ThisWorkbook.Sheets("Sheet1").PivotTables("PivotTable1")

 ':: create a new cache and set it to the new data range
Dim pc As PivotCache
Set pc = ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=Range("A1:B3"))

 ':: create a temporary pivot table
Dim pt As PivotTable
Set pt = ThisWorkbook.Sheets("Sheet1").PivotTables.Add(pc, Range("AA1"), "temptable")

 ':: find the index of the cache used by the temp table
Dim i As Integer
i = pt.CacheIndex
 ':: use the index found to redirect the main pivot at the new cache
mainP.CacheIndex = i

 ':: get rid of temp table
pt.TableRange2.Clear

 ':: this might not be needed
ThisWorkbook.RefreshAll
End Sub

以下代码在两个不同的数据集之间切换,通过透视报告字段列表中是否存在Col3很容易看到:

Option Explicit

Public Sub SwitchToData1()
    On Error GoTo ErrHandler
    SwitchCacheData _
        ThisWorkbook.Sheets("Report").PivotTables("PivotTable1"), _
        Range("Data1!A1:B4")
EndSub:
    Exit Sub

ErrHandler:
    MsgBox "Error #" & Err.Number * vbCrLf & Err.Description, _
        vbOKOnly Or vbCritical, _
        "Error!"
    Resume EndSub
End Sub


Public Sub SwitchToData2()
    On Error GoTo ErrHandler
    SwitchCacheData _
        ThisWorkbook.Sheets("Report").PivotTables("PivotTable1"), _
        Range("Data2!A1:C4")
EndSub:
    Exit Sub

ErrHandler:
    MsgBox "Error #" & Err.Number * vbCrLf & Err.Description, _
        vbOKOnly Or vbCritical, _
        "Error!"
    Resume EndSub
End Sub

Private Sub SwitchCacheData(pvt As PivotTable, rng As Range)
    pvt.ChangePivotCache ThisWorkbook.PivotCaches.Create(xlDatabase, rng)
    pvt.RefreshTable
End Sub

+1嗨,彼得-谢谢你这篇好文章。你能理解为什么我的原始代码段没有执行吗?@whytheq:你在数据透视表的任何地方执行刷新表吗?