简体   繁体   中英

VBA Pivot Table

I am trying to write some VBA that will build a pivot table in a new tab. When I run the code I am getting the Type Mismatch error when creating the PivotTable Cache.

The code is below, any help would be appreciated...hopefully a fresh look at it can spot what I am missing

Sub makeAPivotTable()

    Dim sSheet, sSheet2 As Worksheet 'sSheet is where the data is, sSheet2 is where the pivot will be built
    Dim cCache As PivotCache
    Dim ptTable As PivotTable
    Dim rRange As Range
    Dim rLastRow, cLastColumn As Long

    ' Insert the new sheet for the pivot table to reside
    Application.DisplayAlerts = False
    Sheets.Add Before:=ActiveSheet
    ActiveSheet.name = "PivotTable"
    Application.DisplayAlerts = True
    Set sSheet2 = Worksheets("PivotTable")
    Set sSheet = Worksheets("Interactions db")

    ' define the range (the data that you want to put into the pivot table
    rLastRow = sSheet.Cells(Rows.Count, 1).End(xlUp).Row
    cLastColumn = sSheet.Cells(1, Columns.Count).End(xlToLeft).Column
    Set rRange = sSheet.Cells(1, 1).Resize(rLastRow, cLastColumn)

    ' create the cache for the pivot table
    Set cCache = ActiveWorkbook.PivotCaches.Create _
    (SourceType:=xlDatabase, SourceData:=rRange). _
    CreatePivotTable(TableDestination:=sSheet2.Cells(2, 2), _
    TableName:="SalesPivotTable")


    ' insert the blank table
    Set ptTable = cCache.CreatePivotTable _
        (TableDestination:=sSheet2.Cells(1, 1), TableName:="SalesPivotTable")


    'Insert Row Fields
    With ActiveSheet.PivotTables("SalesPivotTable").PivotFields("customer")
    .Orientation = xlRowField
    .Position = 1
    End With


    'Insert Column Fields
    'With ActiveSheet.PivotTables("SalesPivotTable").PivotFields("Interaction Type")
    '.Orientation = xlColumnField
    '.Position = 1
    'End With

    'Insert Data Field
    With ActiveSheet.PivotTables("SalesPivotTable").PivotFields("interactionType")
    .Orientation = xlDataField
    .Position = 1
    .Function = xlSum
    .NumberFormat = "#,##0"
    .name = "Person "
    End With


    ' do some formatting






End Sub

Try the code below (explanations inside the code as comments)

Option Explicit

Sub makeAPivotTable()

    Dim sSheet As Worksheet, sSheet2 As Worksheet  ' sSheet is where the data is, sSheet2 is where the pivot will be built
    Dim cCache As PivotCache
    Dim ptTable As PivotTable
    Dim rRange As Range
    Dim rLastRow As Long, cLastColumn As Long ' need to define each one as Long, otherwise the first one is Variant

    ' Insert the new sheet for the pivot table to reside
    Application.DisplayAlerts = False

    ' 2 lines below are shorter version to create a new sheet, 
    ' assign it to sSheet2 , and name it "PivotTable"
    On Error Resume Next
    Set sSheet2 = Sheets("PivotTable") '<-- try to set the Sheet (already created in past code runs)
    On Error GoTo 0

    If sSheet2 Is Nothing Then '<-- sheet does not exist yet >> Add it
        Set sSheet2 = Sheets.Add(Before:=ActiveSheet)
        sSheet2.Name = "PivotTable"
    End If

    Application.DisplayAlerts = True

    Set sSheet = Worksheets("Interactions db")

    ' define the range (the data that you want to put into the pivot table
    With sSheet
        rLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        cLastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column
        Set rRange = .Cells(1, 1).Resize(rLastRow, cLastColumn)
    End With

    ' create the cache for the pivot table ***** THIS is the CORRECT Syntax
    Set cCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rRange)

    ' CREATE a NEW Pivot Table in sSheet2 sheet
    Set ptTable = sSheet2.PivotTables.Add(PivotCache:=cCache, TableDestination:=sSheet2.Range("A1"), TableName:="SalesPivotTable")

    With ptTable
        'Insert Row Fields
        With .PivotFields("customer")
            .Orientation = xlRowField
            .Position = 1
        End With

        'Insert Column Fields
        'With ActiveSheet.PivotTables("SalesPivotTable").PivotFields("Interaction Type")
        '.Orientation = xlColumnField
        '.Position = 1
        'End With

        'Insert Data Field
        With .PivotFields("interactionType")
            .Orientation = xlDataField
            .Position = 1
            .Function = xlSum
            .NumberFormat = "#,##0"
            .Name = "Person "
        End With

        ' do some formatting
    End With

End Sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM