我设计了一个带有7checkboxes的用户表单。每个Checkbox都有一个调用函数,称为autofilter。此功能自动过滤器,有助于过滤工作表中的字段4并显示结果。
在这里,我有3个案例。
案例1。选中Checkbox1时,显示autofilter1的结果。
case2:当选中checkboxes1和2时,显示autofilter1和2的结果。
注意:用户无需只选择复选框1和2,它也可以是复选框2和3或1和3,或者有时全部3选择。
案例3:未选择任何内容时,清除过滤器。
我成功生成了case1情况,我该如何进行,以实现case2和case3。
下面是autofilter函数,它被分配给checkbox1。
Sub autofilter1()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Result")
wslr = ws.Cells(Rows.Count, 1).End(xlUp).Row
Set myfilt = ws.Range("A1:D" & wslr)
myfilt.autofilter Field:=4, Criteria1:= _
"USA"
End Sub
分配给checkbox2的自动过滤功能。
Sub autofilter2()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Result")
wslr = ws.Cells(Rows.Count, 1).End(xlUp).Row
Set myfilt = ws.Range("A1:D" & wslr)
myfilt.autofilter Field:=4, Criteria1:= _
"Germany"
End Sub
分配给Checkbox 3的自动过滤功能。
Sub autofilter3()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Result_APQP")
wslr = ws.Cells(Rows.Count, 1).End(xlUp).Row
Set myfilt = ws.Range("A1:D" & wslr)
myfilt.autofilter Field:=4, Criteria1:= _
"France"
End Sub
在命令按钮中," Go",我有以下代码,
Private Sub CommandButton4_Click()
If CheckBox1.Value = True Then
Call autofilter1
End If
If CheckBox2.Value = True Then
Call autofilter2
End If
If CheckBox3.Value = True Then
Call autofiletr3
End If
End Sub
答案 0 :(得分:1)
这是UserForm模块的代码。
我创建了一个包含3个复选框的UserForm。
每个事件处理程序只触发Caption
方法,该方法检查复选框和真实的方法,根据Insert -> UserForm
构建字符串数组(如示例图片中所示)并传递该数组到AutoFilter。如果Array为空,则自动筛选器将被禁用。
修改强>
在Visual Basic编辑器(ALT + F11)中,在“项目”窗口中单击鼠标右键。在菜单中选择Caption
。在此UserForm上,添加许多CheckBoxes。对于每个复选框,将“属性”窗口中的CheckBox1.Caption
属性更改为要在过滤范围中显示的值,例如: View Code
将是" USA"根据问题。接下来,右键单击userform模块并选择Private Sub DoFilter()
Dim ws As Worksheet
Dim strCriteria() As String
Dim arrIdx As Integer
Dim cBox As Control
arrIdx = 0
For Each cBox In Me.Controls
If TypeName(cBox) = "CheckBox" Then
If cBox.Value = True Then
ReDim Preserve strCriteria(0 To arrIdx)
strCriteria(arrIdx) = cBox.Caption
arrIdx = arrIdx + 1
End If
End If
Next cBox
Set ws = ThisWorkbook.Sheets("Sheet2")
If arrIdx = 0 Then
ws.UsedRange.AutoFilter
Else
ws.Range("A:D").AutoFilter Field:=4, Criteria1:=Array(strCriteria), Operator:=xlFilterValues
End If
End Sub
Private Sub CheckBox1_Change() 'Repeat for each CheckBox on your form.
DoFilter
End Sub
Private Sub CheckBox2_Change() 'Repeat for each CheckBox on your form.
DoFilter
End Sub
Private Sub CheckBox3_Change() 'Repeat for each CheckBox on your form.
DoFilter
End Sub
。在代码窗口中,粘贴以下所有内容:
Private Sub CheckBox#_Change()
**附加编辑:** N.b。在这种情况下,只要更改复选框,过滤器就会触发。如果要在单击命令按钮时应用过滤器,还可以将以下代码放在UserForm模块中,而不是Private Sub CommandButton4_Click()
DoFilter
End Sub
CheckBox_Change
您可能希望使用Control Array,以便不会单独列出每个{{1}}事件处理程序。