创建数据透视表时动态选择所有数据

时间:2013-07-12 14:19:05

标签: excel vba excel-2010

我已经创建了一个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

正如您所看到的,sourcdata值是硬编码的。无论记录数量如何,我如何选择所有数据?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

首先,考虑是否应该重新创建数据透视表。如果您只想更改数据透视表指向的位置,则可以不删除并创建它。

此子找到AllSummary工作表上的第一个数据透视表,并更改其PivotCache的SourceData属性。使用范围对象的CurrentRegion属性更改SourceData属性。当您处理数据透视表时,通常会有非常好的结构化数据,如果是这种情况,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