筛选Excel列中包含各种字符组合的单元格

时间:2019-02-13 00:34:19

标签: excel vba filter

我正在尝试根据是否通过复选框选中另一列(例如CHECKBOXES)中的单元格来过滤Excel中的一个区域(例如DATA)。看起来像这样:

数据
aa
ab
ac
ba
bb
bc
ca
cb
cc

复选框
一个[x]
b [x]
c [x]

因此,如果在CHECKBOXES列下选中了'a',则DATA列将显示仅包含字母a而不包含'b'或'c'的单元格。但是,如果选中了“ a”和“ b”,则DATA列将显示包含字母a OR b而不是c的单元格。如果同时检查了三个“ a”,“ b”和“ c”,显然将不需要任何过滤。

我想用两列在大范围数据上实现这一点。 非常感谢您的任何帮助。

2 个答案:

答案 0 :(得分:1)

这可以通过几种不同的方式完成。但是,这是您完成要完成的工作的一种方法。 通过在开发人员标签中使用设计模式创建三个复选框,然后只需分配3个宏即可执行3个不同的按钮。您也可以只创建一个子,而不只是让一个子(宏)完成所有工作。真的取决于您。

 Sub OptionButton1_Click()

 Range("A1").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$A$10").AutoFilter Field:=1, Criteria1:="=a*", _
        Operator:=xlAnd

End Sub

Sub OptionButton2_Click()
 Range("A1").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$A$10").AutoFilter Field:=1, Criteria1:="=b*", _
        Operator:=xlAnd
End Sub

Sub option3_click()
 Range("A1").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$A$10").AutoFilter Field:=1, Criteria1:="=c*", _
        Operator:=xlAnd
End Sub

enter image description here

答案 1 :(得分:0)

您无法按照您描述的方式进行操作。

  1. 过滤需要一个列标题。数据必须从第2行开始,而不是第1行。
  2. 只能在整行或整列上执行过滤或隐藏。如果 A的被隐藏,则C1:C3中的复选框也将被隐藏。

重新考虑您的建议,并尝试解决问题。如果您遇到麻烦,请修改帖子以包含新的详细信息。

  

如果在“复选框”列下选中了“ a”,则“数据”列将显示仅包含字母a而不包含“ b”或“ c”的单元格。但是,如果选中了“ a”和“ b”,则“数据”列将显示包含字母“ a”或“ b”但不包含“ c”的单元格。如果同时检查了三个“ a”,“ b”和“ c”,显然将不需要任何过滤。

这是一种有效的方法。

  • 使用开发人员,控件,插入来添加三个 ActiveX复选框添加“表单控件”复选框,并添加任何类型的“选项”按钮。
  • 一个接一个地右键单击 ActiveX复选框,然后访问属性。将名称更改为 CheckBoxA,CheckBoxB CheckBoxC ,将标题更改为 A,B C
  • 适当调整复选框的大小,并将其放置在第一行,在该行中不会通过过滤值将其隐藏。当您对结果满意时,请单击开发人员,控件,设计模式以退出设计模式。
  • 右键单击工作表的名称选项卡,然后选择“查看代码”。粘贴以下内容。

    Option Explicit
    
    Sub CheckBoxABC_Click()
    
        Dim i As Long, dict As Object, str As String
    
        Set dict = CreateObject("scripting.dictionary")
        dict.comparemode = vbTextCompare
    
        If AutoFilterMode Then AutoFilterMode = False
    
        With Range(Cells(1, "A"), Cells(Rows.Count, "A").End(xlUp))
    
            For i = 2 To .Rows.Count
                'store the cell value
                str = .Cells(i, "A").Value
    
                'see if it might belong and add it
                If CBool(InStr(1, str, "A", vbTextCompare)) And .Parent.CheckBoxA Then _
                    dict.Item(str) = vbNullString
                If CBool(InStr(1, str, "B", vbTextCompare)) And .Parent.CheckBoxB Then _
                    dict.Item(str) = vbNullString
                If CBool(InStr(1, str, "C", vbTextCompare)) And .Parent.CheckBoxC Then _
                    dict.Item(str) = vbNullString
    
                'see if it doesn't belong and remove it
                If dict.Exists(str) And CBool(InStr(1, str, "A", vbTextCompare)) And Not .Parent.CheckBoxA Then _
                    dict.Remove str
                If dict.Exists(str) And CBool(InStr(1, str, "B", vbTextCompare)) And Not .Parent.CheckBoxB Then _
                    dict.Remove str
                If dict.Exists(str) And CBool(InStr(1, str, "C", vbTextCompare)) And Not .Parent.CheckBoxC Then _
                    dict.Remove str
    
            Next i
    
            If dict.Count > 0 Then
                .AutoFilter field:=1, Criteria1:=dict.keys, Operator:=xlFilterValues, VisibleDropDown:=False
            Else
                .AutoFilter field:=1, Criteria1:="Z", VisibleDropDown:=False
            End If
    
        End With
    End Sub
    
    Private Sub CheckBoxA_Click()
        CheckBoxABC_Click
    End Sub
    
    Private Sub CheckBoxB_Click()
        CheckBoxABC_Click
    End Sub
    
    Private Sub CheckBoxC_Click()
        CheckBoxABC_Click
    End Sub
    
  • 您的结果应类似于以下内容。

enter image description here