2

我创建了一个 VBA 宏来动态创建数据透视表。源数据每天都在变化,因此每天都有不同数量的记录。在宏中,要选择的记录数是硬编码的。有没有办法每天选择源表中的所有数据 - 而不是预定义数量的记录

Application.DisplayAlerts = False
Call DeleteAllPivotTablesInWorkbook
Sheets("ALL").Select
If CheckSheet("AllSummary") Then
    Sheets("AllSummary").Delete
End If
Sheets.Add.Name = "AllSummary"
Application.DisplayAlerts = True
Sheets("AllSummary").Select
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
    "All!R1C1:R26885C47", Version:=xlPivotTableVersion10).CreatePivotTable _
    TableDestination:="AllSummary!R3C1", TableName:="PivotTable3", DefaultVersion _
    :=xlPivotTableVersion10
Sheets("AllSummary").Select
Cells(3, 1).Select

如您所见,源数据值是硬编码的。无论记录数如何,如何选择所有数据?

4

3 回答 3

4

你也可以使用

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
    "All!" & Sheets("All").Range("A1").CurrentRegion.Address(ReferenceStyle:=xlR1C1), Version:=xlPivotTableVersion10).CreatePivotTable _
    TableDestination:="AllSummary!R3C1", TableName:="PivotTable3", DefaultVersion _
    :=xlPivotTableVersion10
于 2013-07-12T14:24:50.383 回答
3

或者,如果您将数据保存在与数据透视表目标不同的工作表上,您可以使用最后一行/列/单元格类型选择来选择数据表上的所有相关数据:

Sub Excel2010Syntax()
    Sheets("Sheet1").Select
    ActiveCell.SpecialCells(xlLastCell).Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "Sheet1!R1C1:R16C4", Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:="Sheet2!R20C1", TableName:="PivotTable4", DefaultVersion _
        :=xlPivotTableVersion14
    Sheets("Sheet2").Select
    Cells(1, 1).Select
End Sub

这是在 excel 2010 中记录的(我认为你有一个早期版本),但你明白了。只需拥有一个专用数据表,然后选择其中的所有数据来创建您的数据透视表。

编辑:

或者只是运行这个宏:

Sub Answer()
Dim wb As Workbook
Dim ws As Worksheet
Dim rng1 As Range
Set wb = ActiveWorkbook
Set ws = wb.Sheets("All")
Set rng1 = ws.Cells.Find("*", ws.[a1], xlFormulas, , , xlPrevious)
Sheets("AllSummary").Select
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
    "All!R1C1:R" & CStr(rng1.Row) & "C" & CStr(rng1.Column), Version:=xlPivotTableVersion10).CreatePivotTable _
    TableDestination:="AllSummary!R3C1", TableName:="PivotTable3", DefaultVersion _
    :=xlPivotTableVersion10
Sheets("AllSummary").Select
Cells(3, 1).Select
End Sub
于 2013-07-12T14:49:29.613 回答
1

首先,考虑是否应该重新创建数据透视表。如果您只想更改数据透视表指向的位置,您可以在不删除和创建它的情况下执行此操作。

此子程序在 AllSummary 工作表上找到第一个数据透视表并更改其 PivotCache 的 SourceData 属性。SourceData 属性使用范围对象的 CurrentRegion 属性进行更改。当您处理数据透视表时,您通常拥有结构良好的数据,如果是这种情况,CurrentRegion 将返回包含添加的任何新行或列的范围。

Address 属性使用 R1C1,因为这是 SourceData 所期望的,并且还在 External 参数中使用 True 来获取地址中工作表的名称。

Sub AdjustPtSource()

    Dim pt As PivotTable

    With ActiveWorkbook
        Set pt = .Worksheets("AllSummary").PivotTables(1)
        pt.PivotCache.SourceData = .Worksheets("All").Range("A1").CurrentRegion.Address(, , xlR1C1, True)
    End With

End Sub

如果您必须删除并重新创建,您仍然可以使用 CurrentRegion 来获取整个连续范围。

Sub MakePT()

    Dim shSum As Worksheet
    Dim shAll As Worksheet
    Dim pc As PivotCache
    Dim pt As PivotTable

    Const sWSSUMMARY As String = "AllSummary"

    DeleteAllPivotTablesInWorkbook
    Set shAll = ActiveWorkbook.Worksheets("All")

    If CheckSheet(sWSSUMMARY) Then
        Sheets(sWSSUMMARY).Delete
    End If

    Set shSum = ThisWorkbook.Worksheets.Add
    shSum.Name = sWSSUMMARY

    Set pc = ActiveWorkbook.PivotCaches.Create(xlDatabase, shAll.Range("A1").CurrentRegion)
    Set pt = pc.CreatePivotTable(shSum.Cells(3, 1))

End Sub
于 2013-07-12T15:22:02.353 回答