How to create pivot table using vba

后端 未结 2 1966
无人及你
无人及你 2020-12-29 16:26

I am newbie in vba and am trying to create a PivotTable using VBA with excel.

I would like to creat like as below image as input sheet.

相关标签:
2条回答
  • 2020-12-29 16:42

    This needs some tidying up but should get you started.

    Note the use of Option Explicit so variables have to be declared.

    Columns names are as per your supplied workbook.

    Option Explicit
    
    Sub test()
    
         Dim PSheet As Worksheet
         Dim DSheet As Worksheet
         Dim LastRow As Long
         Dim LastCol As Long
         Dim PRange As Range
         Dim PCache As PivotCache
         Dim PTable As PivotTable
    
         Sheets.Add
         ActiveSheet.Name = "Pivottable"
    
        Set PSheet = Worksheets("Pivottable")
        Set DSheet = Worksheets("Sheet1")
    
        LastRow = DSheet.Cells(Rows.Count, 1).End(xlUp).Row
        LastCol = DSheet.Cells(1, Columns.Count).End(xlToLeft).Column
        Set PRange = DSheet.Range("A1").CurrentRegion
    
        Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange)
    
        Set PTable = PCache.CreatePivotTable(TableDestination:=PSheet.Cells(1, 1), TableName:="PRIMEPivotTable")
    
        With PTable.PivotFields("Region")
            .Orientation = xlRowField
            .Position = 1
        End With
    
        With PTable.PivotFields("Channel")
            .Orientation = xlRowField
            .Position = 2
        End With
    
        With PTable.PivotFields("AW code")
            .Orientation = xlRowField
            .Position = 3
        End With
    
        PTable.AddDataField PSheet.PivotTables _
            ("PRIMEPivotTable").PivotFields("Bk"), "Sum of Bk", xlSum
        PTable.AddDataField PSheet.PivotTables _
            ("PRIMEPivotTable").PivotFields("DY"), "Sum of DY", xlSum
        PTable.AddDataField PSheet.PivotTables _
            ("PRIMEPivotTable").PivotFields("TOTal"), "Sum of TOTal", xlSum
    
    End Sub
    
    0 讨论(0)
  • 2020-12-29 17:04

    The code in my answer below is a little long, but it should deliver you the result you are seeking for.

    First, to be on the safe side, first check if "Pivottable" sheet already exists in Raw_data workbook object (no need to create it again).

    Second, the code is divided in the middle to 2 sections:

    1. If the MACRO was ran before (this is the 2+ times you are running it), then "PRIMEPivotTable" Pivot-Table is already created, and there’s no need to create it again, or to set-up the Pivot-Table’s fields. All you need to do is refresh the PivotTable with the updated PivotCache (with updated Pivot-Cache’s source range).
    2. If this is the first time running this MACRO, then you need to set-up the PivotTable and all necessary PivotFields.

    Detaile explanation of every step inide the code's comments.

    Code

    Option Explicit
    
    Sub AutoPivot()
    
    Dim Raw_data As Workbook
    Dim PSheet As Worksheet
    Dim DSheet As Worksheet
    Dim PTable As PivotTable
    Dim PCache As PivotCache
    Dim PRange As Range
    Dim LastRow As Long, LastCol As Long
    Dim Raw_Data_1 As String, Output As String, Start_Time As String
    
    Start_Time = Time()
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    Raw_Data_1 = ThisWorkbook.Sheets(1).TextBox1.Text
    Output = ThisWorkbook.Sheets(1).TextBox2.Text
    
    ' set the WorkBook object
    Set Raw_data = Workbooks.Open(Raw_Data_1)
    
    Set DSheet = Raw_data.Worksheets("Sheet1")
    
    ' first check if "Pivottable" sheet exits (from previous MACRO runs)
    On Error Resume Next
    Set PSheet = Raw_data.Sheets("Pivottable")
    On Error GoTo 0
    
    If PSheet Is Nothing Then '
        Set PSheet = Raw_data.Sheets.Add(before:=Raw_data.ActiveSheet) ' create a new worksheet and assign the worksheet object
        PSheet.Name = "Pivottable"
    Else ' "Pivottable" already exists
        ' do nothing , or something else you might want
    
    End If
    
    With DSheet
        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    
        ' set the Pivot-Cache Source Range with the values found for LastRow and LastCol
        Set PRange = .Range("A1", .Cells(LastRow, LastCol))
    End With
    
    ' set a new/updated Pivot Cache object
    Set PCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=PRange.Address(True, True, xlA1, xlExternal))
    
    ' add this line in case the Pivot table doesn't exit >> first time running this Macro
    On Error Resume Next
    Set PTable = PSheet.PivotTables("PRIMEPivotTable") ' check if "PRIMEPivotTable" Pivot-Table already created (in past runs of this Macro)
    
    On Error GoTo 0
    If PTable Is Nothing Then ' Pivot-Table still doesn't exist, need to create it
        ' create a new Pivot-Table in "Pivottable" sheet
        Set PTable = PSheet.PivotTables.Add(PivotCache:=PCache, TableDestination:=PSheet.Range("A1"), TableName:="PRIMEPivotTable")
    
        With PTable
            ' add the row fields
            With .PivotFields("Region")
                .Orientation = xlRowField
                .Position = 1
            End With
            With .PivotFields("month")
                .Orientation = xlRowField
                .Position = 2
            End With
            With .PivotFields("number")
                .Orientation = xlRowField
                .Position = 3
            End With
            With .PivotFields("Status")
                .Orientation = xlRowField
                .Position = 4
            End With
    
            ' add the 3 value fields (as Sum of..)
            .AddDataField .PivotFields("value1"), "Sum of value1", xlSum
            .AddDataField .PivotFields("value2"), "Sum of value2", xlSum
            .AddDataField .PivotFields("TOTal"), "Sum of TOTal", xlSum
        End With
    
    Else ' Pivot-Table "PRIMEPivotTable" already exists >> just update the Pivot-Table with updated Pivot-Cache (update Source Range)
    
         ' just refresh the Pivot cache with the updated Range
        PTable.ChangePivotCache PCache
        PTable.RefreshTable
    End If
    
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    
    End Sub
    
    0 讨论(0)
提交回复
热议问题