我正在尝试根据是否通过复选框选中另一列(例如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”,显然将不需要任何过滤。
我想用两列在大范围数据上实现这一点。 非常感谢您的任何帮助。
答案 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
答案 1 :(得分:0)
您无法按照您描述的方式进行操作。
重新考虑您的建议,并尝试解决问题。如果您遇到麻烦,请修改帖子以包含新的详细信息。
如果在“复选框”列下选中了“ a”,则“数据”列将显示仅包含字母a而不包含“ b”或“ c”的单元格。但是,如果选中了“ a”和“ b”,则“数据”列将显示包含字母“ a”或“ b”但不包含“ c”的单元格。如果同时检查了三个“ 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
您的结果应类似于以下内容。