【问题标题】:VBA pivot with dynamic data [closed]具有动态数据的 VBA 数据透视 [关闭]
【发布时间】:2017-04-06 17:35:16
【问题描述】:

我正在尝试从同一工作簿中的另一个选项卡中获取数据透视拉数据,但出现错误。有什么想法吗?

Sub RefreshPivots()

Dim SrcData As String
Dim PivTbl As PivotTable
Dim lastrow As Long

Sheets("EXP 7004").Activate
lastrow = Sheets("EXP 7004").Range("a" & Rows.Count).End(xlUp).Row

SrcData = Sheets("EXP 7004").Range("$A$26:$AT$" & lastrow).Address(ReferenceStyle:=xlR1C1)

Set PivTbl = Sheets("EXP Pivot").PivotTables("PivotTable1")
Sheets("EXP Pivot").Activate

Sheets("EXP Pivot").PivotTables(PivTbl).ChangePivotCache Sheets("EXP Pivot"). _
PivotCaches.Create(SourceType:=xlDatabase, SourceData:=SrcData)

End Sub

【问题讨论】:

  • 您遇到什么错误?在哪里?寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。见minimal reproducible example
  • 错误在这部分; “工作表(“EXP 数据透视”).PivotTables(PivTbl).ChangePivotCache 工作表(“EXP 数据透视”)。_ PivotCaches.Create(SourceType:=xlDatabase,SourceData:=SrcData)。”这是一个 Ru 时错误“438”。对象不支持此属性或方法。
  • 请在问题中添加错误

标签: vba excel pivot-table


【解决方案1】:

试试下面的代码(解释在代码cmets里面):

Option Explicit

Sub RefreshPivots()

Dim ShtPivot    As Worksheet
Dim PivTbl      As PivotTable
Dim PivCache    As PivotCache
Dim SrcRng      As Range
Dim SrcData     As String
Dim lastRow     As Long

With Sheets("EXP 7004")
    lastRow = .Range("A" & .Rows.Count).End(xlUp).Row

    Set SrcRng = .Range("A26:AT" & lastRow)
    SrcData = "EXP 7004!" & SrcRng.Address(True, True, xlA1)
End With

' set the Pivot Sheet
Set ShtPivot = Worksheets("EXP Pivot")

' set the Pivot Cache
Set PivCache = ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=SrcRng)

' add this line in case the Pivot table doesn't exit >> first time running this Macro
On Error Resume Next
Set PivTbl = ShtPivot.PivotTables("PivotTable1") ' check if "PivotTable1" Pivot Table already created (in past runs of this Macro)

On Error GoTo 0
If PivTbl Is Nothing Then
    ' create a new Pivot Table in "EXP Pivot" sheet, start from Cell A1
    Set PivTbl = ShtPivot.PivotTables.Add(PivotCache:=PivCache, TableDestination:=ShtPivot.Range("A1"), TableName:="PivotTable1")

Else
     ' just refresh the Pivot cache with the updated Range (data in "EXP 7004" sheet)
    PivTbl.ChangePivotCache PivCache
    PivTbl.RefreshTable
End If

End Sub

【讨论】:

  • 这出现了运行时错误。数据透视表名称无效。
  • @BenjaminWann 你在哪一行得到这个错误?
  • Else ' 只需使用更新的 Range(“EXP 7004”表中的数据)刷新 Pivot 缓存 PivTbl.ChangePivotCache PivCache PivTbl.RefreshTable End If。我尝试删除,但宏什么也没做。
  • 您确定从 A 列到 AT 列有有效数据吗? 46 列?数据从第 26 行开始?不是 2?
  • @BenjaminWann 你在这里处理了我的整个代码吗?还是只有一点点?
【解决方案2】:

这样试试吧……

Sub RefreshPivots()

Dim SrcData As Range
Dim PivTbl As PivotTable
Dim lastrow As Long

lastrow = Sheets("EXP 7004").Range("a" & Sheets("EXP 7004").Rows.Count).End(xlUp).Row

Set SrcData = Sheets("EXP 7004").Range("$A$26:$AT$" & lastrow)
Set PivTbl = Sheets("EXP Pivot").PivotTables("PivotTable1")

PivTbl.ChangePivotCache ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=SrcData)

End Sub

【讨论】:

  • 这非常有效。谢谢!!!
  • 不客气。很高兴它成功了。
  • @sktneer 来一个,你比这个好,不要用Activate
  • hehehe.. 实际上我在问题区域工作,并没有调整其余代码。 :)
  • @Shai Rado 在这种情况下,Activate 的替代方案是什么?
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
相关资源
最近更新 更多