Zeilen des Filterresultats löschen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Clousi
*
Beiträge: 10
Registriert: So, 22.08.2021 12:26

Zeilen des Filterresultats löschen

Beitrag von Clousi »

Hallo zusammen

Ich möchte gerne per Basic Makro einen Datenbereich filtern und die resultierenden Zeilen löschen.
Dafür habe ich mir folgendes Makro gesucht, kopiert und an meine Bedürfnisse angepasst:

Code: Alles auswählen

Sub applyMyCustomFilter
Const colID = 7 '< column #6 of the used range
Const sRegex = "1(\d\d\d)|(\d\d\d)" '< this is one regex including the ORs as |
cEQ = com.sun.star.sheet.FilterOperator.EQUAL' <some_column> EQUALs <some_regex>

Dim fld as new com.sun.star.sheet.TableFilterField
fld.Field = colID
fld.Operator = cEQ
fld.StringValue = sRegex

sh = ThisComponent.CurrentController.getActiveSheet()
rg = getUsedRange(sh)
fd = rg.createFilterDescriptor(True)

fd.ContainsHeader = True
fd.UseRegularExpressions = True
fd.IsCaseSensitive = False
fd.SkipDuplicates = False
fd.CopyOutputData = False

fd.setFilterFields(Array(fld))
rg.filter(fd)

End Sub
Nun die Frage an die Profis:
Wie muss ich diesen Code ergänzen um die Zeilen des Filterresultats (und nur diese) zu löschen?

Ich habe erst eben begonnen mich mit der Basic-Sprache auseinanderzusetzen und bin echt angewiesen auf Unterstützung. Deshalb wäre ich um jeden Input froh!

Vielen Dank schon im Voraus
Beste Grüsse
Clousi
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Zeilen des Filterresultats löschen

Beitrag von Stephan »

Muss es denn ein Filter sein bzw. welchen Grund gibt es einen Filter einzusetzen und dann das Filterergebnis löschen zu wollen?

Um die gefilterten Zeilen löschen zu können, fürchte ich müsste man alle Zeilen des Bereichs nochmals per Makro prüfen und das ist langsam wenn der Bereich groß ist. (Vielleicht hat jemand anderes einen besseren Ansatz, aber mir fällt direkt nichts Besseres ein)

Das Ganze per Suche zu machen schiene mir günstiger, WENN der Filter nicht anderweitig gebraucht wird.


Gruß
Stephan
Clousi
*
Beiträge: 10
Registriert: So, 22.08.2021 12:26

Re: Zeilen des Filterresultats löschen

Beitrag von Clousi »

Hallo Stefan

vielen Dank für Deine Antwort!
Nein, der Filter wird nicht anderweitig gebraucht. Ich habe diesen Filter-Code gefunden und dachte mir, das sei ein gangbarer weg. Wenn es per Suche eine elegantere Lösung gibt, dann ist das natürlich super.

Das eigentliche Ziel ist es per Makro alle Zeilen zu löschen, deren Wert in Spalte H <2000 ist.

Das Ganze soll per Makro gelöst werden, weil die Datensätze kontinuierlich erneuert werden.

Wie gesagt: für jeglichen Input bin ich sehr dankbar!
Beste Grüsse
Clousi
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Zeilen des Filterresultats löschen

Beitrag von Stephan »

dann schaue Dir Kapitel 9 in http://www.calc-info.de/files/Calc_StarBasic.pdf an.

Wenn Du dort .findAll benutzt hast Du ein Ergebnis das alle Fundstellen beinhaltet und das Du dann mit .Select sichtbar markieren und per dispatcher-Cede direkt löschen kannst, was sehr schnell geht auch bei einem umfangreiche ERgebnis.

Hier ist ein Stück ergänzter Code, aus dem obigen PDF, den Du noch auf DEine Suche anpassen musst, weil Du nach einem regulären Ausdruck suchst.

Code: Alles auswählen

Sub textInZellebereichSuchen
Dim oZelleOderBereichOderBlatt as Object
Dim oSuchBeschreibung as Object
Dim oTrefferZelle as Object
' Zellbereich holen in dem ersetzt werden soll
oZelleOderBereichOderBlatt = ThisComponent.Sheets(0).getCellRangeByName("A1:D40")
' SearchDescriptor erzeugen
        oSuchBeschreibung = oZelleOderBereichOderBlatt._
                createSearchDescriptor()
                
        ' SearchDescriptor konfigurieren
        With oSuchBeschreibung
                .SearchString = "Hallo"
                .SearchBackwards = False
                .SearchCaseSensitive = True
                .SearchWords = True
                .SearchRegularExpression = False
                .SearchStyles = False
                .SearchSimilarity = False
                .SearchSimilarityRelax = True
                .SearchSimilarityRemove = 2
                .SearchSimilarityAdd = 2
                .SearchSimilarityExchange = 2
        End With
        
        ergebnis = oZelleOderBereichOderBlatt.findAll( oSuchBeschreibung )
 
ThisComponent.getCurrentController.Select(ergebnis)

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:DeleteRows", "", 0, Array())


End Sub

Gruß
Stephan
Clousi
*
Beiträge: 10
Registriert: So, 22.08.2021 12:26

Re: Zeilen des Filterresultats löschen

Beitrag von Clousi »

Das hat super geklappt! Vielen Dank!
Antworten