VBA:如何根据复选框筛选 sheet?

VBA: How to filter through a sheet based on a checkbox?

我是 VBA 的新手,我正在尝试设置一个可自定义的 sheet,允许用户根据我设置的复选框过滤某些列。到目前为止,我了解复选框的工作原理以及如何将它们集成到代码中,但我认为自动筛选功能存在问题。具体来说,我认为我为 Criteria1 输入了错误的值。

我一直在四处寻找类似的编码问题,但 none 似乎可以解决我正在尝试做的问题。

TL;DR 我认为我的问题在于如何格式化数组以放入 AutoFilter()

的 Criteria1
Sub Auto_filter()

'variables are for checkboxes'
    Dim VC1500 As Shape 
    Dim VC7500 As Shape
    Dim VC144024 As Shape

'initiates to check for the checkboxes'
   Set VC1500 = Sheets("Sheet7").Shapes("Check Box 4")
   Set VC7500 = Sheets("Sheet7").Shapes("Check Box 5")
   Set VC144024 = Sheets("Sheet7").Shapes("Check Box 6")

'if statement that will add a string to strCriteria if checkbox is true'
    If VC1500.OLEFormat.Object.Value = 1 Then
       strCriteria = strCriteria & ", VC1500"
    End If

    If VC7500.OLEFormat.Object.Value = 1 Then
       strCriteria = strCriteria & ", VC7500"
    End If

    If VC144024.OLEFormat.Object.Value = 1 Then
       strCriteria = strCriteria & ", 144024"
    End If

'with statement that finds for column vendor then filter it based on 
strCriteria, I think this is where my issue is'

    With Worksheets("Open Purchase Orders")
        With .Range("A1", .Cells(1, Columns.Count).End(xlToLeft))
            Set vendorfind = .Rows(1).Find("Vendor")
            If Not vendorfind Is Nothing Then
                .AutoFilter Field:=vendorfind.Column, 
           Criteria1:=Split(strCriteria, ", "), Operator:=xlFilterValues
            End If
        End With
         .AutoFilterMode = False
   End With

End Sub

我希望根据复选框过滤 sheet。 我收到运行时错误 9 error:subscript 超出范围

您尝试过使用 Slices 吗? 它很简单,应该在没有宏的情况下进行简单的过滤。

Select 您的数据 > 插入 Table。 table 完成后,您可以从“设计”选项卡 select "Insert Slicer"。 试试这是否能解决您的问题。

在我看来,该代码的某些部分就像用右手在头顶上方抓挠左耳一样。但是我并不完全清楚它的实际外观(示例会有所帮助)-每个供应商是否都有一些单独的指示栏?如果是这样,你在那里过滤什么?从外观上看是供应商标签?

例如,这是针对可能包含 3 个名称的单个供应商列 (D) 的解决方案。它基本上应用值列表的自动过滤器。 (我在下面使用了 activex 复选框,因为可以直接访问它们的属性。)

Private Sub VC1500_Click()
Update_Filter
End Sub

Private Sub VC7500_Click()
Update_Filter
End Sub

Private Sub VC144024_Click()
Update_Filter
End Sub

Private Sub Update_Filter()
Dim varr_filter(3) As String
Dim indshow As Boolean
indshow = True
If VC1500 Then
    varr_filter(0) = VC1500.Caption
    indshow = False
End If
If VC7500 Then
    varr_filter(1) = VC7500.Caption
    indshow = False
End If
If VC144024 Then
    varr_filter(2) = VC144024.Caption
    indshow = False
End If
If indshow Then
    Range("$A:$D").AutoFilter
Else
    Range("$A:$D").AutoFilter field:=4, Criteria1:=varr_filter, Operator:=xlFilterValues
End If
End Sub

注意:选择正确的过滤列作为 "field" 值,如果您出于某种原因希望将复选框与表单分开,请添加“”"sheets("sheetname").{每个复选框}""".

或者,如果每个 vcs 都有一个单独的列,并寻找字面意思是 "vendor" 的行,我会像这样将它们合并到 sheet 中:

E2=if(cond1)*checkbox1 + if(cond2)*checkbox2 + if(cond3)*checkbox3 ; E > 0.
Cond1 could be b2="Vendor", for example.
To make the sheet display all cols when no ticks are selected,
I've added another value: 1 - max(checkboxes).
E6=1-MAX($H:$H) + IF(AND(B2="Vendor"),1,0)*$H +
   IF(AND(C2="Vendor"),1,0)*$H + IF(AND(D2="Vendor"),1,0)*$H

这是一个隐藏的 sheet 值有帮助的例子,因为您实际上可以在没有 vb 的情况下定义这样一列。然后,代码本身被简化了一点。

Private Sub VC1500_Click()
If VC1500.Value Then
    Range("$H").Value = 1
Else
    Range("$H").Value = 0
End If
Update_Filter
End Sub

Private Sub VC7500_Click()
If VC7500.Value Then
    Range("$H").Value = 1
Else
    Range("$H").Value = 0
End If
Update_Filter
End Sub

Private Sub VC144024_Click()
If VC144024.Value Then
    Range("$H").Value = 1
Else
    Range("$H").Value = 0
End If
Update_Filter
End Sub

Private Sub Update_Filter()
Range("$A:$E").AutoFilter field:=5, Criteria1:=">0", Operator:=xlFilterValues
End Sub

转换到表单控件也更容易,方法是在单击时检查范围值而不是复选框,并隐藏 H 列。虽然不完全可靠,但对普通用户来说已经足够了。要么那样,要么像你写的那样阅读形状。


编辑:在上面为两种情况(单列、多列)添加了测试代码,包括在未选中复选框时显示所有行而不是 none。这是演示镜头。

Single col code

Single col sample sheet

Single col filtered

Multicol code

Multicol sample

Multicol filtered