BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Filtermakro

Alles zur Programmierung im LibreOffice.
Antworten
Mat
Beiträge: 2
Registriert: So 22. Aug 2021, 17:30

Filtermakro

Beitrag von Mat » Mi 25. Aug 2021, 20:23

Hallo zusammen,

nachdem ich im Forum bereits Filter automatisch aktualisieren? gefunden habe und auch sogleich übernehmen wollte stehe ich nun vor dem Problem der Umsetzung, da ich bisher keine Erfahrung mit Makros habe.

Meine C-Fähigkeiten und einiges rumprobieren haben mich schon mal etwas weiter gebracht, aber es besteht noch ein wenig Bugfixing und optimierungsbedarf

Folgende Ausgangssituation:
Das Makro prüft bei Änderung in den selektierten Tabellen(Ereignisse/Inhalt geändert) alle Tabellen, auf gefüllte Zellen in Spalte B. Wenn sie leer sind, also nur "", oder LEER als Inhalt haben werden/bleiben sie versteckt. Wenn sie Inhalt enthalten werden/bleiben sie sichtbar. Die gefilterten Zeilen werden in ein Diagramm übertragen. Durch das Verstecken der Leerzeilen entsteht ein sauberes Diagramm.

Hier mein Ansatz:

Code: Alles auswählen

Sub S_autofilter(Status as String)
    odatabaserange = thiscomponent.databaseranges(0)
    oFilterDescriptor = odatabaserange.FilterDescriptor
    oFilterDescriptor.setFilterFields(array())
    if Status = "True" then 
    	odatabaserange.referredcells.Rows.Isvisible = True
    	else
    	odatabaserange.referredcells.Rows.Isvisible = False
    endif
    odatabaserange.refresh
end sub


Sub ForSchleifeFilter
	for j = 10 to 17
	for i = 3 to 10
		ocell = thiscomponent.sheets(j).getCellByPosition(1, i)			'In Tabelle j prüfe Spalte B mit i bis 100 
		if ocell.Type is com.sun.star.table.CellContentType.EMPTY then		'Prüfe ob die Zelle leer ist
		    S_autofilter("True")						'Wenn sie leer ist, führe Funktion zum Verstecken der Reihe aus
		else 																		
			S_autofilter("False")						'Wenn sie nicht leer ist, führe Funktion zum wieder sichtbar machen aus
		endif
	next i
	next j
End Sub
Momentan werden allerdings noch keine Zeilen versteckt/sichtbar gemacht. Meine Einschätzung ist, dass ich odatabaserange nicht korrekt verwende, da es der einzige Teil, den ich bisher noch nicht so recht verstanden habe. Kann mich hier jemand in die richtige Richtung weisen?

Das Makro soll in einer Datei zum Einsatz kommen, die >20 Jahre in Nutzung sein soll. Dadurch werden viele Daten anfallen und i wird nicht maximal 10 betragen, sondern in die tausende bis zehntausende gehen, auch j wird mit großer Wahrscheinlichkeit einen größeren Bereich einnehmen. Wo kann ich hier am besten Optimierungen ansetzen um Rechenzeit einzusparen?

Gruß
Mat

Wanderer
Beiträge: 895
Registriert: Di 11. Feb 2014, 20:03
Wohnort: Berlin

Re: Filtermakro

Beitrag von Wanderer » Do 26. Aug 2021, 08:58

Wenn Du eventuell "zehntausende" Datensätze verarbeiten musst, tu Dir einen Gefallen und nutze direkt eine Datenbank. Muss nichts grosses a la Postgres sein, sqlite würde reichen.

Eine simple Abfrage als Datenquelle liefert Dir dann deine gefilterten Daten, wobei man in Datenbanken eher keine Leerzeilen speichert.

Ansonsten rechne einfach damit, dass Deine Datei irgendwo jenseits der zehntausend instabil oder langsam wird. Muss nicht passieren, ist aber möglich.
Häufig wachsen Projekte über die Jahre, aber da Du jetzt schon weisst, wo die Reise hingehen soll....

Mfg, Jörn
LO 6.0.7 (32Bit) Win8.1 Pro 32 Bit/ LO 6.3.2 Win10 64Bit / LO 6.0.7 Win7 Pro 64 Bit

Mat
Beiträge: 2
Registriert: So 22. Aug 2021, 17:30

Re: Filtermakro

Beitrag von Mat » Do 26. Aug 2021, 23:37

Hi Jörg,

danke für den Rat, ich hatte gehofft um eine Datenbank rum zu kommen aber ich sehe ein, dass das hier praktischer wäre.
Sqlite, werde ich mir die nächsten Tage mal anschauen und mich einlesen. Habe bereits gelernt, dass nichts länger anhält als ein Provisorium und werde sicher keine kurzfristige Lösung implementieren

Ich glaube der Thread ist damit beendet
Beste Grüße
Mat

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten