2013-07-12 134 views
1

我創建了一個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值是硬編碼。無論記錄數量如何選擇所有數據?

+0

使用命名的範圍或數據表? – James

+0

看我的編輯。只需運行該宏。 – Stepan1010

+0

或者只是使用迪克的宏來更新它。 – Stepan1010

回答

3

你也可以使用

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 
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 
+0

只需選擇數據不會影響用作數據源的數據源 - 您的代碼仍然具有硬編碼範圍 – JosieP

+0

@JosieP是的,這是一個概念說明。他必須將最後一個單元格的地址連接到SourceData字符串字段中。看我的編輯。 – Stepan1010

1

首先,考慮是否應該被重新創建數據透視表。如果您只想更改數據透視表指向的位置,則可以在不刪除並創建它的情況下執行此操作。

該子查找AllSummary表中的第一個數據透視表,並更改其PivotCache的SourceData屬性。 SourceData屬性使用Range對象的CurrentRegion屬性進行更改。當你處理數據透視表時,你通常會有非常好的結構化數據,如果是這樣的話,CurrentRegion將返回包含任何新行或列的範圍。

Address屬性使用R1C1,因爲這是SourceData所期望的,並且在外部參數中使用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