Excel 2013:VBA代码,用于过滤多个列表框选择中的工作表数据

时间:2015-07-10 13:49:50

标签: excel vba listbox multi-select autofilter

我花了3天时间寻找解决方案,我知道我很接近,但我不知道我的问题及其原因。

首先,我有一个电子表格,其中包含从B列到HG的员工姓名(A列,从第5行开始)和资源计划数据(项目的缩写)。列A-的每个列 - 代表日历的1天(列标题是日期)。

worksheet with data

我还有一个包含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

1 个答案:

答案 0 :(得分:0)

有两个问题:

1 - arrMitarbeiter已经是您在Dim arrMitarbeiter() As Variant

中定义的数组

因此,您无法将Array(arrMitarbeiter)传递给过滤器,只会传递arrMitarbeiter

2 - 如果您不使用xlFilterValues运算符,它将仅过滤数组的最后一项,因此请添加此运算符。

修正这一行(我只是为了阅读两行):

Worksheets("Einsatzplan").UsedRange.Cells.AutoFilter 
     field:=1, Criteria1:=arrMitarbeiter, Operator:=xlFilterValues