Hintergrundfarbe einer Zelle auslesen

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

voltampere
Beiträge: 5
Registriert: Sa, 26.02.2005 21:09

Hintergrundfarbe einer Zelle auslesen

Beitrag von voltampere »

Hi Alle,

ich komme nicht weiter :cry: hoffe aber hier kann mir jemand helfen.

Ich muß in einer formatierten Tabelle die Hintergrundfarbe von Zellen auslesen. Genauer: Ich möchte rote, grüne, graue usw. Zellen in einer Spalte abfragen und wenn eine zweite Bedingung in der Spalte daneben erfüllt ist, die Anzahl der Übereinstimmungen bestimmen.
Z. B. die Zelle ist "rot" und die daneben enthält ein "A" dann soll der Zähler tackern, ist kein A da dann eben nicht.
Das Probelm ist das ich zwar Zählen kann wenn etwas in der "roten" Zelle steht aber ich will unabhänging vom Inhalt der farbigen Zelle zählen.

Hat da vielleicht jemand einen Lösungsvorschlag :?:
Gruß Günter
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Da wirst Du wohl eine benutzerdefinierte Funktion brauchen, z.B.:

Code: Alles auswählen

Function FARBE(Adresse,R,G,B)
zelle = ThisComponent.Sheets(0).getCellRangeByName(Adresse)
If zelle.CellBackColor(R,G,B)=RGB(R,G,B) Then 
      FARBE=1
   else
      FARBE=0
End if
End Function
Dann kannst Du so verfahren:

Wenn die Zelle deren Hintergrundfarbe überwacht werden soll A1 ist, und die die auf "A" überwacht werden soll B1, liefert diese Formel 1 wenn beide Bedingungen erfüllt sind:

=FARBE(ZELLE("ADDRESS";A1);255;0;0)*WENN(B1="A";1;0)

(das prüft auf rot (RGB(255,0,0)) und "A")

Da Formeln nur neu berechnet werden wenn sich die Inhalte ändern (und der Zellhintergrund i.d.S. kein Inhalt ist) mußt Du ggf. zur Aktualisierung STRG+UMSCHALT+F9 und nicht F9 drücken)


aber vielleicht weiß jemand Besseres...

Gruß
Stephan
voltampere
Beiträge: 5
Registriert: Sa, 26.02.2005 21:09

Beitrag von voltampere »

Hallo Stephan,

danke für die prompte Antwort. Ich werde das mal probieren. Ich schätze benutzerdefinierte Funktion ist wirklich die einzige Möglichkeit. Allerdings hatte ich gehofft ohne auszukommen. (wegen der kompabilität zum allmächtigen, großen, alles beherrschenden, auf der arbeit leider zu benutzendem, dessen name nicht ausgesprochen werden darf... ihr wist schon wer! (nein, nicht voldemord)) :wink:
Nuja, ich denke wenn ich das so ans laufen bekomme sollte es auch nicht so schwer sein es zu adaptieren.

Also noch mal herzlichen Dank und einen schönen Abend noch...
Gruß Günter
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

dessen name nicht ausgesprochen werden darf
Das darfst Du tun und sollst Du tun. Da kannst Du auch ganz sicher sein.
Zumindest in soweit, als das ich hier als Moderator aufhören würde wenn ich merkte das dieses Forum eine Vereinigung der "OOo-Kirche" wäre. Ich helfe hier ein bißchen den Leuten die OOo benutzen. Nicht mehr und nicht weniger.

Bloß ich hätte jetzt auch garnicht vermutet das es mit Excel ginge.
Würde mich freuen, wenn Du mir sagst wie das in Excel geht, dann muß ich mir nicht die Arbeit machen darüber nachzudenken - und interessieren würde es mich.


Gruß
Stephan
voltampere
Beiträge: 5
Registriert: Sa, 26.02.2005 21:09

Beitrag von voltampere »

Hm, jetzt hab ich doch als Gast geschrieben. Einmal nicht aufgepasst. :shock: Ich oute mich also mich also hiermit als Autor des vorangegangenen Beitrags.
Gruß Günter
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Was ich bis jetzt weis ist das MS Officebasic und OOo Basic nicht so weit voneinander entfernt sind wie ich bisher angenommen hatte (lese mich gerade ein) und was mich davon abgehalten hat in eine Makroprogramierung einzusteigen. Zumindestens die Standartbefehle sollen sehr ähnlich sein.
Ohne Dir irgendwie den Mut nehmen zu wollen:
-technisch ist es (zumindest derzeitig) nicht möglich Makros so einzubinden das sie in Excel und Calc (automatisch) funktionieren (immer vorausgesetzt Du verwendest das xls-Format, da ja sxc für beide Programme ohnehin nicht geht).
-praktisch stimme ich Dir zu das es sehr einfache Makros gibt, die "wörtlich" gleich unter Calc und Excel funktionieren. Praktisch ist die Programmierung jedoch so verschieden das Du keine Makros mit relevanter Funktionalität schreiben kannst die kompatibel sind. Allein schon der für Tabellendokumente unumgängliche Zugriff auf Zellen ist in Calc und Excel völlig verschieden.
Schau Dir mal für einen ersten Eindruck das hier an:

http://www.openoffice.org/nonav/issues/ ... icXref.sxw
http://www.openoffice.org/nonav/issues/ ... eFiles.zip


Also, ich will nicht entmutigen, aber "es ist wie es ist".


Gruß
Stephan
voltampere
Beiträge: 5
Registriert: Sa, 26.02.2005 21:09

Beitrag von voltampere »

-praktisch stimme ich Dir zu das es sehr einfache Makros gibt, die "wörtlich" gleich unter Calc und Excel funktionieren.
Darum geht es mir ja auch erstmal. Und um den Lernefekt dabei.
Praktisch ist die Programmierung jedoch so verschieden das Du keine Makros mit relevanter Funktionalität schreiben kannst die kompatibel sind.
Müssen sie auch nicht. Mir reicht wenn die Tabellen gleich aussehen und gleich funktionieren. Völlig wurscht wie es dahinter aussieht und wenn die eine *.XLS und die andere *.sxc heist, egal. Sehr komplex werden meine Calc/Excel Anwendungen eh nicht sein. Falls es dann doch dazu kommt muß ich mich halt entscheiden ob sich die Arbeit lohnt das ganze zu konvertieren.

Übrigens, danke noch mal für die Farbfunktion. In einer Testtabelle (SXC) läuft das schon ganz hervorragend. Schätze am Wochenende komme ich dazu es da einzubauen wo ich es Brauche. Demnächst schau ich dann mal ob ich es auf XLS anpassen kann.
Also, ich will nicht entmutigen, aber "es ist wie es ist".
So leicht lasse ich mich nicht entmutigen :-) Erstens muß ich nicht davon leben, zweitens ist es mehr ein Hobby, drittens hilft es mir auch im Job und selbst wenn alles nicht funktionieren sollte: Dümmer macht mich das sicher nicht :roll:
Gruß Günter
MacZarsten
**
Beiträge: 27
Registriert: Do, 10.03.2005 20:57

Beitrag von MacZarsten »

Hallo @Stephan,

das in diesem Thread beschriebene Makro scheint für mein Problem der "Stein der Weisen" zu sein. Leider weis ich nicht so genau, wie ich das Macro richtig programmiere / fehlerfrei an Laufen bekomme (OOo 2.0.1 WIN XP HE SP II). Habe unter Extras/Makros/Makros verwalten/OpenOffice.orgBasic/ unter "meine Makros" ein neues erstellt, benannt und den Quelltext hineincopiert, dann gespeichert. Die Funktion FARBE() läßt sich dann auch in einer Zelle aufrufen, ergibt aber einen Fehler bzw. der Debugger springt in der Zeile
zelle = ThisComponent.Sheets(0).getCellRangeByName(Adresse)
auf.

Stimmt das Makro nur für OOo 1.1.x? Habe ich etwas grob falsch gemacht?

Schon jetzt Danke für die Hilfe.

MacZarsten
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Stimmt das Makro nur für OOo 1.1.x?
Nein.
Habe ich etwas grob falsch gemacht?
Kann ich aus Deiner Beschreibung nicht ersehen, weil ich beispielsweise nicht weiß ob die Funktion in der Bibliothek namens "Standard" gespeichert ist, aber sagst ja die Funktion läuft.

Ich kriege diesen Fehler bespielsweise wenn ich in die Zelle schreibe:

=Farbe()

naja und das ist völlig logisch, da die Funktion Parameter erwartet, habe ich ausführlich auch so hingeschrieben:
Dann kannst Du so verfahren:

Wenn die Zelle deren Hintergrundfarbe überwacht werden soll A1 ist, und die die auf "A" überwacht werden soll B1, liefert diese Formel 1 wenn beide Bedingungen erfüllt sind:

=FARBE(ZELLE("ADDRESS";A1);255;0;0)*WENN(B1="A";1;0)

(das prüft auf rot (RGB(255,0,0)) und "A")

Da Formeln nur neu berechnet werden wenn sich die Inhalte ändern (und der Zellhintergrund i.d.S. kein Inhalt ist) mußt Du ggf. zur Aktualisierung STRG+UMSCHALT+F9 und nicht F9 drücken)



Gruß
Stephan
MacZarsten
**
Beiträge: 27
Registriert: Do, 10.03.2005 20:57

Beitrag von MacZarsten »

Hallo Stephan,

vielen Dank erst einmal für die rasche Antwort, verwende die Funktion folgendermaßen:

=Farbe(A1;204;204;204)

um zu prüfen, ob die Zelle den Hintergrund in der Farbe "Grau 20%" hat.

Der Debugger meldet einen Fehler in der genannten Zeile bei der Aktualisierung wie von Dir beschrieben.
Habe das Makro dem Dokument zugeordnet, die Funktion wird als solche erkannt, Ergebnis in der Zelle ist ein Fehler.

Danke!

MacZarsten
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

verwende die Funktion folgendermaßen:

=Farbe(A1;204;204;204)


Ich habe doch ein Beispiel gegeben, warum ignorierst Du das?

nach Beispiel sollte es heißen:

=FARBE(ZELLE("ADDRESS";A1);204;204;204)

und dann läuft es auch.


Warum das so ist kann ich mir nur erklären das ich wohl ursprünglich vorhatte das auf verschiedenen Tabellen lauffähig zu halten, diese Funktionalität jedoch nicht mit reingeschrieben habe, weshalb ZELLE("ADDRESS";A1) augenscheinlich nur sicherstellt das der komplette Zellname als String geliefert wird. (Eigentlich sollte mal ADDRESS und SHEET ausgewertet werden)
OK, Du mußt das nicht wissen, nur Du solltest dann die Vorgaben beachten, weil Dein Ausdruck als Zelladresse nicht A1 sondern lediglich A übergibt. Und das gibt dann in der entsprechenden Code-Zeile einen Fehler weil das einfach keine Zelladresse ist.
Gehen würde somit auch:
=Farbe("A1";204;204;204)

Aber ich habe es jetzt mal überarbeitet, weil mir scheint das hatte ich ursprünglich vor. Habe es jetzt aber etwas anderes hinsichtlich der Parameterübergabe realisiert:

Code: Alles auswählen

Function FARBE(Zellname As String, R, G, B, Optional Tabellenname As String)
If IsMissing(Tabellenname) then 
oDoc = StarDesktop.ActiveFrame.Controller.Model
Tabellenname = oDoc.CurrentController.getActiveSheet().Name
End if
zelle = ThisComponent.Sheets().getByName(Tabellenname).getCellRangeByName(Zellname) 
If zelle.CellBackColor(R,G,B)=RGB(R,G,B) Then 
      FARBE=1 
   else 
      FARBE=0 
End if 
End Function
das liefert dann mit:
=FARBE("A1";204;204;204)
die Rückgabe 1 wenn der Zellhintergrund der Zelle A1 des aktiven Blattes RGB(204,204,204) ist

oder mit:
=FARBE("A1";204;204;204;"meineTabelle")
die Rückgabe 1 wenn der Zellhintergrund der Zelle A1 der Tabelle Namens 'meineTabelle' RGB(204,204,204) ist


Gruß
Stephan
MacZarsten
**
Beiträge: 27
Registriert: Do, 10.03.2005 20:57

Beitrag von MacZarsten »

Hallo Stephan,

ganz herzlichen Dank - hatte es nicht verstanden, das der Zellbezug indirekt zu erfolgen hat - 'schuldigung.
Sitze z.Zt. an einem anderen Rechner ohne OOo - werde aber Testung in diesem Thread über Erfolg / Mißerfolg berichten!

Danke für die Mühe!

MacZarsten
MacZarsten
**
Beiträge: 27
Registriert: Do, 10.03.2005 20:57

Beitrag von MacZarsten »

Hallo @ Stephan,

noch einmal ganz herzlichen Dank - bd. Makros funktionieren - mein Problem ist "gelöst".

Gruß

MacZarsten :D
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo Maczarsten

Ich hab den Thread mitgelesen und bin jetzt auf einen Gedanken gekommen,
wäre es nicht etwas praktischer gleich nach dem Vorlagennamen einer Zelle zu fragen?

Etwa so:

Function ISTVORLAGE(Zellname , Vname , Optional Tabellenname As String)
If IsMissing(Tabellenname) then
oDoc = StarDesktop.ActiveFrame.Controller.Model
Tabellenname = oDoc.CurrentController.getActiveSheet().Name
End if
zelle = ThisComponent.Sheets().getByName(Tabellenname).getCellRangeByName(Zellname)
If zelle.cellstyle = Vname Then
ISTVORLAGE=1
else
ISTVORLAGE=0
End if
End Function

Alles nur geklaut, :-) Danke Stepfan

Aufgerufen wird die Funktion dann mit:
=ISTVORLAGE("A1";"dein vorlagenname";"deine tabelle") oder
=ISTVORLAGE("A1";"dein vorlagenname")


Gruß
Karo
MacZarsten
**
Beiträge: 27
Registriert: Do, 10.03.2005 20:57

Beitrag von MacZarsten »

Hallo Karolus,

vielen Dank für Deinen Makro-Vorschlag - habe letztendlich auch den von Stephan (funktioniert übrigens hervorragend) nicht verwenden können, da die Zelladdressierung indirekt erfolgt (also nicht mit "A1" eingegeben werden kann) und das Auslesen der Hintergrundfarbe in einer Matrize erfolgen muß.
Als Lösung habe ich eine ausgeblendete Hilftabelle verwendet, in der ich die Bedingungen, die zur Zuweisung der entsprechenden Zellformatierungen führen, noch einmal abfrage, den Zellen einen entsprechenden Wert ( 0 bis 2) zuweise, und mit der ich dann die Funktion =ZÄHLENWENN() in der Matrize laufen lassen kann.
Trotzdem ganz herzlichen Dank für Eure Bemühungen!

MacZarsten :)
Gesperrt