2016-09-21 28 views
0

我已經記錄了一個用於插入數據透視的宏。由於宏被記錄,它可以在特定的Excel表單中正常工作。但是我想推廣它,使它可以在所有表​​格上工作,而不管行數。所以我想選擇'N'列,從'N6'開始到最後一個填滿的單元格。我曾經使用過, Range(Range("N5"), Range("N5").End(xlDown)).Select如何製作動態數據透視表宏?

但我想要一個動態數據透視表。它應該是表格中最後一個填充行下方的幾行。我怎麼做?

Sub Macro2() 

Range("N6:N31").Select 
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ 
    "Sheet1!R6C14:R31C14", Version:=xlPivotTableVersion14).CreatePivotTable _ 
    TableDestination:="Sheet1!R38C11", TableName:="PivotTable1", _ 
    DefaultVersion:=xlPivotTableVersion14 
Sheets("Sheet1").Select 
Cells(38, 11).Select 
With ActiveSheet.PivotTables("PivotTable1").PivotFields("BREAK TYPE") 
    .Orientation = xlRowField 
    .Position = 1 
End With 
ActiveSheet.PivotTables("PivotTable1").AddDataField ActiveSheet.PivotTables(_ 
    "PivotTable1").PivotFields("BREAK TYPE"), "Count of BREAK TYPE", xlCount 

Range("K38").Select 
With ActiveSheet.PivotTables("PivotTable1").PivotFields("BREAK TYPE") 
    .Orientation = xlRowField 
    .Position = 1 
End With 
ActiveWorkbook.ShowPivotTableFieldList = False 

End Sub 
+0

你想在數據透視表內有什麼範圍?從哪個Worksheet?還有,什麼樣的維度是動態的?行?列 ? –

+0

在Break Type列中,我希望範圍從'N6'開始並繼續,直到同一列中的最後一個填充行。數據透視應位於同一張工作表'Sheet1'上,但應該顯示在最後一行的下方。 – PranavM

+0

範圍從N6一路下降到最後一個被填充的單元格爲:'Range(「N6:N」&Cells(Rows.Count,「N」)。End(xlUp).Row)' –

回答

0

下面的代碼檢查列N中數據的最後一行,然後檢查「Sheet1」中是否已經有一個數據透視表。

如果存在,則根據更新的數據刷新數據透視表緩存。 如果沒有,它會創建一個數據透視表(2行 - 不推薦)。

Option Explicit 

Sub Macro2() 

Dim shtPivot      As Worksheet 
Dim PivotSrc_Range     As Range 
Dim PvtTbl       As PivotTable 
Dim PvtCache      As PivotCache 
Dim lastRow       As Long 

' modify to your Sheet name that holds the Pivot source data 
Set shtPivot = ThisWorkbook.Sheets("Sheet1") 

With shtPivot 
    lastRow = .Cells(.Rows.Count, "N").End(xlUp).Row 

    ' setting dynamic Range in Column N 
    Set PivotSrc_Range = Range("N6:N" & lastRow) 

    ' for debug 
    Debug.Print PivotSrc_Range.Address 
End With 

' set the Pivot Cache 
Set PvtCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PivotSrc_Range, Version:=xlPivotTableVersion14) 

' add this line in case the Pivot table doesn't exit >> first time running this Macro 
On Error Resume Next 
Set PvtTbl = shtPivot.PivotTables("PivotTable1") 

On Error GoTo 0 
If PvtTbl Is Nothing Then 

    ' create a new Pivot Table in "Sheet1" sheet, start 3 rows below your last line with data 
    Set PvtTbl = shtPivot.PivotTables.Add(PivotCache:=PvtCache, TableDestination:=shtPivot.Range("N" & lastRow + 3), TableName:="PivotTable1") 

    ' modify the name in brackets according to your Pivot Fields 
    With PvtTbl.PivotFields("BREAK TYPE") 
     .Orientation = xlRowField 
     .Position = 1 
    End With 

    PvtTbl.AddDataField PvtTbl.PivotFields("BREAK TYPE"), "Count of BREAK TYPE", xlCount 

Else 
    ' just refresh the Pivot cache with the updated Range (data in Sheet1) 
    PvtTbl.ChangePivotCache PvtCache 
    PvtTbl.RefreshTable 
End If 

ActiveWorkbook.ShowPivotTableFieldList = False 

End Sub 
+0

非常感謝。有效。 – PranavM

+0

爲什麼不建議在同一工作表中添加數據透視表。我應該在新表中添加數據透視嗎? – PranavM

+0

我認爲它更好,或者右邊有幾列(如果你不再需要列) –