Seite 1 von 1

Filtermakro

Verfasst: Mi 25. Aug 2021, 20:23
von Mat
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

Re: Filtermakro

Verfasst: Do 26. Aug 2021, 08:58
von Wanderer
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

Re: Filtermakro

Verfasst: Do 26. Aug 2021, 23:37
von Mat
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