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

筛选包含各种字符组合的单元格的Excel列,excel,vba,filter,Excel,Vba,Filter,我试图根据另一列中的单元格(比如复选框是通过复选框选中的)来过滤Excel中的一个区域(比如数据)。它看起来像这样: 资料 aa ab 交流电 文学士 bb 卑诗省 ca cb 抄送 复选框 a[x] b[x] c[x] 因此,如果在复选框列下选中“a”,则数据列将显示仅包含字母a的单元格,而不是“b”或“c”。但如果勾选“a”和“b”,数据列将显示包含字母a或b的单元格,而不是包含字母c的单元格。如果所有三个“a”、“b”和“c”都被选中,那么显然不需要任何过滤 我想在两列的大量数据中实现这一

我试图根据另一列中的单元格(比如复选框是通过复选框选中的)来过滤Excel中的一个区域(比如数据)。它看起来像这样:

资料 aa ab 交流电 文学士 bb 卑诗省 ca cb 抄送

复选框 a[x] b[x] c[x]

因此,如果在复选框列下选中“a”,则数据列将显示仅包含字母a的单元格,而不是“b”或“c”。但如果勾选“a”和“b”,数据列将显示包含字母a或b的单元格,而不是包含字母c的单元格。如果所有三个“a”、“b”和“c”都被选中,那么显然不需要任何过滤

我想在两列的大量数据中实现这一点。
非常感谢您的帮助,谢谢

这可以通过几种不同的方式来实现。然而,这是一种你可以完成你想要做的事情的方法。 使用“开发人员”选项卡中的“设计模式”创建三个复选框,然后简单地指定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

你不能像你描述的那样做

筛选需要列标题。数据必须从第2行开始,而不是第1行。 只能对整行或整列执行筛选或隐藏。如果A被隐藏,C1:C3中的复选框也将被隐藏。 重新考虑你的建议,并尝试完成一些事情来解决问题。如果你遇到麻烦,请编辑你的帖子以包含新的详细信息

如果在复选框列下选中“a”,则数据列将显示仅包含字母a的单元格,而不是“b”或“c”。但如果勾选“a”和“b”,数据列将显示包含字母a或b的单元格,而不是包含字母c的单元格。如果所有三个“a”、“b”和“c”都被选中,那么显然不需要任何过滤

这里有一个有效的方法

使用Developer、Controls和Insert添加三个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
您的结果应该与以下类似

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

非常感谢您的回复,我已经尝试了您的建议。它在一定程度上起作用。问题是,我希望列A筛选只包含与复选框匹配的字符的单元格。因此,如您提供的图片所示,如果勾选了“a”,则在过滤列中只应显示“aa”。如果勾选了“a”和“c”,则过滤列将显示任何包含“a”和“c”组合的单元格。谢谢。我已根据您的建议调整了我的帖子。谢谢!我还通过=FILTER函数在GoogleSheets中实现了它,并做了一些调整。不幸的是,Excel中还没有此功能。