ListObject AutoFilter

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    ListObject AutoFilter

    Guten Morgen,

    ich habe ein Problem. Ich wollte einen AutoFilter mit einem Array im Criteria1 befüllen. (Zumindest hat mir das die Aufzeichnung des Makro Recorders so gezeigt).

    das sagt der Makro Recorder

    Visual Basic-Quellcode

    1. ActiveSheet.ListObjects("data").Range.AutoFilter Field:=1, Criteria1:=Array("eg", "eu", "ug"), Operator:=xlFilterValues


    So hab ich es erfolglos probiert.

    Visual Basic-Quellcode

    1. fill = Trim(Replace("""" & Replace(Join(arr(), ", "), ", ", """, """) & """", """""" & ",", ""))
    2. Debug.Print "Array(" & fill & ")"
    3. Array("eg", "ug", "eu")
    4. Hab es dann sowohl so
    5. ws.ListObjects("data").Range.AutoFilter Field:=1, Criteria1:=Array(fill), Operator:=xlFilterValues
    6. als auch so probiert
    7. ws.ListObjects("data").Range.AutoFilter Field:=1, Criteria1:="Array(" & fill & ")", Operator:=xlFilterValues


    Weiß jemand wie der Array da hinein muss, damit es wie beim Recorder greift?

    Freue mich über jede Antwort.
    Ich weiß noch nicht mal, was man im Excel-Sheet machen muss, um diese Makroaufzeichnung zu erreichen, weil ich nicht weiß, was die Blatt-Funktion zur Erstellung von ListObjects ist. Aber: wie ist arr definiert?

    Visual Basic-Quellcode

    1. Dim arr() As Variant
    2. arr = Array("eu", "eg", "ug")
    So vielleicht?
    Zeile#8 kommt nahe an das Makroergebnis ran, aber das funktioniert deshalb nicht, weil Deine Fill-Zeile einen String ergibt.
    Makrorecorder: :=Array("eg", "eu", "ug"): drei Strings als Parameter
    effektiv Deine Zeile: :=Array(""eg", "eu", "ug"")ein String mit mehreren Anführungszeichen im Text
    Kannst Du nicht einfach arr anstelle übergeben, also schreiben:

    Visual Basic-Quellcode

    1. ws.ListObjects("data").Range.AutoFilter Field:=1, Criteria1:=arr, Operator:=xlFilterValues

    Wenn arr ein Variant-Array ist, dann ggf. vorher noch in ein String-Array umwandeln, keine Ahnung wie empfindlich VBA da ist. Aber eigentlich müsste es auch so gehen, da Array(bla, bla, bla) ja ein Variant-Array zurückgibt/erzeugt und sowas der AutoFilter haben will.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed

    Hast recht ich habe es nun so. Das einzige was ich nicht geregelt bekomme ich ein Laufzeitfehler 5 oder 9 wenn der Array leer ist. Ich wollte auf IsEmpty oder IsNull prüfen aber das klappt irgendwie nicht. Benötige ich dafür eine Hilfsfunktion? Oder kann ich das auch irgendwie anders lösen als mit einem GoTo?

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public Sub SortLo()
    3. Dim wb As Workbook
    4. Dim ws As Worksheet
    5. Dim sh As Shape
    6. Dim i As Integer
    7. Dim arr() As Variant
    8. Set wb = ActiveWorkbook
    9. Set ws = wb.ActiveSheet
    10. With Application
    11. .Calculation = xlCalculationManual
    12. .ScreenUpdating = False
    13. End With
    14. ws.ListObjects("data").Range.AutoFilter Field:=1
    15. For Each sh In ws.Shapes
    16. For i = 0 To GetDict.Count - 1
    17. If Right(sh.Name, 2) = GetDict.Items(i) Then
    18. If ws.Shapes(sh.Name).ControlFormat.Value = xlOn Then
    19. ReDim Preserve arr(i)
    20. arr(i) = GetDict.Items(i)
    21. End If
    22. End If
    23. Next i
    24. Next sh
    25. On Error GoTo recover
    26. recover:
    27. Select Case Err.Number
    28. Case 5, 9
    29. ws.ListObjects("data").Range.AutoFilter Field:=1
    30. Case Else
    31. ws.ListObjects("data").Range.AutoFilter Field:=1, Criteria1:=arr, Operator:=xlFilterValues
    32. End Select
    33. With Application
    34. .Calculation = xlCalculationAutomatic
    35. .ScreenUpdating = True
    36. End With
    37. End Sub

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Sam85“ ()

    Abgewandelt von einem alten Thread:

    Visual Basic-Quellcode

    1. Sub Makro1()
    2. Dim InitializedArray(1) As Variant
    3. Dim EmptyArray() As Variant
    4. MsgBox ArrayIsEmpty(InitializedArray)
    5. MsgBox ArrayIsEmpty(EmptyArray)
    6. End Sub
    7. Function ArrayIsEmpty(Arr As Variant)
    8. ArrayIsEmpty = SafeUbound(Arr) = -1
    9. End Function
    10. Function SafeUbound(Arr As Variant) As Long
    11. On Error GoTo ErrorOccured
    12. Dim IsInitialized As Boolean
    13. IsInitialized = IsArray(Arr) And Not IsError(LBound(Arr, 1)) And LBound(Arr, 1) <= UBound(Arr, 1)
    14. If IsInitialized Then
    15. SafeUbound = UBound(Arr)
    16. Else
    17. SafeUbound = -1
    18. End If
    19. Exit Function
    20. ErrorOccured:
    21. SafeUbound = -1
    22. End Function
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.