excel - 使用 VBA 动态更改数据透视表源数据
问题描述
我正在尝试编写一个宏来动态调整数据透视表上的源数据。我已经阅读了本网站和其他论坛上的其他解决方案,但似乎无法让他们的“修复”发挥作用。我目前正在使用我在网上找到的一些代码的略微修改版本,这些代码的问题似乎比其他代码少。
我的数据透视表位于名为“Pivot”的工作表上,源数据位于名为“Source”的工作表上。
目前我的代码是:
Sub AdjustPivotSource()
Dim Data_sht As Worksheet
Dim Pivot_sht As Worksheet
Dim PivotName As String
Dim NewRange As String
'Set Variables Equal to Data Sheet and Pivot Sheet
Set Data_sht = Worksheets("Source")
Set Pivot_sht = Worksheets("Pivot")
'Enter in Pivot Table Name
PivotName = "My_Pivot"
Dim LastRow As Long
LastRow = Worksheets("Source").Range("A" & Rows.count).End(xlUp).Row
NewRange = ActiveSheet.Name & "!" & Range("$A$1:$DU$" & LastRow).Address(ReferenceStyle:=xlR1C1)
'Change Pivot Table Data Source
Pivot_sht.PivotTables(PivotName).ChangePivotCache _
ThisWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=NewRange, Version:=xlPivotVersion15)
'Refresh Pivot
Pivot_sht.PivotTables(PivotName).RefreshTable
End Sub
"Run-time error '5': Invalid procedure call or argument"
这部分代码突出显示时出现错误:
Pivot_sht.PivotTables(PivotName).ChangePivotCache _
ThisWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=NewRange, Version:=xlPivotVersion15)
我NewRange
似乎准确地抓住了我想要的范围。我已经验证源数据没有空白标题。我已经仔细检查了数据透视表名称和工作表名称是否正确。
我想知道代码错误部分中的“ThisWorkbook”是否有问题?我最初使用的是:
Set pivotDataSheet = ThisWorkbook.Worksheets("Source")
代替:
Set pivotDataSheet = Worksheets("Source")
这导致了以下错误:
Run-time error '9': Subscript out of range"
我删除了“ThisWorkbook”并解决了该错误,但我没有从当前给我错误的代码部分中删除“ThisWorkbook”。
“ThisWorkbook”给出了错误,因为我是从 PERSONAL 而不是在文件本身中运行宏。仍然有主要问题。
解决方案
虽然不是对我遇到问题的代码的真正修复,但下面的代码可以解决我的问题。我将源数据设为命名表,然后将数据透视表的源设置为表。这使我不必每次都重置数据透视缓存/数据源。
Worksheets("Source").ListObjects.Add(xlSrcRange, Range(Cells(1, "A").End(xlDown), Cells(1, "A").End(xlToRight)), , xlYes).Name = "Source_Table"
推荐阅读
- c# - 使用 Selenium 测试脚本命中错误登录到 Salesforce
- python - 套接字阻止在 Java 服务器和 Python 客户端之间发送消息
- sparql - 在 Virtuoso 中使用 Ontology 正确分配数据类型
- c# - 如何在 C# 图像处理中进行颜色阈值处理?
- django - Django Docker 容器中的 Celery 异步问题
- javascript - 更改多个 xml 文件的标记名称
- ios - 同时识别 UIPanGestureRecognizer、UIRotationGestureRecognizer 和 UIPinchGestureRecognizer
- prometheus - Prometheus 警报管理器 - CPU 高不警报
- couchdb - 是否可以将超级账本与 PouchDB 一起使用?
- kivy - kivmob(用于 kivy 的 admob)究竟是如何使用(集成)的?