Bedingte Formatierung mit Makro

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Echt Supi

Beitrag von turtle47 »

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
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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Die Laufzeit in einer großen Tabelle ist dann auch viel kürzer.
Moment, das interessiert mich jetzt, hast Du die Laufzeiten gemessen?

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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Karolus, Hey Turtle,

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 
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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
BMWBiker
*
Beiträge: 13
Registriert: Fr, 11.03.2005 12:54

Beitrag von BMWBiker »

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
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

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
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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

ausgehend von:

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
mit etwa 40 Sekunden nicht wesentlich schneller (ich hätte mehr erwartet).

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
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hi Stephan,

klein aber fein.
Sieht ja richtig gut aus und vor allem es läuft :D

Hab da noch ne Frage.

Hatte versucht

Code: Alles auswählen

Case ""
       oCell.CellBackColor = -1
usw.

in eine Zeile zu schreiben. Dann kam aber eine Fehlermeldung.
Warum? :D

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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Warum?
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.
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
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hi Stephan,

Danke für die Erklärung.
Glaube hab´s verstanden.

Bis dann

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
Antworten