VBA使用checkboxselect多个情况

我devise了一个7checkboxes的用户表单。 每个checkbox都有一个调用函数,称为自动filter。 这个function自动filter,有助于过滤我的表中的字段4,并显示结果。

在这里,我有三个案例。

情况1。 当选中checkbox1时,显示自动筛选器1的结果。

情况2:selectcheckbox1和2时,显示自动筛选器1和2的结果。

注意:用户不需要selectcheckbox1和2,它可以是checkbox2和3,也可以是1和3,也可以是3select。

案例3:当没有select任何东西时,清除filter。

我成功案例1情况,我应该如何进行,以实现案例2和案例3。

下面是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 

自动筛选function分配给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 

自动筛选function分配给checkbox3。

 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 

在命令button,“去”,我有以下代码,

 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 

我也附上了图片,供参考。 在图片中,我刚刚拿了3checkbox的例子。 这是case1的例子,其中一个复选框被选中,并显示autofilter1的结果。 这是case2的示例,其中checkbox1和2被选中,并显示自动筛选器1和2的结果。 情况3,没有选择任何东西,它显示原始图纸,清除过滤器。

这是用户窗体模块的代码。

我用3个checkbox做了一个UserForm。

每个事件处理程序只是触发DoFilter()方法,它检查checkbox和真正的,根据他们的Caption (如在您的示例图片)build立string数组,并将该数组传递给自动filter。 如果数组为空,则自动filter被禁用。

编辑:在Visual Basic编辑器(ALT + F11),在项目窗口中右键单击。 在菜单中selectInsert -> UserForm 。 在此用户窗体上,添加一些checkbox。 对于每个checkbox,将“属性”窗口中的Caption属性更改为您想要在过滤的范围内显示的值,例如CheckBox1.Caption根据问题将为“USA”。 接下来,右键单击用户表单模块并selectView Code 。 在代码窗口中,粘贴下面的所有内容:

 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 

**附加编辑:**在这种情况下,只要您更改checkbox,filter就会触发。 如果要在单击某个命令button时应用筛选器,还可以将下面的代码放在UserForm模块中,而不是Private Sub CheckBox#_Change()

 Private Sub CommandButton4_Click() DoFilter End Sub 

您可能需要使用一个控件数组 ,以避免每个CheckBox_Change事件处理程序单独列出。