Фильтровать сводные таблицы с помощью флажка

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

У такого элемента управления есть собственное событие, и вы должны его использовать. Поэтому:

  1. перейдите на лист, где у вас есть свой флажок
  2. установите Design mode на вкладке разработчик на
  3. дважды щелкните на вас check box , чтобы…
  4. …смотрите что-то вроде Private Sub CheckBox1_Click()
  5. внутри этого подраздела вызовите свою подпрограмму:

     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. Хотя этот код может дать ответ на вопрос, предоставление информации о том, как и почему он решает проблему, повышает его долгосрочную ценность.