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.
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
bräuchten wir das hier.
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.
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.
Und am ende des Code ist dann dies hier.
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.
Um es deutlicher zu zeigen, hier mit Zahlen.
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
dementsprechend ändern. Das wars dann auch schon.
Geänderte Beispieldatei ist im Anhang.
Viel Spaß
Gruß
balu