Уважаемые эксперты и гуру,
Я написал следующий код для сводной таблицы, и она генерирует ошибку pi.Visible.
Sub piVisibleMismatch()
Dim lastrow As Long, endrow As Long
Dim Psheet As Worksheet, Dsheet As Worksheet
Dim Pcache As PivotCache, Ptable As PivotTable, Prange As Range
Dim i As Long, j As Long, pi As PivotItem
Dim currep_date As Date
Application.ScreenUpdating = False
currep_date = "31/10/2019"
Worksheets("Summary").UsedRange
Worksheets("PivotTable").Activate
ActiveSheet.Cells.ClearContents
ActiveSheet.Cells.ClearFormats
ActiveSheet.Tab.ColorIndex = xlColorIndexNone
Set Psheet = Worksheets("PivotTable")
Set Dsheet = Worksheets("Summary")
lastrow = Dsheet.Cells(Rows.Count, 1).End(xlUp).Row
Set Prange = Dsheet.Range("A2:O" & lastrow)
On Error Resume Next
Set Pcache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=Prange). _
CreatePivotTable(TableDestination:=Psheet.Cells(6, 1), TableName:="Total_Table")
Set Ptable = Pcache.CreatePivotTable(TableDestination:=Psheet.Cells(6, 1), TableName:="Total_Table")
With ActiveSheet.PivotTables("Total_Table").PivotFields("Balance 2")
.Orientation = xlDataField
.Position = 1
.Function = xlSum
End With
With ActiveSheet.PivotTables("Total_Table").PivotFields("Type of Account")
.Orientation = xlPageField
.Position = 1
End With
With ActiveSheet.PivotTables("Total_Table").PivotFields("Collection Date")
.Orientation = xlPageField
.Position = 3
End With
With ActiveSheet.PivotTables("Total_Table").PivotFields("Reporting CCY")
.Orientation = xlColumnField
.Position = 1
End With
ActiveSheet.PivotTables("Total_Table").PivotFields("Type of Account").CurrentPage = "Regular"
With ActiveSheet.PivotTables("Total_Table").PivotFields("Collection Date")
For Each pi In .PivotItems
If CDate(pi.Name) > currep_date + 30 Then
pi.Visible = False
End If
Next pi
End With
On Error GoTo 0
ActiveSheet.PivotTables("Total_Table").ShowTableStyleRowStripes = True
ActiveSheet.PivotTables("Total_Table").TableStyle2 = "PivotStyleLight2"
ActiveSheet.UsedRange
ActiveSheet.Range("B:F").Select
Selection.Style = "Comma"
Selection.NumberFormat = "_(* #,##0.0_);_(* (#,##0.00);_(* ""-""??_);_(@_)"
Selection.NumberFormat = "_(* #,##0.00_);_(* (#,##0.00);_(* ""-""??_);_(@_)"
ActiveSheet.Cells.Font.Name = "Arial"
ActiveSheet.Cells.Font.Size = 8
ActiveSheet.Range("A:A").ColumnWidth = 35#: ActiveSheet.Range("B:F").ColumnWidth = 15#
ActiveSheet.Range("A1").Select
On Error GoTo 0
Application.ScreenUpdating = True
End Sub
У меня была похожая ошибка для 2другие листы, но после отладки в течение более 5 часов я мог отследить ошибку несоответствия lastrow. Последняя строка в исходной рабочей таблице для сводной таблицы была обновлена и состояла из строк с непреднамеренными данными во время отладки. Когда я заметил, что диапазон данных для сводной таблицы и номер последней строки различаются, я удалил ненужные данные, запустил макрос, который корректно обновил последнюю строку, а затем правильно отфильтровал дату.
В существующей рабочей таблице датыв исходной рабочей таблице указан тип данных date, а переменная currep_date также указана в типе данных date. Я ломал голову больше, чем делал раньше, и исследую статьи на многих веб-сайтах, чтобы определить ошибку, но я все еще не понимаю.
Я ценю ваше время и делюсь вашими ценными знаниями и просьбой о любой альтернативе. решение для фильтрации дат без изменения типа данных.
С уважением, Рошан Шакья