Bedingte Formatierung mit Makro
Moderator: Moderatoren
Echt Supi
Hallo Karolus,
vielen Dank.
gefällt mir noch besser als meine Variante.
Die Laufzeit in einer großen Tabelle ist dann auch viel kürzer.
Viele Grüße
Jürgen
vielen Dank.
gefällt mir noch besser als meine Variante.
Die Laufzeit in einer großen Tabelle ist dann auch viel kürzer.
Viele Grüße
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Moment, das interessiert mich jetzt, hast Du die Laufzeiten gemessen?Die Laufzeit in einer großen Tabelle ist dann auch viel kürzer.
Zugestanden scheint mir wenn Du nur einen kleinen Bereich markiert (kleiner als Dein feststehender) das das schneller fertig ist. Aber wenn beide Bereiche gleich groß sind?
Kann sein - nur ich sehe nichts in dem Code was für gleichgroße Bereiche schneller wäre. Eher noch hielte ich es für langsamer, da Count im Gegensatz zu einer festen Zahl doch Rechenzeit benötigt.
Deshalb obenstehende Frage.
Ansonsten:
Ist das Makro denn zeitkritisch? Denn sicherlich würde ein Select-Case das deutlich beschleunigen.
Gruß
Stephan
Hey Karolus, Hey Turtle,
Euer Code ist nicht Sauber! Vergleicht mal mit meinem Post ziemlich am Anfang.
Da liegt ihr Falsch! Ihr weist der Zelle sehr wohl eine Farbinformation zu, nämlich weiss! Keine Farbe ist etwas anderes. Hinterlegt das ganze mal mit einer farbigen Grafik, dann seht ihr den Unterschied!
Um die Eigenschaft des Objektes tatsächlich auf "keine Farbe" zu setzen (so wie die Vorgabe), müsst ihr "-1" zuweisen. Das gilt intern als "keine Farbe" oder "ohne Eigenschaft"!
Im Übrigen könnt ihr die Eigenschaft "CellBackColor" auch direkt auf einen Zellbereich anwenden, dann spart ihr euch die verschiedenen "if"-Zeilen beim Löschen der Farbe.
Gruss
Thomas
Euer Code ist nicht Sauber! Vergleicht mal mit meinem Post ziemlich am Anfang.
Code: Alles auswählen
if oCell.string = "" then oCell.CellBackColor = RGB(255,255, 255) 'keine Farbe
Um die Eigenschaft des Objektes tatsächlich auf "keine Farbe" zu setzen (so wie die Vorgabe), müsst ihr "-1" zuweisen. Das gilt intern als "keine Farbe" oder "ohne Eigenschaft"!
Im Übrigen könnt ihr die Eigenschaft "CellBackColor" auch direkt auf einen Zellbereich anwenden, dann spart ihr euch die verschiedenen "if"-Zeilen beim Löschen der Farbe.
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hi turtle47,
eine Art Abwesenheitsliste führe ich auch. Für verschiedene Arten/Gründe für Abwesenheiten (krank, Urlaub, Lehrgang etc.) habe ich mir die nachfolgende Art Makro zusammengebastelt, bei denen die Zellen des jeweiligen Datums farbig hinterlegt sind:
sub Urlaub
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "BackgroundColor"
args1(0).Value = 11776947
dispatcher.executeDispatch(document, ".uno:BackgroundColor", "", 0,
args1())
end sub
Im Fall Urlaub ist die Hintergrundfarbe grau;
grün=args1(0).Value 4057917
türkis=args1(0).Value 65535
rot=args1(0).Value 16711680
Im Fall, dass ich mal in die verkehrte Zelle komme, kann ich
Falscheinträge mit dem nachfolgenden Makro löschen:
sub loeschen
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Flags"
args1(0).Value = "SVDFN"
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:BackgroundColor", "", 0,
Array())
end sub
Gruß BMWBiker
eine Art Abwesenheitsliste führe ich auch. Für verschiedene Arten/Gründe für Abwesenheiten (krank, Urlaub, Lehrgang etc.) habe ich mir die nachfolgende Art Makro zusammengebastelt, bei denen die Zellen des jeweiligen Datums farbig hinterlegt sind:
sub Urlaub
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "BackgroundColor"
args1(0).Value = 11776947
dispatcher.executeDispatch(document, ".uno:BackgroundColor", "", 0,
args1())
end sub
Im Fall Urlaub ist die Hintergrundfarbe grau;
grün=args1(0).Value 4057917
türkis=args1(0).Value 65535
rot=args1(0).Value 16711680
Im Fall, dass ich mal in die verkehrte Zelle komme, kann ich
Falscheinträge mit dem nachfolgenden Makro löschen:
sub loeschen
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Flags"
args1(0).Value = "SVDFN"
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:BackgroundColor", "", 0,
Array())
end sub
Gruß BMWBiker
Hallo zusammen,
ich möchte darauf hinweisen das ich im Makroprogrammieren ein absoluter Newbe bin.
Größtenteils kann ich den Code, wie z.B. den von BMWBiker gar nicht lesen bzw. umsetzen. Sorry.
Toxitom hat natürlich recht mit der Farbe Weiss. Es muss hier
natürlich -1 heißen.
Zu der Tabelle muss ich sagen, die ist 31 Spalten breit (Tage im Monat)
und hat ca. 450 Zeilen. Der Anwender hat das so gewünscht.
Wenn ich mein Makro über alles laufen lasse dann dauert das bei nem
2,6 Ghz Rechner ca. 45 Sekunden. Deshalb habe ich mich für den Hinweis von Karolus
entschieden nur über den selktierten Bereich das Makro laufen zu lassen.
Über weitere Hilfestellung würde ich mich aber sehr freuen.
Grüße aus Rheinbach
Jürgen
ich möchte darauf hinweisen das ich im Makroprogrammieren ein absoluter Newbe bin.
Größtenteils kann ich den Code, wie z.B. den von BMWBiker gar nicht lesen bzw. umsetzen. Sorry.
Toxitom hat natürlich recht mit der Farbe Weiss. Es muss hier
natürlich -1 heißen.
Zu der Tabelle muss ich sagen, die ist 31 Spalten breit (Tage im Monat)
und hat ca. 450 Zeilen. Der Anwender hat das so gewünscht.
Wenn ich mein Makro über alles laufen lasse dann dauert das bei nem
2,6 Ghz Rechner ca. 45 Sekunden. Deshalb habe ich mich für den Hinweis von Karolus
entschieden nur über den selktierten Bereich das Makro laufen zu lassen.
Über weitere Hilfestellung würde ich mich aber sehr freuen.
Grüße aus Rheinbach
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
ausgehend von:
was bei mir etwa 46 Sekunden läuft, ist:
mit etwa 40 Sekunden nicht wesentlich schneller (ich hätte mehr erwartet).
Somit ergäbe sich:
Gruß
Stephan
Code: Alles auswählen
sub FarbAenderung 'Füllt die Zellen mit Farbe
oDoc = thisComponent 'das Dokument
oSheet = oDoc.sheets(0) 'erstes Tabellenblatt
For ze = 4 to 454 'Zeilenzähler
For sp = 2 to 33 'Spaltenzähler
oCell = oSheet.getCellByPosition(sp,ze)
if oCell.string = "" then oCell.CellBackColor = RGB(255,255, 255) 'keine Farbe
if oCell.string = "J" then oCell.CellBackColor = RGB(0,102, 204) 'Jahresurlaub blau
if oCell.string = "H" then oCell.CellBackColor = RGB(0,102, 204) 'halber Urlaubstag blau
if oCell.string = "K" then oCell.CellBackColor = RGB(250,255, 102) 'Krank gelb
if oCell.string = "B" then oCell.CellBackColor = RGB(0,174, 0) 'Berufsschule grün
if oCell.string = "W" then oCell.CellBackColor = RGB(255,153, 102) 'Weiterbildung orange
if oCell.string = "U" then oCell.CellBackColor = RGB(255,51, 51) 'Fehlen unentschuldigt rot
next
next
end sub
was bei mir etwa 46 Sekunden läuft, ist:
Code: Alles auswählen
Sub FarbAenderung_2()
oDoc = thisComponent 'das Dokument
oSheet = oDoc.sheets(0) 'erstes Tabellenblatt
For ze = 4 to 454 'Zeilenzähler
For sp = 2 to 33 'Spaltenzähler
oCell = oSheet.getCellByPosition(sp,ze)
Select Case oCell.String
Case ""
oCell.CellBackColor = -1
Case "J"
oCell.CellBackColor = RGB(0,102, 204)
Case "H"
oCell.CellBackColor = RGB(0,102, 204)
Case "K"
oCell.CellBackColor = RGB(250,255, 102)
Case "B"
oCell.CellBackColor = RGB(0,174, 0)
Case "W"
oCell.CellBackColor = RGB(255,153, 102)
Case "U"
oCell.CellBackColor = RGB(255,51, 51)
End Select
next
next
End Sub
Somit ergäbe sich:
Code: Alles auswählen
Sub FarbAenderung_3()
oSelect=ThisComponent.CurrentSelection
oColumn=oselect.Columns
oRow=oSelect.Rows
For n= 0 To oColumn.getCount-1
For m = 0 To oRow.getCount-1
oCell=oselect.getCellByPosition (n, m)
Select Case oCell.String
Case ""
oCell.CellBackColor = -1
Case "J"
oCell.CellBackColor = RGB(0,102, 204)
Case "H"
oCell.CellBackColor = RGB(0,102, 204)
Case "K"
oCell.CellBackColor = RGB(250,255, 102)
Case "B"
oCell.CellBackColor = RGB(0,174, 0)
Case "W"
oCell.CellBackColor = RGB(255,153, 102)
Case "U"
oCell.CellBackColor = RGB(255,51, 51)
End Select
next
next
End Sub
Gruß
Stephan
Hi Stephan,
klein aber fein.
Sieht ja richtig gut aus und vor allem es läuft
Hab da noch ne Frage.
Hatte versucht
usw.
in eine Zeile zu schreiben. Dann kam aber eine Fehlermeldung.
Warum?
Jürgen
klein aber fein.
Sieht ja richtig gut aus und vor allem es läuft

Hab da noch ne Frage.
Hatte versucht
Code: Alles auswählen
Case ""
oCell.CellBackColor = -1
in eine Zeile zu schreiben. Dann kam aber eine Fehlermeldung.
Warum?

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Ich habe über solche theoretischen Dinge noch nicht nachgedacht, ich würde mal sagen Select-Case ist von der Natur her auf mehrere Alternativen ausgerichtet, will heißen eine Alternative wäre keine bzw. dann würde man nicht select-case verwenden. Deshalb von vorherein diese Syntax.Warum?
Bei z.B. IF-Then liegt die Lage anders weil das pure IF-Then sinn macht und ein zusätzliches Else oder Else if im Prinzip abgeleitete Erweiterungen sind.
Vielleicht kann oder mag jemand eine bessere Erklärung geben.
Somit muß das in 2 Zeilen, was aber nicht zwingend physische Zeilen meint und Du kannst wie üblich zwei Zeilen in eine physische Zeile schreiben und mit ":" trennen. z.B.:
Code: Alles auswählen
Sub FarbAenderung_2()
oDoc = thisComponent 'das Dokument
oSheet = oDoc.sheets(0) 'erstes Tabellenblatt
For ze = 4 to 454 'Zeilenzähler
For sp = 2 to 33 'Spaltenzähler
oCell = oSheet.getCellByPosition(sp,ze)
Select Case oCell.String
Case "" : oCell.CellBackColor = -1
Case "J" : oCell.CellBackColor = RGB(0,102, 204)
Case "H" : oCell.CellBackColor = RGB(0,102, 204)
Case "K" : oCell.CellBackColor = RGB(250,255, 102)
Case "B" : oCell.CellBackColor = RGB(0,174, 0)
Case "W" : oCell.CellBackColor = RGB(255,153, 102)
Case "U" : oCell.CellBackColor = RGB(255,51, 51)
End Select
next
next
End Sub
Gruß
Stephan