#vba #excel
#vba #excel
Вопрос:
Я работаю со следующим кодом:
Option Explicit
Sub checkboxfilter()
Dim cb As CheckBox
Dim oWS As Worksheet
Dim oWB As Workbook
Dim oPvt As PivotTable
Dim oPvtField As PivotField
Dim oPvtFilter As PivotFilter
Set cb = oWS("Control").Controls("YTD Filter")
If cb.Value = True Then
For Each oWS In ThisWorkbook.Worksheets
For Each oPvt In oWS
With oPvtField
.CurrentPage.Name = "Yes"
End With
Next oPvt
Next oWS
End If
End Sub
цель состоит в том, чтобы переключать каждую сводную таблицу в книге с помощью текущего фильтра с помощью флажка. Код наталкивается на препятствие под set cb=
как объектной переменной или с не заданным значением. Чего мне здесь не хватает, чтобы заставить этот элемент управления работать? Я также избегаю использования среза.
Спасибо.
Ответ №1:
У такого элемента управления есть собственное событие, и вы должны его использовать. Поэтому:
- перейдите на лист, где у вас есть свой флажок
- установите
Design mode
на вкладке разработчик на - дважды щелкните на вас
check box
, чтобы… - …смотрите что-то вроде
Private Sub CheckBox1_Click()
-
внутри этого подраздела вызовите свою подпрограмму:
Private Sub CheckBox1_Click() call checkboxfilter End Sub
Комментарии:
1. Спасибо, однако это не решает проблему фильтрации с помощью приведенного выше кода.
2. вы спросили, как инициировать действие с помощью флажка 🙂 при просмотре вашего кода кажется, что вам все еще нужно связать свои
oPvt
со сводными полями. на данный моментoPvtField
кажетсяNothing
.
Ответ №2:
Я смог пересмотреть, изменив тип формата set cb =
как .Checkboxes
и убедившись, что при каждом сводном поле было точно вызвано, как указал @KazimierzJawor. Дополнительно с этим типом значение должно было быть 0 или 1, а не True
или False
. Исправленный и окончательный код ниже.
Private Sub checkboxfilter()
Dim cb As CheckBox
Dim oWS As Worksheet
Dim oWB As Workbook
Dim oPvt As PivotTable
Dim oPvtField As PivotField
Dim oPvtFilter As PivotFilter
Set cb = Sheets("Control").CheckBoxes("YTD Filter")
If cb.Value = 1 Then
For Each oWS In ThisWorkbook.Worksheets
For Each oPvt In oWS.PivotTables
With oPvt.PivotFields("YTD?")
.CurrentPage = "Yes"
End With
Next oPvt
Next oWS
Else
For Each oWS In ThisWorkbook.Worksheets
For Each oPvt In oWS.PivotTables
With oPvt.PivotFields("YTD?")
.CurrentPage = "(All)"
End With
Next oPvt
Next oWS
End If
End Sub
Ответ №3:
Sub PivotFilter()
Dim pvtF As PivotField
Dim pvtI As PivotItem
Dim StartDate As Date
Dim EndDate As Date
Dim pvtIVal As String
StartDate = DateValue("Jan 1, 2018")
EndDate = Application.WorksheetFunction.EoMonth(Date, 0)
ActiveSheet.PivotTables("PivotTable1").PivotFields("Create Month").ClearAllFilters
Set pvtF = ActiveSheet.PivotTables("PivotTable1").PivotFields("Create Month")
For Each pvtI In pvtF.PivotItems
If (pvtI <> "(blank)") Then
If DateValue(pvtI) >= StartDate And DateValue(pvtI) <= EndDate Then
pvtI.Visible = True
Else
pvtI.Visible = False
End If
Else
pvtI.Visible = False
End If
Next pvtI
End Sub
Комментарии:
1. Хотя этот код может дать ответ на вопрос, предоставление информации о том, как и почему он решает проблему, повышает его долгосрочную ценность.