Проблема с кодом VBA для создания сводки из столбца данных

#excel #vba #pivot-table

#excel #vba #сводная таблица

Вопрос:

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

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

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

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

 
     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, вам приходится добавлять поля pivot ПОСЛЕ добавления полей данных. Я действительно не знаю почему, я признаю, что наткнулся на это случайно. Но, выполнив приведенный выше фрагмент кода над некоторыми тестовыми данными, я получаю следующее (что, я думаю, вам и нужно)

введите описание изображения здесь
введите описание изображения здесь

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

Комментарии:

1. Привет, Райан. Огромное спасибо за вашу помощь. Я только что запустил код с вашими поправками, но я столкнулся с ошибкой в своей строке: PTable.AddDataField PSheet.PivotTables( _ "PRIMEPivotTable").PivotFields("Calling Number"), "Count of Calling Number", xlCount В нем говорится, что метод сводных таблиц object_Worksheet не удался

2. Я полагаю, что эта ошибка означает, что Excel испытывает трудности с поиском сводной таблицы — возможно, потому, что мы указываем не на тот лист, или сводная таблица фактически не была создана из-за какой-то другой проблемы. Попробуйте пошагово просмотреть код и подтвердить, что лист сводной таблицы активен при выполнении этого кода, что ваша сводная таблица действительно существует (должна отображаться как этот пробел-держатель без полей) и что все листы / таблицы названы так, как ожидалось.

3. Привет, Райан, просто для ясности, ты можешь подтвердить, как должен выглядеть мой полный код? Просто чтобы убедиться, что я изменил правильные части и т.д.

4. Крис, мне жаль, что это работает не так гладко : (Я отредактировал свой пост, чтобы включить всю подпрограмму, с которой я тестировал. Я использую 32-разрядный Excel 2016 в Windows 10.

5. Привет, Райан. Я полагаю, что, возможно, я обнаружил ошибку. Поскольку я предоставил тестовую книгу, задавая свой вопрос, тестовые данные начинались со столбца A на листе 1. Однако фактические данные, над которыми я работаю, начинаются с L2 (с заголовком столбца в L2) на листе 4.