Hallo,
auch wenns mir net so gut geht, mal mein Vorschlag.
In meiner Beispieldatei kann man per Button den Autofilter setzen, und auch wieder entfernen.
Hört sich einfacher an als es für mich momentan ist. Und deshalb ist der Code nicht wirklich hübsch und auch nicht mit vielen Kommentaren versehen, zumal ich das mir hier ausm Forum zusammengeschustert habe.
Also es gibt in der Datei 2 Buttons.
1.
Filter setzen
2.
Filter deaktivieren und entfernen.
Zu 1.
Per GotoEndOfUsedArea wird der benutzte Zellbereich ausgewertet. Wobei ich als Startadresse ganz einfach von A1 (0,0) ausgehe.
- Dann wird der Datenbereich mit den eben ermittelten Zellbereich erstellt. Und dieser Datenbereich bekommt den Namen "FilterBereich" zugeordnet.
- Und anschließend wird der Autofiltter aktiviert.
Nun kann gefiltert werden.
Will man nicht mehr filtern, weil man z.B. ein paar Zeilen für den Datenbereich hinzufügen will, muss man den Filter "entfernen".
Dies könnte man z.B. über das Calc-Menü machen:
- Daten
-- Filter
--- Autofilter (oder wie das auch immer in LO 6.x.x heißen mag)
Und den Eintrag Autofilter anklicken, und wech ist der Autofilter.
Kommen wir nun zu 2. was das eben aufgeführte per Knopfdruck erledigt.
Da ich nicht weiss wie man einen vorhandenen Datenbereich unter dem Namen "FilterBereich" ändern kann, gehe ich folgenden Weg.
- Als erstes wird der Autofilter ausgeschaltet (deaktiviert).
- Dann wird der Datenbereich mit dem Namen "FilterBereich" gelöscht (entfernt).
- Egal ob die Zeilen durch das Filtern noch ausgeblendet sind, oder nicht, wird wie zuvor bei Punkt 1. wieder der benutzte Zellbereich ausgewertet.
- Jetzt hat man durch die Auswertung einen Zellbereich in dem man per Makro alle ausgeblendeten Zeilen wieder einblenden kann.
Keine Angst!
Wenn keine Zeilen ausgeblendet sind, kommt es zu keiner Fehlermeldung.
Getestet unter LO 5.1.5.2.
Hier der gesamte Code.
Code: Alles auswählen
Sub AddNewDatabaseRange()
Dim oRange ' The DatabaseRange object.
Dim oAddr ' The cell address range for the database range.
Dim oSheet ' The first sheet, which will contain the range.
Dim oDoc ' Reference ThisComponent with a shorter name.
oDoc = ThisComponent
oSheet = odoc.sheets(0)
oCellCursor = oSheet.createCursor
oCellCursor.GotoEndOfUsedArea(False)
iEndReihe = oCellCursor.getRangeAddress().endRow
iEndSpalte = oCellCursor.getRangeAddress().endColumn
If NOT oDoc.DatabaseRanges.hasByName("FilterBereich") Then
oAddr = oSheet.getCellRangeByPosition(0, 0, iEndSpalte, iEndReihe).getRangeAddress()
oDoc.DatabaseRanges.addNewByName("FilterBereich", oAddr)
End If
oRange = oDoc.DatabaseRanges.getByName("FilterBereich")
oRange.AutoFilter = True
End Sub
'
'**************************************************************************************
'
Sub Filter_deaktivieren_und_entfernen()
Dim oRange ' The DatabaseRange object.
Dim oDoc ' Reference ThisComponent with a shorter name.
oDoc = ThisComponent
oSheet = odoc.sheets(0)
If oDoc.DatabaseRanges.hasByName("FilterBereich") = True Then
oRange = oDoc.DatabaseRanges.getByName("FilterBereich")
oRange.AutoFilter = False
oDoc.DatabaseRanges.removeByName("FilterBereich")
oCellCursor = oSheet.createCursor
oCellCursor.GotoEndOfUsedArea(False)
iEndReihe = oCellCursor.getRangeAddress().endRow
iEndSpalte = oCellCursor.getRangeAddress().endColumn
oZeilenEinblenden = oSheet.getCellRangeByPosition(0, 0, iEndSpalte, iEndReihe).Rows
oZeilenEinblenden.isvisible = True
End If
End Sub
Das wars meinerseits.
Gruß
balu