使用userform

时间:2017-08-15 14:52:17

标签: excel vba excel-vba

我有一个用三个列表框设计的用户表单。 3个列表框由三个不同表格中的位置填充。

通过选择列表框,用户可以过滤“数据”表中的数据。

如果用户从Listbox1中选择“BBE Bebra”。然后他可以在工作表中找到Bebra的过滤结果。

类似地,如果用户从Listbox2中选择,则遵循相同的过程,并且如果用户从listbox3中进行选择,则遵循相同的过程。

用户还可以选中所有三个复选框,并在工作表中查找过滤结果。

我的工作代码存在问题。

  1. 如果我选中复选框并单击“过滤器”,则我始终会看到过滤后的结果。下次我点击过滤器按钮时,我希望看到整个数据表清除过滤器并清除复选框。
  2. 有人能告诉我怎么做吗?

    Eevrytime, I  could see the previous checked boxes in the userform. Instead I would like to have the clear checkbox. (This means, when I click the button in my sheet which displays the userform should clear the filter result.

    以下是我在过滤器按钮中使用的代码

    Sub DoFilter()
    Dim strCriteria() As String
    Dim strCriteria2() As String
    Dim strcriteria3() As String
    Dim arrIdx As Integer
    Dim arrIdx2 As Integer
    Dim arrIdx3 As Integer
    Dim xRow As Integer
    Dim arrCounter As Integer
    Dim lo As ListObject
    arrIdx = 0
    arrIdx2 = 0
    arrIdx3 = 0
    For xRow = 2 To Last(1, List.Cells)
        If List.Cells(xRow, 2) = True Then
            ReDim Preserve strCriteria(0 To arrIdx)
            strCriteria(arrIdx) = List.Cells(xRow, 3)
            arrIdx = arrIdx + 1
        End If
    Next xRow
    For xRow = 2 To Last(1, List.Cells)
        If List_Man.Cells(xRow, 2) = True Then
            ReDim Preserve strCriteria2(0 To arrIdx2)
            strCriteria2(arrIdx2) = List_Man.Cells(xRow, 3)
            arrIdx2 = arrIdx2 + 1
        End If
    Next xRow
    
    For xRow = 2 To Last(1, List.Cells)
    If List_S.Cells(xRow, 2) = True Then
    ReDim Preserve strcriteria3(0 To arrIdx3)
    strcriteria3(arrIdx3) = List_S.Cells(xRow, 3)
    arrIdx3 = arrIdx3 + 1
    End If
    Next xRow
    
    Set Ws = ThisWorkbook.Sheets("Data")
    Set lo = Ws.ListObjects("Table7")
    If arrIdx = 0 And arrIdx2 = 0 And arrIdx3 = 0 Then
        'Ws.UsedRange.AutoFilter
    Else
        With Ws
        With lo
    
          '.AutoFilterMode = True
    
           ' .UsedRange.AutoFilter
            If arrIdx <> 0 Then
               .Range.AutoFilter field:=13, Criteria1:=Array(strCriteria), Operator:=xlFilterValues
            End If
            If arrIdx2 <> 0 Then
               .Range.AutoFilter field:=14, Criteria1:=Array(strCriteria2), Operator:=xlFilterValues
            End If
            If arrIdx3 <> 0 Then
           .Range.AutoFilter field:=15, Criteria1:=Array(strcriteria3), Operator:=xlFilterValues
            End If
    
            If .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then
                MsgBox " Your filter has no result"
            End If
        End With
        End With
    
    Dim i As Long
    On Error Resume Next
         With ThisWorkbook.Worksheets("Dev").PivotTables("PivotTable1").PivotFields("Lo.")
            .ClearAllFilters
            For i = 1 To .PivotItems.Count
                .PivotItems(i).Visible = False
            Next
           For arrCounter = LBound(strCriteria) To UBound(strCriteria)
                .PivotItems(strCriteria(arrCounter)).Visible = True
            Next arrCounter
        End With
    End If
    End Sub
    

    我在我的按钮“过滤器”中调用函数do filter。 按钮“退出”我总是有 以下代码

    Private Sub CBExit_Click()
    If ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
    End If
    
    Sheets("Dev").Select
    Sheets("Dev").PivotTables("PivotTable1").PivotFields("Development Loc.").ClearAllFilters
    Unload Me
     End Sub
    

1 个答案:

答案 0 :(得分:0)

您需要使用某种标志跟踪当前状态。我会做类似以下的事情:

Private Sub Filter_Click()
   If Filter.Caption = "Filter" Then
      DoFilter
      Filter.Caption = "Unfilter"
   Else
      'do logic to clear
      Filter.Caption = "Filter"
   End If
End Sub

这样做的另一个好处是告诉用户下次点击该按钮会做什么。