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. 🤗

[Gelöst] Bedingte Formatierung per Makro setzen.

CALC ist die Tabellenkalkulation, die Sie immer wollten.
hanhug
Beiträge: 14
Registriert: So 17. Nov 2019, 21:19

[Gelöst] Bedingte Formatierung per Makro setzen.

Beitrag von hanhug » Di 26. Nov 2019, 10:30

Hallo zusammen,

ich weiss nicht ob ich ein Fehler im Script habe, oder ob dies ein Bug im Basic Teil von LibreOffice ist.
Darum die Frage an die Profis.


Eigentlich dachte ich bis gerade eben noch, es wäre nicht möglich, wie auf Tabelle1 zu sehen ist, das eine Bedingte Formatierung vorrang vor der anderen hat.
Nur durch ein blöden Zufall, als ich gerade hier die Test Datei neu erstellt habe, habe ich dies feststellen können das es doch möglich ist.

Dies ist schon mal Perfekt.
Dafür muss ich "Manuell" die einzelne Spalte "D" als Bedingte Formatierung als erstes einfügen, erst danach die Regeln für den Samstag/Sonntag über die gesamte Spalte "A:G".
Dann hat die erste angelegte Formatierung vorrang gegenüber der Zweiten. Dies ist schon mal gut.

Nach dem Anlegen ist dies wahrscheinlich nicht mehr zu ändern? Jedenfalls konnte ich nichts finden.
Aber da ich weiss wie es zu bewerkstelligen ist, kein größeres Problem.

Jetzt zu meinem eigentlichem Problem. In Tabelle1 sieht man wie es Funktionieren sollte.
Ist ein "X" in Spalte "D" soll diess Zelle grün erscheinen, auch bei Samstagen und Sonntagen.
Soweit so gut, es funktioniert.


Auf Tabelle2 möchte ich die Bedingten Formatierungen per Script setzen lassen ...
Ich habe es mit der "D" Spalte als erstes Teil im Script Probiert, da fehlt die Formatierung ganz.
Setze ich diesen Teil im Makro nach dem Teil für Samstag/Sonntag, dann tauchen 2 Bedingungen zwar auf, aber irgendwie hat sich da was verhauen. Der Teilt meine A4:G35 in einzelne Segmente und auch der Rest stimmt nicht...

Habe ich im Script einen Fehler, oder ist dies ein Bug?
Hoffe jemand hat eine Idee.

Viele Grüße
Hans
Dateianhänge
test0.1.ods
(19.58 KiB) 251-mal heruntergeladen
Zuletzt geändert von hanhug am Do 28. Nov 2019, 09:41, insgesamt 1-mal geändert.

balu
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Bedingte Formatierung per Makro setzen.

Beitrag von balu » Di 26. Nov 2019, 17:41

Hallo Hans,
Habe ich im Script einen Fehler, ...
Ja.

... oder ist dies ein Bug?
Der sitzt vorm Monitor ;-)

Du arbeitest mit überschneidenden Zellbereichen.
Einmal nur Spalte D, und das anderemal mit den Spalten A bis G. Und das mag BASIC nicht, und überschreibt deshalb die erste Bedingung.
Wenn Du nur einen Zellbereich angibst, dann werden alle 3 Bedingungen ausgefüllt. Also musst Du anders vorgehen. Und zwar wie folgt.

Spalten A bis C nur die Wochenenden -{Bedingung 1 und 2]-, Spalte D die mit dem X UND die Wochenenden -{Bedingung 1, 2 und 3]-, Spalten E bis G nur die Wochenenden -{Bedingung 1 und 2]-. Oder anders ausgedrückt.

Code: Alles auswählen

oRange = oSheet.getCellRangeByName("A4:C35")
oCondition(2).Value = "Samstag"
oCondition(2).Value = "Sonntag"

oRange = oSheet.getCellRangeByName("D4:D35")
oCondition(2).Value = "Good"
oCondition(2).Value = "Samstag"
oCondition(2).Value = "Sonntag"

oRange = oSheet.getCellRangeByName("E4:G35")
oCondition(2).Value = "Samstag"
oCondition(2).Value = "Sonntag"
Das ist jetzt nur eine systematische Beschreibung, also nicht der komplette Code. Ich hoffe Du verstehst worauf ich hinaus will.

Da das Forum hier heute wieder einen auf "lange Leitung" macht :twisted: , belasse ich es jetzt mal mit den paar Zeilen.



Gruß
balu

hanhug
Beiträge: 14
Registriert: So 17. Nov 2019, 21:19

Re: Bedingte Formatierung per Makro setzen.

Beitrag von hanhug » Di 26. Nov 2019, 22:36

Hallo balu,

danke für dein Feedback.

balu hat geschrieben:
Di 26. Nov 2019, 17:41
... oder ist dies ein Bug?
Der sitzt vorm Monitor ;-)
Wer hätte das gedacht ... :-D

Zu meiner Entschuldigung. Gibt man dies in Calc direkt als Bedingte Formatierung ein, so funktioniert es ganau so (mit überschneidung der Zellen).
Auch aus diesem Grund gebe ich ja in Basic dies als getrennte Range an. Hatte auch schon versucht dies als getrennte Subs nacheinander ablaufen zu lassen.

Es sind ja eigenständige Regeln, darum kann ich nicht verstehen wie sich diese trotzdem in die quere kommnen.

Das ist jetzt nur eine systematische Beschreibung, also nicht der komplette Code. Ich hoffe Du verstehst worauf ich hinaus will.

Da das Forum hier heute wieder einen auf "lange Leitung" macht :twisted: , belasse ich es jetzt mal mit den paar Zeilen.
Dein Prinzip habe ich auf anhieb verstanden.
Wenn wirklich aber nichts anderes übrig bleibt, so muss ich mich mit dem aufdrösseln der Range (des Scripts) abgeben.

Da ja der erste Teil "A bis C" und "E bis G" immer gleich bleiben, gibt es da auch ein Tipp wie man dies gesammelt mit einem "getCellRangeByPosition()" realisieren könnte?
Zum Test mit einem einfachem oRange = oSheet.getCellRangeByName("A4:C35","E4:G35") hat es leider auch nicht Funktioniert... Es wird nur der erste angegebene Teil eingetragen (A bis C).
Trage ich dann nachträglich in der "Bedingten Formatierung" E4 bis G35 händisch ein, so funktioniert es auch wieder wunderbar.
Es kann doch nicht der einzigste weg sein, dass man diese drei Blöcke, jedes für sich, eintragen lassen muss?

Viele Grüße
Hans

balu
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Bedingte Formatierung per Makro setzen.

Beitrag von balu » Mi 27. Nov 2019, 10:49

Moin moin Hans,

ich musste erstmal deine Datei entzippen um festzustellen welches Office Du denn genau hast. Es ist: LibreOffice/6.3.3.2
Das hättest Du auch selber sagen können. Aber nun gut, ich bin dir deswegen nicht böse. *PEACE*

Aber trotzdem ist diese Info vielleicht nicht verkehrt, da ICH zumindest nicht weiss was sich da alles gegenüber LO in einer 5.x.x. Version geändert hat. Diese 5er ist meine letzte LO, und ich werde und kann auch nicht so schnell aufrüsten.

Okidoki! Päck thru toppik ;-)

Gut! Du hattest mich verstanden.

Also denne.
Es kann doch nicht der einzigste weg sein, dass man diese drei Blöcke, jedes für sich, eintragen lassen muss?
Nein, is er nicht. Mir gings aber auch erstmal nur um das Verstehen. Was dir vielleicht aber wegen "Du bist überarbeitet" entgangen ist, ist doch folgendes.
Es existiert doch ein eindeutiges Muster. Jede Formatierung enthällt ein Wochenende, und nur einmal das mit dem X. Also 3 Spalten mit nur 2 Bedingungen, 1 Spalte mit 3 Bedingungen und dann wieder 3 Spalten mit nur 2 Bedingungen.

Es muss jetzt doch nur in regelmäßigen Intervallen die Sonderbedingung X von den drei möglichen ausgeschlossen werden. Und dafür könnte man jetzt doch eine "FOR...NEXT" Schleife einbauen, die eine "IF...THEN" Überprüfung beinhaltet und ausführt ob nun die X Bedingung eingetragen werden soll oder nicht.

Code: Alles auswählen

	for indexSP = 0 to 6
	
	oRange = oSheet.getCellRangeByPosition(indexSP,3,indexSP,33)
		if indexSP = 3 then
Das wäre also der eben genannte Teil.
indexSP ist ein von mir wilkürlich festgelegter Variablenname für die Spalte, er dient nur zur Übersicht und darf geändert werden.

Weiter gehts.

Code: Alles auswählen

	REM Teil für Grüne Hinterlegung
	oConFormat = oRange.ConditionalFormat
	oCondition(0).Name = "Operator"
	oCondition(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
	oCondition(1).Name = "Formula1"
	oCondition(1).Value = "$D1=""x"""
	oCondition(2).Name = "StyleName"
	oCondition(2).Value = "Good"
	oConFormat.addNew(oCondition())
	oRange.ConditionalFormat = oConFormat	
		end if
Hier siehst Du das Ende der "IF...THEN" Überprüfung. Ist die Überprüfung negativ ausgefallen: indexSP ist NICHT 3, dann wird diese Bedingung nicht eingetragen.

Weiter.

Code: Alles auswählen

	REM Dieser Teil für Samstag/Sonntag markierung
	oConFormat = oRange.ConditionalFormat
	oCondition(0).Name = "Operator"
	oCondition(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
	oCondition(1).Name = "Formula1"
	oCondition(1).Value = "AND($A1<>"""";WEEKDAY($A1;2)=6)"
	oCondition(2).Name = "StyleName"
	oCondition(2).Value = "Samstag"
	oConFormat.addNew(oCondition())
	REM ---------------------------------------------------------------
	oCondition(0).Name = "Operator"
	oCondition(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
	oCondition(1).Name = "Formula1"
	oCondition(1).Value = "AND($A1<>"""";WEEKDAY($A1;2)=7)"
	oCondition(2).Name = "StyleName"
	oCondition(2).Value = "Sonntag"
	oConFormat.addNew(oCondition())
	oRange.ConditionalFormat = oConFormat	
	next indexSP
Egal ob so oder so, diese 2 Nedingungen werden IMMER eingetragen. Und zu guter letzt wird die Schleife weiter ausgeführt, oder beendet wenn die Anforderung indexSP = 6 ist.

Und hier noch mal der komplette Code.

Code: Alles auswählen

Sub Main
	Dim Cell As Object
	Dim oRange
	Dim oConFormat
	Dim oCondition(2) As New com.sun.star.beans.PropertyValue
	Doc = ThisComponent
	oSheet = Doc.Sheets.getByName("Tabelle2")
	
	REM LÖSCHEN aller vorhandenen Formatierungen
	oRange = oSheet.getCellRangeByName("A4:R100")
	oConFormat = oRange.ConditionalFormat
	oConFormat.clear()
	oRange.ConditionalFormat = oConFormat	
	
	for indexSP = 0 to 6
	
	oRange = oSheet.getCellRangeByPosition(indexSP,3,indexSP,33)

		if indexSP = 3 then
	REM Teil für Grüne Hinterlegung
	oConFormat = oRange.ConditionalFormat
	oCondition(0).Name = "Operator"
	oCondition(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
	oCondition(1).Name = "Formula1"
	oCondition(1).Value = "$D1=""x"""
	oCondition(2).Name = "StyleName"
	oCondition(2).Value = "Good"
	oConFormat.addNew(oCondition())
	oRange.ConditionalFormat = oConFormat	
		end if
	REM Dieser Teil für Samstag/Sonntag markierung
	oConFormat = oRange.ConditionalFormat
	oCondition(0).Name = "Operator"
	oCondition(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
	oCondition(1).Name = "Formula1"
	oCondition(1).Value = "AND($A1<>"""";WEEKDAY($A1;2)=6)"
	oCondition(2).Name = "StyleName"
	oCondition(2).Value = "Samstag"
	oConFormat.addNew(oCondition())
	REM ---------------------------------------------------------------
	oCondition(0).Name = "Operator"
	oCondition(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
	oCondition(1).Name = "Formula1"
	oCondition(1).Value = "AND($A1<>"""";WEEKDAY($A1;2)=7)"
	oCondition(2).Name = "StyleName"
	oCondition(2).Value = "Sonntag"
	oConFormat.addNew(oCondition())
	oRange.ConditionalFormat = oConFormat	
	next indexSP
End Sub
Ich habe das jetzt nur unter dem Oldie OpenOffice.org 3.2.1 getestet, müsste aber auch in deinem LO funzen. Wobei, ... eingangs hatte ich ja deine LO version angesprochen und ich kann deshalb nicht überprüfen ob sich da im Bezug auf dies aktuelle Problem sich in der Programmierung etwas geändert hat. Das kannst Du aber selber überprüfen, indem Du den Code einfach in deiner Datei selber testest.

Selbst wenn er läuft, so ist das noch längst kein Grund zum Jubeln. Denn es steht da noch ein ganz anderes Problem wie der baldige Nikolaus vor der Tür. Ich sag nur eins: $A1

Wenn Code funzt, sei dennoch schon mal froh. :-)

Bis später.



Gruß
balu

balu
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Bedingte Formatierung per Makro setzen.

Beitrag von balu » Mi 27. Nov 2019, 17:54

Da bin ich schon wieder! :)

Also gleich mal vorweg: Das Makro müsste bezüglich Geschwindigkeit etwas optimiert werden. Das können durchaus andere machen, wer will ;-)

Fangen wir mit dem "$A1" an.
Du hast z.B. das hier im Code stehen.

Code: Alles auswählen

oCondition(1).Value = "AND($A1<>"""";WEEKDAY($A1;2)=6)"
Okay, das funzt für den ersten "Monatsblock Januar". Aber da ja schon in deiner Beispieldatei der nächste Monatsblock mit "Februar" vorbereitet ist, muss der Code so ergänzt und umgestrickt werden, das er auch für weitere Monate funktioniert.

Okay, ich bin son kleiner Kalenderfuzzi, der schon so einige Kalender erstellt hatte, und deshalb lies mir das jetzt doch keine Ruhe. Obwohl 99,9% meiner Kalender ohne Makros auskommen, wollte ich das jetzt doch geregelt kriegen.

Zurück zum Thema.
Würde man jetzt um den aktualisierten Code noch ne Schleife packen, so das auch noch mehrere Monate bearbeitet werden können, dann würde die eben zitierte Codepoassage in der Bedingten Formatierung IMMER auf die Spalte A verweisen. Und das soll wohl nicht so sein. Also muss das geändert werden.

Es stellt sich jetzt nur die Frage, wie kann man das ändern, das im nächstem Monatsblock, nehmen wir den Februar, nicht mehr auf die Spalte A, sondern auf die Spalte H verwiesen/zugegriffen wird? Es soll ja dann das dort in der Bed.For. stehen.

Code: Alles auswählen

UND($H7<>"";WOCHENTAG($H7;2)=6)
Hast Du eigentlich ein Inspektionstool wie MRI, oder XRAY?
Das wäre nicht ganz unnützlich.

Also wenn man z.B. mit XRAY sich eine Zelle in dieser Art anschaut,

Code: Alles auswählen

	Doc = ThisComponent
	oSheet = Doc.Sheets.getByName("Tabelle2")
xray oSheet.getCellByPosition(0,0)
dann erfährt man das diese Zelle einen Absoluten Namen hat, der da Lautet: AbsoluteName = $Tabelle2.$A$1

Und setztz man XRAY auf ein Blatt an,

Code: Alles auswählen

	Doc = ThisComponent
	oSheet = Doc.Sheets.getByName("Tabelle2")
xray oSheet
dann erfährt man das es einen Namen hat, der da Lautet: Name = Tabelle2
In beiden Fällen sind die ausgegebenen Namen genau so gerschrieben wie sie unterstrichen sind, blos ohne die Unterstreichung. Also einmal mit dem Dollarzeichen $, und einmal ohne $. Wir wollen aber nur die Zelladresse, und das ohne dem $.

Klar könnte man einfach den String '$Tabelle2.' von Hand eingeben um ihn zu erstzen oder zu löschen. Aber warum von Hand, wenn das doch das Makro machen kann.

Es gibt den Befehl: REPLACE()
Und mit 2 Durchläufen können wir alles überflüssige löchen, das würde z.B. so aussehen. (ist ein Testcode)

Code: Alles auswählen

sub infom
	Doc = ThisComponent
	oSheet = Doc.Sheets.getByName("Tabelle2")
		oSPa2= oSheet.getCellByPosition(0,0)
		stest1 = replace(oSPa2.AbsoluteName, oSheet.Name &"." , "")
		sSPa2 = replace(stest1, "$" , "" )
		PRINT sSPa2
END SUB
Der ist so lauffähig, um selber mal zu spielen ;-)
Aber was passiert denn da jetzt genau?
Mit 'oSPa2.AbsoluteName' bekommen wir den Absoluten Namen => $Tabelle2.$A$1
Und mit 'oSheet.Name' den Blattnamen => Tabelle2
REPLACE nimmt 'oSPa2.AbsoluteName' als zu durchsuchenden String, und sucht nach 'oSheet.Name &"."'. Das &"." habe ich noch mit drangehängt, damit auch der Punkt berücksichtigt wird. Wenn REPLACE das gefunden hat wonach es suchen soll, dann wird der Fund einfach durch "" (nichts) ersetzt. Das Ergebnis wird der Variblen stest1 zugeordnet, welches dann so aussieht: $$A$1

Die Dollars wollen wir jetzt aber gar nicht, also raus mit ihnen. Und das macht der zweite Aufruf von REPLACE. Jetzt wird aber in der Variablen stest1 gesucht und ersetzt. Und das Ergebnis wird der Variblen sSPa2 zugeordnet, welches dann so aussieht: A1
Etappenziel erreicht :-)

Da es aber nicht nur um A1 geht, sondern auch um D4, können wir genau so vorgehen wie beschrieben. Der einzige Unterschied ist der, wir müssen sicherheitshalber mit anderen Variablennamen arbeiten, um eine überschneidung zu vermeiden, und es muss eine andere Start-Zelladresse angegeben werden, Also anstatt

Code: Alles auswählen

oSheet.getCellByPosition(0,0)
bräuchten wir das hier.

Code: Alles auswählen

oSheet.getCellByPosition(3,0)
Okay, so weit zu dem "schweren" Teil der Übung.

Jetzt müssen wir das ganze noch nutzbringend in den Code für die Bedingte Formatierung reinarbeiten.
Aus diesem hier

Code: Alles auswählen

oCondition(1).Value = "AND($A1<>"""";WEEKDAY($A1;2)=6)"
wird das hier

Code: Alles auswählen

oCondition(1).Value = "AND($" & sSPa2 & "<>"""";WEEKDAY($" & sSPa2 &";2)=6)"
sSPa2 kann wieder geändert werden, wenn man will. Es soll nur folgendes verdeutlichen:
s = String
SP = Spalte
a2 = deine Überschrift für diese Spalte.

Bisschen weiter vorne stand da ja aber oSPa2.
Ganz einfach. In dem Falle war es ein Object, und deshalb das kleine o. Und aus dem Object wurde ein String. Alles klar ;-)

Das war jetzt nur die Erklärung für A1. Wenn Du dir den Code genauer anschaust. dann siehst Du das für D4, was nach dem gleichen Schema behandelt wird.


Kommen wir zum nächsten Punkt.

Die Spalte D hatte ja schon nur für einen Monatsblock für Probleme gesorgt. Jetzt wollen wir aber das ganze so gestalten, das dies auch für viele Monatsblöcke funktioniert. Und dabei habe ich mir hier einen abgebrochen wie ein Plöti, nur weil ich an falscher Stelle und falschem Ort mir selber ein Bein gestellt hatte. Nachdem ich das sah, gings eigentlich ratz-fatz weter. Was fürn stolperstein ich mir gelegt hatte spielt keine Rolle. Wollt nur damit sagen, das bei mir auch nicht immer alles Rund läuft.

Also denne. Rein ins vergnügen!
Du erinnerst Dich an diese Schleife?

Code: Alles auswählen

	for indexSP = 0 to 6
	
	oRange = oSheet.getCellRangeByPosition(indexSP,3,indexSP,33)
		if indexSP = 3 then
Damit lies es sich ja Prima die ersten Spalten "Formatieren".
Jetzt soll aber das auf weitere Spalten ausgedehnt werden. Und da kommt wieder einem das X in die Quere. Aber eins nach dem anderen.

Methode einfach für alle Formatierungen.

Code: Alles auswählen

FOR i2SP = 0 TO 20 STEP 7
Das ist die Schleife die die Anzahl an "Wiederholungen" einleitet.
Warum " STEP 7"?
Einfach deshalb, weil ein Monatsblock aus 7 Spalten besteht.

Jetzt die geänderte Schleife die pro Monatsblock ausgeführt wird.

Code: Alles auswählen

for indexSP = i2SP to i2SP +6
Und am ende des Code ist dann dies hier.

Code: Alles auswählen

	next indexSP
next i2SP
Kein großes Drama. Oder!?

Doch das Drama kam jetzt, wegen dem X. Na ja, eigentlich ist es kein echtes Drama mehr, weil ich das ja gelöst habe.

Also, wir wissen das ein Monatsblock 7 Spalten umfasst.
Und ich habe dir eben schon indirekt durch die Hintertür mitgeteilt für wieviele Spalten das Makro ausgelegt ist ===> 0 TO 20 STEP 7. Macht Januar bis März mit 21 Spalten, Zählung beginnt bei 0.

Kennst Du die Tabellenfunktion =REST()?
Das Gegenstück dazu für Makros lautet: MOD
Nein! Da kommen keine Klammern dahinter, weil das anders als üblich im Makro angewendet wird. Siehe hier.

Code: Alles auswählen

if indexSP MOD 7 =3 then
Um es deutlicher zu zeigen, hier mit Zahlen.

Code: Alles auswählen

sub BeispielMOD
print 20 MOD 7
end sub
Bei MOD kommt also erst die Zahl die geteilt werden soll, dann der eigentliche Aufruf MOD, und danach der Teiler.

Die eben gezeigt IF mit MOD ist des Rätselslösung für das Thema X.

Willst Du das Tabellenblat noch um weitere Monate ergänzen, z.B. April bis Dezember, so musst Du nur darauf achten das Du immer schön bei dem 7 Spaltenrythmus bleibst, und nur den Wert 20 bei

Code: Alles auswählen

FOR i2SP = 0 TO 20 STEP 7
dementsprechend ändern. Das wars dann auch schon.

Geänderte Beispieldatei ist im Anhang.

Viel Spaß :)



Gruß
balu
Dateianhänge
Bedingte Formatierung per Makro setzen_balu_1.ods
(20.28 KiB) 195-mal heruntergeladen

hanhug
Beiträge: 14
Registriert: So 17. Nov 2019, 21:19

Re: Bedingte Formatierung per Makro setzen.

Beitrag von hanhug » Do 28. Nov 2019, 09:37

Moin moin zurück balu,
balu hat geschrieben: ich musste erstmal deine Datei entzippen um festzustellen welches Office Du denn genau hast. Es ist: LibreOffice/6.3.3.2
Das hättest Du auch selber sagen können. Aber nun gut, ich bin dir deswegen nicht böse. *PEACE*
Hätte man nicht danach fragen können :D
Sollte man nicht davon ausgehen, das man meist die neuste Version benutzt?
Aber stimmt, ist sicherlich nicht bei jedem der Fall.


Gut! Du hattest mich verstanden.
Natürlich. Ich wollte dennoch versuchen alles so kompakt wie möglich zu halten.
Darum eben auch die Frage ob es sich, wenn es schon mit einer händischen Eingabe Funktioniert, sich dies auch mit Basic direkt realisieren lässt.
Das sich aber Basic in diesem Fall so komisch anstellt, damit hätte ich wirklich nicht gerechnet.
Es sind ja immerhin 2 getrennte Regeln.



Es muss jetzt doch nur in regelmäßigen Intervallen die Sonderbedingung X von den drei möglichen ausgeschlossen werden. Und dafür könnte man jetzt doch eine "FOR...NEXT" Schleife einbauen, die eine "IF...THEN" Überprüfung beinhaltet und ausführt ob nun die X Bedingung eingetragen werden soll oder nicht.

Code: Alles auswählen

	for indexSP = 0 to 6
	
	oRange = oSheet.getCellRangeByPosition(indexSP,3,indexSP,33)
		if indexSP = 3 then
Da sich abgesehen von dir niemand auf diese Fragestellung geantwortet hat, ich auch mit viel Recherche im Netz sowie Basic unterlagen diesbezüglich nichts finden konnte.
So habe ich mich noch gestern Früh, immer mal wieder, dran gesetzt und es schon Fast fertig aufgedröselt, nach vorschlag deines ersten Postings umgebaut gehabt. Gestern Abend war es dann komplett fertig.

Genau nach dem Prinzip, wie du es in deinem gestigen Post noch vorgeschlagen hattest.

Eine For schleife 1 bis 12 (Januar bis Dezember).
Und statt if, habe ich an den passenden stellen mit Select Case gearbeitet, wurde noch ein ganz klein wenig übersichtlicher.
In diesem Zuge habe ich die komplette Sub überarbeitet.
Zuvor für jeden Monat einen eigenen Eintrag, nun da ich schon dabei war alles neu zu erstellen, alles mit einer einzigen Schleife.
Danke aber für deinen Denkanstoss.



Ich habe das jetzt nur unter dem Oldie OpenOffice.org 3.2.1 getestet, müsste aber auch in deinem LO funzen. Wobei, ... eingangs hatte ich ja deine LO version angesprochen und ich kann deshalb nicht überprüfen ob sich da im Bezug auf dies aktuelle Problem sich in der Programmierung etwas geändert hat. Das kannst Du aber selber überprüfen, indem Du den Code einfach in deiner Datei selber testest.
Gibt es den einen Grund warum nicht die neuste Version? Oder wenigstens diese Parallel zu älteren Versionen immer mit nutzen/Installieren.
Liegt es an der Bandbreite? Nur aus neugier. :D
Selbst wenn er läuft, so ist das noch längst kein Grund zum Jubeln. Denn es steht da noch ein ganz anderes Problem wie der baldige Nikolaus vor der Tür. Ich sag nur eins: $A1
Ok, hier sitze ich nun wirklich auf dem Schlauch ... Was hat A1 1.1. mit Nikolaus zu tun ??? :D



EDIT:
Erst nach abschicken dieses Posts, habe ich gesehen, das du dir nochmals Mühe gemacht hast und nochmal geantwortet hast...
Jetzt weiß ich was du mit $A1 meintest...
Dies mit der händischen $A1 war nur der übersicht halber, es ging ja um ein anderes Problem.
Darum hatte ich dieses Makro schenll neu erstellt. Um auch alle anderen Fehler auszuschließen.
Im eigentlichen arbeite ich fast nach deinem Prinzip. :D
Da läuft schon alles automatisiert ab. Von Januar bis Dezember

Dieses Makro ist einfach nur dafür da, die Bedingte Formatierung komplett neu aufzubauen.
Ist natürlich auch ohne Makro möglich.
Nur für den Fall, das jemand Copy/Paste etc... macht und damit die Bedingungen zerhaut.
Kommt ja sehr gerne mal vor.
Jetzt ab und an mal ein Klick und alle Bedingungen sind wieder wie gehabt vorhanden.
Könnte ja noch einbauen jeden Monat/Woche dies Script automatisch ausführen zu lassen, das muss aber bisher noch nicht sein.

Ich hatte auch schon vorgestern durch zufall mitbekommen, das genau du dich desöffteren mit Kalendern beschäftigst :D
Hat ja sehr gut gepasst.

Viele Grüße
Hans
Zuletzt geändert von hanhug am Do 28. Nov 2019, 10:48, insgesamt 1-mal geändert.

balu
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: [Gelöst] Bedingte Formatierung per Makro setzen.

Beitrag von balu » Do 28. Nov 2019, 10:48

Moinsen Hans.
Gibt es den einen Grund warum nicht die neuste Version?
Erstens habe ich für den Fall der Fälle so ca. 30 Versionen von SO 5.2, OO.o, Go-OO, AOO und LO auf meiner Platte (als Freiwilliger Helfer weiss man ja nie was kommt), zweitens wollt ich mal höher als 5.1.5.2, aber da sagte das Setup: WinXP wird nicht unterstüzt. Irgendwann steige ich wohl auf Linux um, das hat aber Zeit.

Weisst Du, ich habe mir mühe gemacht so detailiert zu Beschreiben wie nur möglich, und von daher wäre es ja wohl mehr als Fair wenn Du deine überarbeitete Version hier anhängen würdest. Wir alle möchten ja schließlich zu gerne Wissen wie Du was gelöst hast, besonders das mit der "SELECT...CASE" wäre wohl mehr als nur interessant zu sehen.



Gruß
balu

hanhug
Beiträge: 14
Registriert: So 17. Nov 2019, 21:19

Re: [Gelöst] Bedingte Formatierung per Makro setzen.

Beitrag von hanhug » Do 28. Nov 2019, 13:27

Huhu balu,

sry, eben weil du ja alles schön erklärt hast und sogar eine Beispiel Datei angehängt hattest, hätte ich nicht von einer Kopie meinerseits gerechnet.

Ok, habe gerade meine Art in deine Datei mit rein gepackt.
Eigentlich ist es ja genau das was du gemacht hattest, nur eben ein wenig anders. Der Effekt ist der selbe.
Was mich aber wundert und mit was ich nicht gerechnet hatte, meine Art ist sogar ein klein wenig schneller.

Auf die geschwindigkeit kommt es hier aber nicht an, es ist ja nur als Backup, welches man ab und an drüberbügeln kann.

PS.
Gerade eben habe ich noch vor abschicken gesehen, warum deine Art ein wenig länger braucht.
Du baust die Regeln in "jede" Spalte mit ein. Ich hingegen Gruppiere diese soweit wie möglich. Das sieht man spätestens in den Bedingten Formatierungen. Das bei deiner Variante "jede" Spalte eine Formatierung bekommt.

Viele Grüße
Hans
Dateianhänge
Bedingte Formatierung per Makro setzen_balu_hans.ods
(21.47 KiB) 192-mal heruntergeladen

balu
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: [Gelöst] Bedingte Formatierung per Makro setzen.

Beitrag von balu » Do 28. Nov 2019, 17:09

Ave Hans.

Danke für deine aktualisierte Datei.

Prima Pluspunkt: Die Umwandlung von X auf x.

Interessante Lösung mit der "SELECT...CASE". Aber für 3 Monate gleich 3 x CASE, ist schon häftig. Das bedeutet ja im Umkehrschluß; das für 12 Monate gleich 12 x CASE angewendet werden muss, und das ist ja wiederum gar nicht so schön.

Löscht man in deiner und meiner SUB jegliche Leerzeilen und Kommentare (die mit REM oder mit ' beginnen), wirds interessant.
Deine SUB besteht dann noch aus: 71 Zeilen.
Meine SUB besteht dann noch aus: 50 Zeilen.
Will man deine Sub auf 12 Monate ausbauen, kommen dann wohl noch so ca. 33 Zeilen hinzu, was dann überr 100 Zeilen bei dir ausmacht. Während bei mir nur eine 2 Stellige Zahl geändert werden muss, bei mir bleibt es also bei 50 Zeilen (ohne Kommentare).

Das sieht man spätestens in den Bedingten Formatierungen. Das bei deiner Variante "jede" Spalte eine Formatierung bekommt.
Ja wie jetzt!?
Wird in deinem LO nicht jede Spalte mit einer Bedingten Formatierung befüllt?



Gruß
balu

hanhug
Beiträge: 14
Registriert: So 17. Nov 2019, 21:19

Re: [Gelöst] Bedingte Formatierung per Makro setzen.

Beitrag von hanhug » Do 28. Nov 2019, 18:09

Hallöchen,
balu hat geschrieben: Interessante Lösung mit der "SELECT...CASE". Aber für 3 Monate gleich 3 x CASE, ist schon häftig. Das bedeutet ja im Umkehrschluß; das für 12 Monate gleich 12 x CASE angewendet werden muss, und das ist ja wiederum gar nicht so schön.
So ist es, aber jetzt habe ich die Case reduzieren können. Pro Case nur noch einen Eintrag.
Und dieser eine ist wiederrum auch nur dafür da um auf die passende Anzahl der Tage pro Monat zu kommen.
Eigentlich hätte ich auch alle Case bis auf eines weglassen können.


Ja wie jetzt!?
Wird in deinem LO nicht jede Spalte mit einer Bedingten Formatierung befüllt?
Bezogen auf nur einen Monat, habe ich nur drei Regeln.
A:C, D , E:G
Bei dir kommen 7 Regeln raus, also eines für jede Spalte.

Deine SUB besteht dann noch aus: 71 Zeilen.
Meine SUB besteht dann noch aus: 50 Zeilen.
Das ist jetzt schon der dritte Umbau an meinem Script, darum sind 100% noch einiges an Einsparpotenzial da.
Wenn nicht meine Variablennamen teils so aussagekräftig wären (sonst vergesse ich selbst die Bedeutung :D ) ist sicherlich noch einiges weniger drin. :twisted: :lol:

Viele Grüße
Hans

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