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
我是 VBA 的新手,我正在尝试设置一个可自定义的 sheet,允许用户根据我设置的复选框过滤某些列。到目前为止,我了解复选框的工作原理以及如何将它们集成到代码中,但我认为自动筛选功能存在问题。具体来说,我认为我为 Criteria1 输入了错误的值。
我一直在四处寻找类似的编码问题,但 none 似乎可以解决我正在尝试做的问题。
TL;DR 我认为我的问题在于如何格式化数组以放入 AutoFilter()
的 Criteria1Sub 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