【问题标题】:VBA to use Checkbox Selection for Multiple casesVBA 对多个案例使用复选框选择
【发布时间】:2017-07-04 08:05:43
【问题描述】:

我设计了一个带有 7 个复选框的用户表单。每个 Checkbox 都有一个调用函数,称为自动筛选。此功能自动过滤,有助于过滤我的工作表中的字段 4 并显示结果。

这里,我有 3 个案例。

案例 1。当 Checkbox1 被选中时,显示 autofilter1 的结果。

case2:当 checkboxes1 和 2 被选中时,显示 autofilter1 和 2 的结果。

注意:用户不必只选择复选框 1 和 2,它可以是复选框 2 和 3 或 1 和 3 也可以选择。

案例3:当没有选择任何内容时,清除过滤器。

我成功生成了case1的情况,我应该如何进行,才能实现case2和case3。

下面是自动过滤功能,分配给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

自动筛选功能分配给复选框 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

我也附上了图片,供参考。在图像中,我刚刚以 3 Checkbox 为例。

【问题讨论】:

  • 下次小结一下,问一下基础问题。为每个案例制作一个 sub,并 'select case true : case checkbox1.value : sub1: case check2: sub2 .....end select'。抱歉,我正在使用手机应用程序,无法更好地格式化代码。
  • 是的,下次我会这样做

标签: vba excel


【解决方案1】:

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

我制作了一个带有 3 个复选框的用户窗体。

每个事件处理程序只触发DoFilter() 方法,该方法检查复选框,对于那些为真的复选框,基于它们的Caption 构建字符串数组(如您的示例图片中所示)并将该数组传递给自动过滤器。如果 Array 为空,则自动过滤器将被禁用。

编辑: 在 Visual Basic 编辑器 (ALT+F11) 的“项目”窗口中,右键单击。在菜单中选择Insert -> UserForm。在此用户窗体上,添加一些复选框。对于每个复选框,将“属性”窗口中的 Caption 属性更改为要在过滤范围内显示的值,例如根据问题,CheckBox1.Caption 将是“美国”。接下来,右键单击用户表单模块并选择View 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

**附加编辑:**N.b.在这种情况下,一旦您更改复选框,过滤器就会触发。如果要在单击命令按钮时应用过滤器,也可以将以下代码放在 UserForm 模块中,而不是 Private Sub CheckBox#_Change()

Private Sub CommandButton4_Click()
    DoFilter
End Sub

您可能希望使用Control Array 以便不单独列出每个CheckBox_Change 事件处理程序。

【讨论】:

  • 你能告诉我我们在哪里添加这个 Private Sub do filter() ,它在模块中吗?
  • 在这种情况下的用户表单中。
  • 表示,用户表单点击()
  • Ì 对此代码没有清晰的背景概念。能否请您详细解释一下
  • 你能上传一份工作表吗,我会很容易理解,而不是用文字解释。我的 VBA 知识很基础
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 2014-09-09
相关资源
最近更新 更多