【发布时间】:2017-05-05 17:41:10
【问题描述】:
由于 EPPlus 不支持对数据透视表源范围的操作(更具体地说,可以更新缓存定义,但保存文件后不会保留此更新),我不得不在模板本身中使用 VBA更新源范围和刷新数据透视表。
有多个数据透视表,每个数据透视表用于存储在文件中的 2 个数据源和 2 个关联的PivotCache 对象。我的目标是将所有数据透视表更新为 2 个源中的新单元格范围。因为我不想复制一堆 PivotCache 来这样做,所以我只创建第一个,然后尝试将共享相关数据集的后续数据透视表更新到同一个缓存。
这里是从其中一个缓存(“下载”)更新枢轴的摘录。该函数的其余部分对第二个缓存执行完全相同的操作(它嵌套在相同的循环中,但为简洁起见省略了)。
Set downloads = ThisWorkbook.Worksheets("DLRaw")
For Each ws In ActiveWorkbook.Worksheets
For Each pt In ws.PivotTables
If Not downloadsCreated Then
Set startCell = downloads.Range("A8")
Set endCell = downloads.Range("Y" & startCell.SpecialCells(xlLastCell).Row)
Set dataRange = downloads.Range(startCell, endCell)
newRange = downloads.Name & "!" & dataRange.Address(ReferenceStyle:=xlR1C1)
pt.ChangePivotCache _
ThisWorkbook.PivotCaches.Create(xlDatabase, newRange)
Set downloadsCache = pt.PivotCache
downloadsCreated = True
Else
If pt.CacheIndex <> downloadsCache.Index Then pt.CacheIndex = downloadsCache.Index
End If
pt.RefreshTable
For Each rf In pt.RowFields
If rf.Position <> pt.RowFields.count Then
rf.ShowDetail = False
End If
Next rf
For Each cf In pt.ColumnFields
If cf.Position <> pt.ColumnFields.count Then
cf.ShowDetail = False
End If
Next cf
Next pt
Next ws
我一直收到关于空实体的运行时错误“1004”,由Else 块中的行抛出。单步执行代码,我注意到新创建的数据透视缓存的CacheIndex 是0,所以要么没有分配downloadsCache 对象,要么一开始就没有创建新的缓存.我确实在范围变量中看到了正确的值。上述下载摘录和第二个缓存的数据透视表都存在这种行为。
对于下一步该往哪里看有什么想法,或者如果有必要可以用不同的方法来解决这个问题?
【问题讨论】:
-
你能更好地描述你想要达到的目标吗?您可以在
If Not downloadsCreated Then之前添加代码吗,它可能会为您的问题提供更好的解决方案。你到底想用你的Else部分做什么? -
当然,我会再编辑一下并澄清一下。
-
所以你直接进入
Else,这意味着downloadsCreated = True,是吗?你之前运行过这段代码吗? -
否,“If Not”块运行并且 downloadsCache 从 null 变为已填充,但其 index 属性设置为 0,这似乎是无效的。当 Else 块在循环的下一次通过时运行时,我尝试从 downloadsCache 分配给下一个枢轴的 CacheIndex 时出现 null ref 错误。
-
如果需要,还有另一种方法可以使用相同的数据透视缓存更新所有数据透视表?