首页 > 解决方案 > 使用 VBA 代码从数据列创建 Pivot 的问题

问题描述

我有一列数据。我有一个带有命令按钮的用户窗体,它应该从数据列创建一个数据透视表。

期望的结果是创建一个数据透视表,该表计算每个数字在数据列中出现的次数。但是,我的代码只显示了所有数字的计数(即数据行数)。

有人可以帮助我并告诉我哪里出错了吗?

所需的输出是两列,第一列是列出每个数字的行标签,第二列是这些数字的计数,显示每个数字出现的次数。


     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("Calling Number")
        .Orientation = xlColumnField
        .Position = 1

End With

With ActiveSheet.PivotTables("PRIMEPivotTable").PivotFields("Calling Number")
        .Orientation = xlRowField
        .Position = 1

    End With


    PTable.AddDataField PSheet.PivotTables _
        ("PRIMEPivotTable").PivotFields("Calling Number"), "Count of Calling Number", xlCount


End Sub```

标签: excelvbapivot-table

解决方案


我相信您已经遇到了一些 VBA 挑剔和一些冗余。

我将您的代码编辑为如下:

Sub foo()

    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")

    PTable.AddDataField PSheet.PivotTables( _
        "PRIMEPivotTable").PivotFields("Calling Number"), "Count of Calling Number", xlCount

    With PTable.PivotFields("Calling Number")
         .Orientation = xlRowField
         .Position = 1
    End With


End Sub

您在代码中对数据透视表进行了三个操作。(1) 您将“呼叫号码”添加到列标题。(2) 您将“呼叫号码”添加到行标题。(3) 您将主叫号码计数添加到数据字段。

你不需要(1)。我们只是在做行标题。此外,由于某种原因,当您在 DataFields 中使用与 PivotFields 中相同的字段时,您必须在添加数据字段之后添加数据透视字段。我真的不知道为什么,我承认我偶然发现了它。但是在一些测试数据上运行上面的代码片段我得到以下(我认为这是你所追求的)

在此处输入图像描述 在此处输入图像描述

希望能帮助到你!


推荐阅读