Проблема с кодом VBA для создания Pivot из столбца данных - PullRequest
2 голосов
/ 05 апреля 2019

У меня есть столбец данных.У меня есть пользовательская форма с кнопкой Command, которая должна создать сводную таблицу из столбца данных.

Желательным результатом является создание сводной таблицы, которая подсчитывает, сколько раз каждое число появляется в столбце данных.Тем не менее, мой код показывает только количество всех чисел (то есть количество строк данных).

Может кто-нибудь помочь мне и сказать, где я иду не так?

Требуемые выходные данные - два столбца, первый из которых представляет собой метки строк, в которых перечислены все числа, а второй - число этих чисел, показывающее, сколько раз каждый из них появляется.


     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 Ответ

0 голосов
/ 05 апреля 2019

Я полагаю, что вы столкнулись с некоторой проницательностью 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) вы добавляете 'Calling Number' в заголовки столбцов. (2) вы добавляете 'Calling Number' в заголовки строк. (3) вы добавляете количество вызывающих номеров в поля данных.

Тебе не нужно (1). Мы просто делаем заголовки строк. Кроме того, по какой-то причине, когда вы используете то же поле в DataFields, что и в PivotFields, вы должны добавить поля сводки ПОСЛЕ добавления полей данных. Я действительно не знаю почему, я признаю, что наткнулся на это случайно. Но, запустив приведенный выше код, пропустив некоторые тестовые данные, я получаю следующее (что, я думаю, то, что вы ищете)

enter image description here enter image description here

Надеюсь, это поможет!

...