使用 VBA 代码从数据列创建数据透视的问题

Posted

技术标签:

【中文标题】使用 VBA 代码从数据列创建数据透视的问题【英文标题】:Issue with VBA code to create Pivot from column of data 【发布时间】:2019-08-27 10:13:28 【问题描述】:

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

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

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

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


     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```

【问题讨论】:

【参考方案1】:

我相信您已经与一些 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 中相同的字段时,您必须在添加数据字段之后添加数据透视字段。我真的不知道为什么,我承认我偶然发现了它。但是在一些测试数据上运行上面的代码片段,我得到以下结果(我认为这就是你所追求的)

希望对你有帮助!

【讨论】:

嗨瑞恩。非常感谢您的帮助。我刚刚用你的修改运行了代码,但我在我的行上遇到了一个错误:PTable.AddDataField PSheet.PivotTables( _ "PRIMEPivotTable").PivotFields("Calling Number"), "Count of Calling Number", xlCount 它说 object_Worksheet 的 Method PivotTables failed 我相信这个错误意味着 Excel 很难找到数据透视表 - 可能是因为我们指向了错误的工作表,或者由于其他问题而实际上没有创建数据透视表。尝试单步执行代码并确认在执行此代码时数据透视表处于活动状态,您的数据透视表确实在那里(应该显示为没有字段的空白空间持有人)并且所有工作表/表格都按预期命名. 嗨瑞恩,为了清楚起见,你能确认我的完整代码应该是什么样子吗?只是为了确保我已经更改了正确的部分等。 克里斯,很抱歉这不是很顺利 :( 我编辑了我的帖子以包含我测试的整个子例程。我在 Windows 10 上运行 32 位 Excel 2016。 嗨瑞恩。我相信我可能已经找到了错误。由于我在提问时提供了测试工作簿,因此测试数据从表 1 中的 A 列开始。但是,我正在处理的实际数据从表 4 的 L2(列标题位于 L2)开始。

以上是关于使用 VBA 代码从数据列创建数据透视的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vba 从具有多个数据字段的 excel 数据透视表中删除小计

Excel VBA。从Personal.xlsb创建数据透视表

VBA数据透视表:添加过滤器

VBA代码在数据透视表旁边的列中向下拖动公式

你能在VBA中更改数据透视表的源代码吗?

使用 VBA 根据下拉选择过滤多个数据透视表