Excel - Autofilter zuweisen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Excel - Autofilter zuweisen

    Moin!

    ich habe nochmal eine Frage für vb.net in Verbindung mit Excel. Der ursprüngliche Code kommt wieder aus dem Macrorecorder.

    Visual Basic-Quellcode

    1. Dim xls_Appl As Excel.Application
    2. Dim xls_Mappe As Excel.Workbook ' Excel Arbeitsmappe
    3. Dim xls_Blatt As Excel.Worksheet ' Excel Blatt ( Tabelle)
    4. xls_Appl = CType(CreateObject("Excel.Application"), Excel.Application)
    5. xls_Appl.Visible = False
    6. xls_Mappe = xls_Appl.Workbooks.Add 'Hier kommt kein gültiges Objekt zurück
    7. 'xls_Mappe = xls_Appl.Workbooks.Open(FullPathStundenZettel) 'Hier kommt kein gültiges Objekt zurück
    8. xls_Blatt = CType(xls_Mappe.Worksheets(1), Excel.Worksheet)
    9. '...
    10. _XLS_Write.SetAutoFilter(xls_Blatt)
    11. ' ....
    12. public Function SetAutoFilter(ByRef sheet As Excel.Worksheet, Optional ByVal FilterRow As Integer = 1) As Short
    13. If FilterRow < 1 Then Return -1
    14. Try
    15. sheet.Range(FilterRow.ToString & ":" & FilterRow.ToString).AutoFilter()
    16. Catch ex As Exception
    17. _TryReport.Show("unerwarteter Fehler in EBL.Service > cls_ExcelWrite > SetAutoFilter", ex.ToString)
    18. Return 0
    19. End Try
    20. Return 1
    21. End Function


    Die Funktion steigt über das try-catch aus mit der Fehlermeldung:



    System.Runtime.InteropServices.COMException
    (0x800A03EC): Die AutoFilter-Methode des Range-Objektes konnte nicht ausgeführt
    werden.

    bei
    System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags
    flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)

    bei
    Microsoft.Office.Interop.Excel.Range.AutoFilter(Object Field, Object Criteria1,
    XlAutoFilterOperator Operator, Object Criteria2, Object VisibleDropDown)

    bei
    EBL.Service.ExcelWrite.SetAutoFilter(Worksheet& sheet, Int32 FilterRow) in
    C:\VSProjects\2015\EBL.Service\EBL.Service\cls_ExcelWrite.vb:Zeile 619.



    Kann mir einer weiterhelfen ?

    Gruß Jan
    Ist jetzt nur ein Schuss ins Blaue, aber ist denn FilterRow.ToString & ":" & FilterRow.ToString auch ein gültiger Bereich? Hast du dir die Werte mal ausgeben lassen?

    Edit: Jetzt erst gesehen, dass der Wert wohl derzeit 1:1 lautet. Aber müsste da nicht sowas stehen wie A1:A1?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Marcus Gräfe schrieb:

    müsste da nicht sowas stehen wie A1:A1
    Nein.
    Range("1:2") ist eine z.B. gültige Adressierung für die (gesamten) ersten zwei Zeilen.

    jan99 schrieb:

    sheet.Range(FilterRow.ToString & ":" & FilterRow.ToString).AutoFilter()
    Wenn du AutoFilter ohne Argumente aufrufst, bedeutet das, dass du die Filterfunktion toggeln willst, also die Pfeile ein- oder ausschalten.
    Das funktioniert nur, wenn für dieses Sheet schon irgendwann mal ein "echter" Autofilter gesetzt wurde (mit Angabe der zu filternden Spalten).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Moin!

    hier zunächst noch einmal der Code aus Excel, den ich auf gezeichnet habe:

    Visual Basic-Quellcode

    1. Rows("1:1").Select
    2. Selection.AutoFilter


    Für die Aufzeichnung hatte ich den Filter in einer leeren Zeichnung versucht anzuwenden. Da dieses zu einem Fehler führte habe ich vermutet, dass der Code mindestens eine befüllte Zeile braucht. Somit habe ich diesen zu einem späteren Zeitpunkt aufgerufen und bekomme weiterhin die Meldung:



    System.Runtime.InteropServices.COMException
    (0x800A03EC): Die AutoFilter-Methode des Range-Objektes konnte nicht ausgeführt
    werden.

    bei
    System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags
    flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)

    bei
    Microsoft.Office.Interop.Excel.Range.AutoFilter(Object Field, Object Criteria1,
    XlAutoFilterOperator Operator, Object Criteria2, Object VisibleDropDown)

    bei
    EBL.Service.ExcelWrite.SetAutoFilter(Worksheet& sheet, Int32 FilterRow) in
    C:\VSProjects\2015\EBL.Service\EBL.Service\cls_ExcelWrite.vb:Zeile 628.



    Wenn ich den Code durchlaufen lasse, dann ist der Range-Bereich definiert mit

    FilterRow.ToString & ":" & FilterRow.ToString "1:1" String


    Einer mit diesen Angaben noch eine Idee ?

    Gruß Jan

    jan99 schrieb:

    Einer mit diesen Angaben noch eine Idee ?
    Wie gesagt

    petaod schrieb:

    Wenn du AutoFilter ohne Argumente aufrufst, bedeutet das, dass du die Filterfunktion toggeln willst, also die Pfeile ein- oder ausschalten.
    Das funktioniert nur, wenn für dieses Sheet schon irgendwann mal ein "echter" Autofilter gesetzt wurde
    Nimm die Excel-Datei und setze in Excel von Hand einen Filter-Range und dein Range("1:1").AutoFilter() wird den Filter ein-/ausschalten.

    Wenn du das nicht möchtest, dann gib der AutoFilter-Methode die entsprechenden Parameter mit.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Moin!

    manches muss man nicht immer gleich verstehen.

    Wenn du AutoFilter ohne Argumente aufrufst, bedeutet das, dass du die Filterfunktion toggeln willst, also die Pfeile ein- oder ausschalten.
    Das funktioniert nur, wenn für dieses Sheet schon irgendwann mal ein "echter" Autofilter gesetzt wurde


    Wenn ich das nun richtig verstanden habe, dann muss ich einen sinnlosen Filter einmal definieren und wieder aufheben damit ich nur die Filterauswahl letztendlich einblenden kann?

    Gruß Jan

    jan99 schrieb:

    dann muss ich einen sinnlosen Filter einmal definieren
    Oder in Reihe 1 die entsprechenden Header-Zellen schon mal füllen, damit AutoFilter automatisch erkennen kann, welchen Spaltenumfang die Filter haben sollen.

    Wenn in Reihe 1 keine Inhalte drin sind, wird ein AutoFilter ohne Parameter keinen Spaltenumfang erkennen können.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    jan99 schrieb:

    dann muss ich einen sinnlosen Filter einmal definieren

    Wenn in Reihe 1 keine Inhalte drin sind, wird ein AutoFilter ohne Parameter keinen Spaltenumfang erkennen können.


    Aus diesem Grunde habe ich

    Somit habe ich diesen zu einem späteren Zeitpunkt aufgerufen und bekomme weiterhin die Meldung:


    gemacht!

    Gruß Jan

    Dksksm schrieb:

    Meiner Ansicht nach verwendet der Code die typische "Cells"-Notation.
    Nein.
    Cells(1,1) wäre Zelle A1.
    Range("1:1") ist die erste Zeile.

    jan99 schrieb:

    Somit habe ich diesen zu einem späteren Zeitpunkt aufgerufen
    Kannst du deinen momentanen Code posten?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --