我花了3天时间寻找解决方案,我知道我很接近,但我不知道我的问题及其原因。
首先,我有一个电子表格,其中包含从B列到HG的员工姓名(A列,从第5行开始)和资源计划数据(项目的缩写)。列A-的每个列 - 代表日历的1天(列标题是日期)。
我还有一个包含3个列表框的用户表单(多选)。 LB1 =员工姓名,LB2 =项目缩写,LB3现在无关紧要。我在此用户表单上还有3个按钮,1表示重置LB选项,1表示将过滤器应用于电子表格,1表示重置电子表格上的过滤器。
我在电子表格中重置LB选择和过滤器的代码运行正常。应用过滤器的那个将不会按预期的方式工作。到目前为止,此按钮的代码如下所示(现在只尝试处理1个LB):
' Apply filter to spreadsheet
Private Sub CB_FilterActive_Click()
Dim arrMitarbeiter() As Variant
Dim i As Integer, count As Integer
count = 1
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) = True Then
ReDim Preserve arrMitarbeiter(count)
arrMitarbeiter(count) = ListBox1.List(i)
count = count + 1
End If
Next i
Worksheets("Einsatzplan").UsedRange.Cells.AutoFilter field:=1, Criteria1:=Array(arrMitarbeiter)
End Sub
这就是事情:
点击“应用过滤器按钮”会使包含电子表格中数据的所有行消失。当我尝试调试代码时,我看到自动过滤器的数组在LB选择方面正确填充。当我点击工作表上应用的过滤器的下拉列表并转到“textfilter - > equals”并查看已填充的过滤条件时,它就在那里。它只是不会显示相应的行。我尝试了很多东西,我只是不知道问题出在哪里。另外,我只是一个VBA初学者试图解决问题。因此,我非常感谢任何帮助(当我想要将所有3个列表框的选择组合到自动过滤器中时)!
此致 moshpit
修改
这是我当前的代码看起来像,重写它以确保算法。我也调试了整个事情。有趣的是:在调试期间(选择listbox1
中的1个项目时),数组包含此确切值。应用过滤器并转到filter options dropdown -> textfilter -> equals
之后,没有任何值,这使我认为这就是它隐藏所有行的原因。但是为什么值在数组中并且之后不会应用于过滤器?此外,Field:=
应该是关于Microsoft文档的可选参数,但是当我将其遗漏时,它会给我一个运行时错误(错误#1004:无法执行范围对象的AutoFilter方法)。
Option Explicit
' Apply Filter to Sheet
Private Sub CommandButton2_Click()
Dim x() As String, r() As String, k() As String
Dim i As Integer, j As Integer, s As Integer
ReDim x(0)
Application.ScreenUpdating = False
ActiveSheet.UsedRange.AutoFilter
' Filter Array for ListBox1
For i = 0 To ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) = True Then
x(UBound(x)) = Me.ListBox1.List(i)
ReDim Preserve x(UBound(x) + 1)
End If
Next i
If UBound(x) <> 0 Then
Worksheets("Tabelle1").Range("A1").AutoFilter Field:=1, Criteria1:=x, Operator:=xlFilterValues
ReDim Preserve x(UBound(x) - 1)
End If
ReDim r(0)
' Filter Array for ListBox2
For j = 0 To ListBox2.ListCount - 1
If Me.ListBox2.Selected(j) = True Then
r(UBound(r)) = Me.ListBox2.List(j)
ReDim Preserve r(UBound(r) + 1)
End If
Next j
If UBound(r) <> 0 Then
ReDim Preserve r(UBound(r) - 1)
Worksheets("Tabelle1").Range("B1 : HG1").AutoFilter , Criteria1:=r, Operator:=xlFilterValues
End If
ReDim k(0)
' Filter Array for ListBox3
For s = 0 To ListBox3.ListCount - 1
If Me.ListBox3.Selected(s) = True Then
k(UBound(k)) = Me.ListBox3.List(s)
ReDim Preserve k(UBound(k) + 1)
End If
Next s
If UBound(k) <> 0 Then
ReDim Preserve k(UBound(k) - 1)
Worksheets("Tabelle1").AutoFilter , Criteria1:=k, Operator:=xlFilterValues
End If
Application.ScreenUpdating = True
End Sub
' Reset Filter Mask
Private Sub CommandButton1_Click()
Dim iCount1 As Integer
Dim iCount2 As Integer
Dim iCount3 As Integer
For iCount1 = 0 To Me!ListBox1.ListCount - 1
Me!ListBox1.Selected(iCount1) = False
Next iCount1
For iCount2 = 0 To Me!ListBox2.ListCount - 1
Me!ListBox2.Selected(iCount2) = False
Next iCount2
For iCount3 = 0 To Me!ListBox3.ListCount - 1
Me!ListBox3.Selected(iCount3) = False
Next iCount3
End Sub
' Delete Filter from Sheet
Private Sub CommandButton3_Click()
On Error Resume Next
ActiveSheet.ShowAllData
End Sub
答案 0 :(得分:0)
有两个问题:
1 - arrMitarbeiter
已经是您在Dim arrMitarbeiter() As Variant
因此,您无法将Array(arrMitarbeiter)
传递给过滤器,只会传递arrMitarbeiter
。
2 - 如果您不使用xlFilterValues
运算符,它将仅过滤数组的最后一项,因此请添加此运算符。
修正这一行(我只是为了阅读两行):
Worksheets("Einsatzplan").UsedRange.Cells.AutoFilter
field:=1, Criteria1:=arrMitarbeiter, Operator:=xlFilterValues