#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.