VBA使用复选框选择多个案例

时间:2017-07-04 08:05:44

标签: excel vba excel-vba

我设计了一个带有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

我也附上了图片,供参考。在Image中,我刚刚以3 Checkbox为例。 This is the example of case1, where one Checkbox is selected and the displays the result of autofilter1. This is the example of case2, where the checkbox1 and 2 are selected and Displays the result of autofilter1 and 2. Case3, is where nothing is selected and it Displays the original sheet, Clearing the filter.

1 个答案:

答案 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}}事件处理程序。