【问题标题】:Copying PivotTable Values in VBA在 VBA 中复制数据透视表值
【发布时间】:2017-02-17 05:30:52
【问题描述】:

我通过宏创建了一个数据透视表,并希望使用 VBA 将数据透视表复制为值。创建数据透视表进展顺利,但将其复制到另一张工作表让我很头疼。代码如下:

Sub test()
Dim shtTarget, pvtSht As Worksheet
Dim pc As PivotCache
Dim pt As PivotTable
Dim field As PivotField
Dim rngSource As Range

With ActiveWorkbook
    Set rngSource = .Sheets(2).Range("H:I").CurrentRegion
    Set shtTarget = .Sheets.Add(After:=.Sheets(.Sheets.count))
    shtTarget.Name = "Temp"
    Set pc = .PivotCaches.Create(xlDatabase, rngSource, xlPivotTableVersion14)
    Set pt = pc.CreatePivotTable(shtTarget.Range("A1"), "PivotTable1", , xlPivotTableVersion14)

End With

With shtTarget.PivotTables("PivotTable1").PivotFields("Concatenate")
    .Orientation = xlRowField
    .Position = 1
End With

With shtTarget
    .PivotTables("PivotTable1").AddDataField .PivotTables( _
    "PivotTable1").PivotFields("SCREEN_ENTRY_VALUE"), "Count of SCREEN_ENTRY_VALUE" _
    , xlSum
End With

With ActiveWorkbook
    Set pvtSht = .Sheets.Add(After:=.Sheets(.Sheets.count))
    pvtSht.Name = "Sum of Element Entries"

'==========================I'm stuck on this line=================================

    .Sheets(shtTarget).PivotTables("PivotTable1").TableRange1.Copy 
    pvtSht.Range("A1").PasteSpecial xlPasteValues
End With

End Sub

错误是Type mismatch 错误。

【问题讨论】:

  • .Sheets(shtTarget).PivotTables --> shtTarget.PivotTables
  • @A.S.H 仍然无法正常工作:(。无论如何,我已经解决了。刚刚复制了 Pivot 的范围值 :)
  • @ramedju 您在下面的答案中尝试过我的代码吗?有什么反馈吗?

标签: vba excel pivot-table


【解决方案1】:

试试下面的代码,它有点“干净”,我所做的修改:

  • 1)要复制数据透视表的数据并粘贴到另一个Worksheet 作为值,您需要使用TableRange2 而不是TableRange1
  • 2) 您已经将您的pt 对象定义并设置为您的PivotTable,为什么不继续使用它呢?在您的代码中,shtTarget.PivotTables("PivotTable1") 的任何位置都可以替换为简短的 pt

代码(已测试)

Option Explicit

Sub test()

Dim shtTarget As Worksheet, pvtSht As Worksheet
Dim pc As PivotCache
Dim pt As PivotTable
Dim field As PivotField
Dim rngSource As Range

With ActiveWorkbook
    Set rngSource = .Sheets(2).Range("H:I").CurrentRegion
    Set shtTarget = .Sheets.Add(After:=.Sheets(.Sheets.Count))
    shtTarget.Name = "Temp"

    Set pc = .PivotCaches.Create(xlDatabase, rngSource, xlPivotTableVersion14)
    Set pt = pc.CreatePivotTable(shtTarget.Range("A1"), "PivotTable1", , xlPivotTableVersion14)
End With

With pt.PivotFields("Concatenate")
    .Orientation = xlRowField
    .Position = 1
End With

pt.AddDataField pt.PivotFields("SCREEN_ENTRY_VALUE"), "Sum of SCREEN_ENTRY_VALUE", xlSum

With ActiveWorkbook
    Set pvtSht = .Sheets.Add(After:=.Sheets(.Sheets.Count))
    pvtSht.Name = "Sum of Element Entries"

    pt.TableRange2.Copy
    pvtSht.Range("A1").PasteSpecial xlPasteValues
End With

End Sub

【讨论】:

  • 我也在尝试编写代码,但在“Set pc = .PivotCaches...”行出现运行时错误 1004,有什么想法吗?
  • @LarsHovden 尝试 Set pc = .PivotCaches.Create(xlDatabase, rngSource.Address(False, False, xlA1, xlExternal)) ,并将 ActiveWorkbook 更改为完全限定的 Workbook 对象
  • 你是指With ActiveWorkbook 还是With Workbook?
  • @LarsHovden 而不是ActiveWorkbook 使用Dim wb as Workbook 之类的对象,然后将其设置为您要使用的工作簿。最后使用With wb...
  • 现在我得到一个运行时错误 5:无效的过程调用或参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多