Я использую VBA для создания сводной таблицы, используя цикл For Each для вставки полей строки из динамического массива (установка положения с помощью Application.Match). Как мне исправить эту ошибку позиции?
Run-time error '1004':
Unable to set the Position property of the PivotField class
Я думал, что p в .position
может быть чувствительным к регистру, так как он находится в верхнем регистре при поиске в Интернете, но редактор Excel VBA исправляет его в нижний регистр. РЕДАКТИРОВАТЬ: потому что я ранее объявил position
в качестве переменной, которую я в конечном итоге пересмотрел. Объявление Position
исправило это. Однако ошибка остается
Sub ReportPivot ()
'
' ReportPivot Macro
'
' Deactivate ScreenUpdating
Application.ScreenUpdating = False
' Declare Variables
Dim DataSheet As Worksheet
Dim LastRow As Long
Dim LastCol As Long
Dim DataRange As Range
Dim PSheet As Worksheet
Dim PCache As PivotCache
Dim PTable As PivotTable
Dim PField As PivotField
' Name Data Sheet
ActiveSheet.Name = "Data"
' Define DataSheet
Set DataSheet = Worksheets("Data")
' Define DataRange
Set DataRange = DataSheet.Cells(1, 1).CurrentRegion
' Add the Processed Report sheet
Set PSheet = ActiveWorkbook.Worksheets.Add
PSheet.Name = "Processed Report"
' Insert DataPivotTable
Set PTable = PSheet.PivotTableWizard(SourceType:=xlDatabase, _
SourceData:=DataRange, _
TableDestination:=PSheet.Cells(2, 2), _
TableName:="DataPivotTable", _
RowGrand:=False, _
ColumnGrand:=False)
' Set to Tabular Layout
PTable.RowAxisLayout xlTabularRow
' Insert Row Fields
Dim RowFields As Variant
RowFields = Array("productid", "Start Date", "End Date", "OriginalBlock", "ReleaseDays", "ReleaseDate")
Dim field
For Each field In RowFields
Set PField = PTable.pivotFields(field)
With PField
.Orientation = x1RowField
.position = Application.Match(field, RowFields, False)
.Subtotals(place) = False
End With
Next field
' Ungroup Date Fields
Dim DateFields As Variant
DateFields = Array("Start Date", "End Date", "ReleaseDate")
Dim dfield
For Each dfield In DateFields
Set PField = PTable.pivotFields(dfield)
PField.DataRange.Cells(1).Ungroup
Next dfield
' Sort oldest to newest
PTable.pivotFields("Start Date").AutoSort _
xlAscending, "Start Date"
' Resize columns
Cells.EntireColumn.AutoFit
' Deactivate repeat labels
PTable.RepeatAllLabels xlDoNotRepeatLabels
' Reactivate ScreenUpdating
Application.ScreenUpdating = True
end sub
Вот некоторые примеры данных (csv):
productid,OriginalBlock,ReleaseDays,ReleaseDate,Start Date,End Date
JRS,16,6,,5/1/2019,5/31/2019
JRS,16,6,,5/1/2020,5/31/2020
JRS,16,8,,6/26/2020,6/27/2020
JRS,16,15,,6/28/2020,7/25/2020
JRS,1,22,,7/26/2020,8/25/2020
MAS,11,6,,5/1/2019,5/31/2019
MAS,11,8,,6/1/2019,6/27/2019
MAS,11,15,,6/28/2019,7/25/2019
MAS,1,22,,7/26/2019,8/25/2019
MAS,11,15,,8/26/2019,9/8/2019
MAS,11,8,,9/9/2019,9/30/2019
MAS,11,6,,10/1/2019,10/5/2019
MAS,11,6,,5/1/2020,5/31/2020
MAS,1,22,,7/26/2020,8/25/2020
SUP,25,6,,5/1/2019,5/31/2019
SUP,25,8,,6/1/2019,6/27/2019
SUP,25,15,,6/28/2019,7/25/2019
SUP,1,22,,7/26/2019,8/25/2019
SUP,25,15,,8/26/2019,9/8/2019
SUP,25,8,,9/9/2019,9/30/2019
SUP,25,6,,10/1/2019,10/5/2019
SUP,25,6,,5/1/2020,5/31/2020
SUP,25,8,,6/1/2020,6/24/2020
SUP,25,15,,6/25/2020,7/25/2020
SUP,1,22,,7/26/2020,8/25/2020
SUP,25,15,,8/26/2020,9/8/2020
SUP,25,8,,9/9/2020,9/30/2020
SUP,25,6,,10/1/2020,10/6/2020