使用复选框过滤数据透视表

时间:2016-10-20 13:29:34

标签: excel vba excel-vba

我正在使用以下代码:

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=下遇到一个障碍作为对象变量或未设置。为了让这个控件正常工作,我在这里错过了什么?我也避免使用切片机。

感谢。

3 个答案:

答案 0 :(得分:0)

这种控制有它自己的事件,你应该使用它。因此:

  1. 转到您有复选框的工作表
  2. 上的开发者标签页上设置Design mode
  3. 双击check box至...
  4. ...请参阅Private Sub CheckBox1_Click()
  5. 之类的内容
  6. 在该子程序中调用您的子程序:

    Private Sub CheckBox1_Click()
         call   checkboxfilter
    End Sub
    

答案 1 :(得分:0)

我能够根据调整set cb =作为.Checkboxes的格式类型进行修改,并确保每个枢轴fielt都被准确地调用为@KazimierzJawor指出。此外,对于此类型,值必须为0或1而不是TrueFalse。更正并在下面的最终代码。

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

答案 2 :(得分:0)

    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