Calc: textfarbe definieren?

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Chrittig
Beiträge: 4
Registriert: Mo, 07.06.2004 13:28

Calc: textfarbe definieren?

Beitrag von Chrittig »

Hallo Zusammen....

Ich habe zwar schon google, gefragt, aber keine Antowrt bekommen. (wahrscheinlich die falsche Frage gestellt.)

Folgendes Problem: wenn in einer Zelle eine Null steht, soll die Textfarbe auf weiss umgeschaltet werden:

oZelle = oTabellenblatt.getCellByPosition( 1 , xAchse )
If oZelle.Value = 0 Then
...

Wenn ich das dann mit dem makrorekorder aufnehme
und folgendes einfüge:

dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Color"
args1(0).Value = 16777215

dispatcher.executeDispatch(document, ".uno:Color", "", 0, args1())

meldet er das der dispatcher kein definiertes objekt ist....

Kann mir einer von euch helfen???

Vielen Dank im Voraus
Chrittig
Chrittig
Beiträge: 4
Registriert: Mo, 07.06.2004 13:28

Beitrag von Chrittig »

Also das ist der komplette Code meines Programmes:

Sub Einkaufszettel
' Variablen deklarieren
dim document as object
dim dispatcher as object
Dim oCalcDokument as Object
Dim oTabellenblatt as Object
Dim oZelle as Object
Dim stext as String
Dim Anzahl as String
Dim xAchse as Single
Dim x As Single
Dim y As String
Dim z as Single

' aktuelles Dokument holen
oCalcDokument = ThisComponent
' erstes Tabellenblatt holen
oTabellenblatt = oCalcDokument.Sheets(0)

z = 3
Do until y = 0
oZelle = oTabellenblatt.GetCellbyPosition(0, z)
y= oZelle.string
z = z + 1
loop


x= 1
z= z - 3
Do until x = z
xAchse= 2 + x
' Zelle A1 liegt auf Position 0,0
oZelle = oTabellenblatt.getCellByPosition( 0, xAchse )
Anzahl = Inputbox("Wie viele Pakete " & oZelle.string & " werden gebraucht?")
oZelle = oTabellenblatt.getCellByPosition ( 1, xAchse)
oZelle.String = Anzahl
x=x+1
loop

x=1

Do until x = z
xAchse= 2 + x
oZelle = oTabellenblatt.getCellByPosition( 1, xAchse )
If oZelle.Value = 0 Then
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Color"
args1(0).Value = 16777215

dispatcher.executeDispatch(document, ".uno:Color", "", 0, args1())
End if
Loop
End Sub



und folgendes gibt mir der Makrorecorder:

sub nextt
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Color"
args1(0).Value = 16777215

dispatcher.executeDispatch(document, ".uno:Color", "", 0, args1())


end sub


und das was der Makrorekorder ausgibt muss ich irgendwie in den kursiven Teil oben einbauen, damit es läuft, tut es aber nicht.....

Irgendwas mache ich dabei falsch ich habe keine Ahnung was.

und das

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Hilft leider auch nicht weiter...

Danke im Voraus.

Chrittig
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly »

Hallo!

Ich habe deinen Code nicht durchgetestet, habe allerdings schon öfters mit dem Makrorekorder gearbeitet:
Chrittig hat geschrieben:und folgendes gibt mir der Makrorecorder(gekürzt):
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Color", "", 0, args1())
In deinem Programm fehlen mir die beiden oberen Zeilen.
Der Code vom Makrorekorder muss immer diese Zeilen enthalten, sonst kann die die dritte Zeile nicht ausgeführt werden.
Dies ist logisch, da erst dadurch den Objektvariablen Document und dispatcher ein Wert zugewiesen wird. Die Belegung der args-Variablen also genügt allein nicht.
Vielleicht funktioniert dein Programm dann.

Gruss Charly
Chrittig
Beiträge: 4
Registriert: Mo, 07.06.2004 13:28

Beitrag von Chrittig »

Vielen Dank Stephan,

genau den Befehl Charcolor habe ich gesucht...

Die Schleife brauche ich, weil mehrere Zellen auf den Wert 0 gepürft werden müssen. Den Zähler habe ich jetzt eingebaut.....

Seltsamerweise macht die Messagebox aus jeder 0 die ich eingebe ein '0
Ich musste also die Regel meiner If Schleife ändern auf:

Code: Alles auswählen

Do until x = z
xAchse= 2 + x
oZelle = oTabellenblatt.getCellByPosition( 1, xAchse )
If oZelle.Value < 1 Then
oZelle.CharColor = 16777215 
oZelle = oTabellenblatt.getCellbyPosition (0, xAchse)
oZelle.CharColor = 16777215 
End if
x = x + 1
Loop

Vielen Dank euch allen.

Liebe Grüsse
Chrittig
Wolfgang Lampert
****
Beiträge: 102
Registriert: Do, 13.05.2004 16:24
Wohnort: Neuss

Beitrag von Wolfgang Lampert »

Hi,
ich möchte noch einmal von Anfang an beginnen:
Hinter der (Makro)Frage steht ein Problem innerhalb einer Tabelle (Zellformatierung). Wenn es nur um die Problemlösung geht (Wenn Zellwert = 0 dann Schrift = "Weiss") , gibt es sinnvollere Lösungen. Insgesamt fallen mir 3 Lösungen ein
1. Grundsätzliche Anzeige aller Zellen mit 0 unterdrücken: Menü-Extras-Optionen-Tabelle-Ansicht-Nullwert deaktivieren
2. Bedingte Formatierung bestimmter Bereiche: Menü-Format-Bedingte Formatierung
3. Makrolösung:
Meiner Meinung nach hast Du Dich durch den Makrorecorder auf einen zu komplizierten Weg eingelassen "Siehe das Gute liegt so nah..."
Mein Vorschlag:
Sub ZellAttribute
Dim oDoc as Object, oSheet as Object, oCell as Object
oDoc = StarDesktop.CurrentComponent
REM Beginn Schleife 1: Tabellenauswahl
oSheet = oDoc.Sheets(0)
REM Beginn Schleife 2: Zellauswahl
oCell = oSheet.getCellByPosition(0,0) REM Beispiel nur für Zelle A1
if oCell.Value = 0 then
oCell.CharColor = RGB(255,255,255) REM entspricht 16777215
else
oCell.CharColor = "Schwarz" REM entspricht RGB(0,0,0)
end if
REM Ende Schleife 2
REM Ende Schleife 1
End Sub
Mein Vorschlag beinhaltet If ..Else.. für eine Reformatierung, da Dein Lösungsansatz ist sehr gefährlich ist, wenn das Makro mehr als 1* in einer Mappe verwendet wird. Warum? Nehmen wir an, 0-Zellen wurden nachträglich mit Werten gefüllt - bei Deinem Lösungsansatz bleiben diese Weiss
Gruss Wolf
Chrittig
Beiträge: 4
Registriert: Mo, 07.06.2004 13:28

Beitrag von Chrittig »

Hallo zusammen!

Vielen Dank dass Ihr euch soviel Mühe gebt.

Also dass da noch einige Fehler drin waren, habe ich gestern abend auch gemerkt, diese aber nach einigem Probieren selber eliminieren können.

Hier eine kurze Erläuterung, was das tool können soll:

Es geht um einen Einkaufszettel, der alle möglichen Produkte abfragt, damit wir nichts vergessen.
Ihr könnt euch die gesamte Datei downloaden unter

http://www.chrittig.de/ekz0.5.sxi

(die datei heisst noch 0.5 weil ich noch nicht mit allem zufrieden bin.)

Ich habe das jetzt auch so gemacht, dass die komplette Tabelle vorher wieder schwarz gefärbt wird... (also die Buchstaben.)

und das mit dem '0 stellte ich auch irgendwann fest, es durfte halt nicht activecell.string heissen sondern musste activecell.value heissen. dann lief auch meine Abfrage.

@Wolfgang

Die Idee mit dem Ausblenden Der Nullwerte ist schon ziemlich gut.


Das Weissfärben ist nur ein hilfsmittel, alle weissgefärbten zellen werden nicht gedruckt, und dann braucheich die entsprechenden Produkte nicht einkaufen.

Leider wird aber natürlich der Platz auf dem Papier verschwendet. Ich müsste also versuchen die Zellen auszublenden. Aber nicht nur die Zellen, die nen 0 Wert haben, sondern auch die Ware, die in der Zelle davor steht.
Zeilenweises ausblenden geht nicht, weil der andere laden an dieser Stelle ja keine 0 stehen haben muss..


Nochmal vielen Dank an alle.

Gruss
Chrittig
Wolfgang Lampert
****
Beiträge: 102
Registriert: Do, 13.05.2004 16:24
Wohnort: Neuss

Beitrag von Wolfgang Lampert »

Jetzt muss ich mir nur noch ne Lösung finden, wie die "Weissen Zeilen" beim druckern übersprungen werden, so dass ich keine halbleeren Blätter habe.
Hi, du kommst ja aus der 'Verwöhnzohne' überhaupt nicht heraus.
Anbei 3 Makros, um Zeilen mit Zellen 0/String/blank auszublenden.
1. auf das wesentlichste reduziert
2. mit dem Cursor auswählbarer Datenbereich / Kriterienspalte
3. fester Datenbereich, KriterienSpalte frei wählber

sub Zeile_ausblenden_vereinfachte_Version
REM DatenBereich: A1:D15
REM KriterienSpalte: A (iSpalte)
REM Kriterien: 0 oder String oder leer

oDoc = StarDesktop.CurrentComponent.CurrentController.getActiveSheet
oZeilen = oDoc.getCellRangeByName("A1:D15").getRows
iSpalte = 0
iZeile = 0
For i = 0 to (oZeilen.getCount - 1) REM .getCount ermittelt die ZeilenAnzahl
if oDoc.getCellByPosition(iSpalte,iZeile).Value = 0 then
oZeilen.getByIndex(i).IsVisible = False
else
oZeilen.getByIndex(i).IsVisible = True
end if
iZeile = iZeile + 1
next i
end sub
REM --------------------------------------------------------------------------------
sub Zeilen_ausblenden_variabler_DatenBereich
REM Zellbereich mit Cursor markieren
REM mehrere Spalten sind zulässig
REM KriterienSpalte in diesem Beispiel auf Spalten A-G begrenzt
REM Kriterien: 0 oder String oder leer

oDoc = StarDesktop.CurrentComponent REM aktive Arbeitsmappe identifizieren
oSheet = oDoc.getCurrentController.getActiveSheet
oZeilen = oDoc.getCurrentSelection().getRows REM aktive Cursorposition identifizieren
oBereich=oDoc.getCurrentSelection().getRangeAddress() REM Aktuelle Auswahl
iZeile = oBereich.StartRow REM 1. Zeile festlegen
REM bei mehreren Spalten KriteriumsSpalte festlegen
if (oBereich.EndColumn - oBereich.StartColumn) <> 0 then
sZielSpalte = InputBox("Die Auswahl enthälte mehrere Spalten!" + chr(13) + "Geben Sie den Buchstaben der Spalte" + chr(13) + "mit dem Abfragekriterium ein", "ABFRAGEBEREICH NICHT EINDEUTIG!!!", "A")
Select Case sZielSpalte
case "A", "a"
iZielspalte = 0
case "B", "b"
iZielspalte = 1
case "C", "c"
iZielspalte = 2
case "D", "d"
iZielspalte = 3
case "E", "e"
iZielspalte = 4
case "F", "f"
iZielspalte = 5
case "G", "g"
iZielspalte = 6
case else
msgbox "Die SpaltenAuswahl wurden zwischen A - G begrenzt!!!" +chr(13) + "Für diesen Test wurde deshalb die 1. Spalte ausgewählt"
iZielspalte = 0
end select
else
iZielspalte = oBereich.StartColumn REM wenn nur 1 Spalte markiert ist
end if
iZeile = oBereich.StartRow
For i = 0 to (oZeilen.getCount - 1) REM .getCount ermittelt die ZeilenAnzahl
if oSheet.getCellByPosition(iZielspalte,iZeile).Value = 0 then
oZeilen.getByIndex(i).IsVisible = False
else
oZeilen.getByIndex(i).IsVisible = True
end if
iZeile = iZeile + 1
next i
end sub
REM ------------------------------------------------------------------------
sub Zeilen_ausblenden_fester_DatenBereich
REM Kriterien: 0 oder String oder leer

oDoc = StarDesktop.CurrentComponent.CurrentController.getActiveSheet
oZeilen = oDoc.getCellRangeByName("A1:X50").getRows
oSpalten =oDoc.getCellRangeByName("A1:X50").getColumns
oBereich = oDoc.getCellRangeByName("A1:X50").getRangeAddress()
iZeile = oBereich.StartRow REM 1. Zeile festlegen

REM bei mehreren Spalten KriteriumsSpalte festlegen
if (oBereich.EndColumn - oBereich.StartColumn) <> 0 then
sZielSpalte = InputBox("Die Auswahl enthälte mehrere Spalten!" + chr(13) + "Geben Sie den Buchstaben der Spalte" + chr(13) + "mit dem Abfragekriterium ein", "ABFRAGEBEREICH NICHT EINDEUTIG!!!", "A")
Select Case sZielSpalte
case "A", "a"
iZielspalte = 0
case "B", "b"
iZielspalte = 1
case "C", "c"
iZielspalte = 2
case "D", "d"
iZielspalte = 3
case "E", "e"
iZielspalte = 4
case "F", "f"
iZielspalte = 5
case "G", "g"
iZielspalte = 6
case else
msgbox "Die SpaltenAuswahl wurden zwischen A - G begrenzt!!!" +chr(13) + "Für diesen Test wurde deshalb Spalte 'A' ausgewählt"
iZielspalte = 0
end select
else
iZielspalte = oBereich.EndColumn
end if

For i = 0 to (oZeilen.getCount - 1) REM .getCount ermittelt die ZeilenAnzahl
REM msgbox oDoc.getCellByPosition(iZielspalte,iZeile).Value

if oDoc.getCellByPosition(iZielspalte,iZeile).Value = 0 then
oZeilen.getByIndex(i).IsVisible = False
else
oZeilen.getByIndex(i).IsVisible = True
end if
iZeile = iZeile + 1
next i

end sub


Gruss Wolf
Wolfgang Lampert
****
Beiträge: 102
Registriert: Do, 13.05.2004 16:24
Wohnort: Neuss

Beitrag von Wolfgang Lampert »

Hi Stephan,
auch dieses Mal ist Dein Input mehr als Willkommen.
Die Makros waren nur auf das Problem
"wenn Zellwert = 0 dann Zeile ausblenden" ausgerichtet.
Werde Deine Kommentare übers Wochenende verinnerlichen und umsetzen.
Gruss Wolf
Wolfgang Lampert
****
Beiträge: 102
Registriert: Do, 13.05.2004 16:24
Wohnort: Neuss

Beitrag von Wolfgang Lampert »

Hi Stephan,
mich interessieren ob Du trotzdem durch irgendeine Eingabe einen Fehler provozieren kannst
Ich muss Dich leider enttäuschen - in Deinen Code kann ich nicht abstürzen lassen.
Aaaaber ich habe eine Basic-Lücke entdeckt, durch die Du nicht ganz 'rund' geworden bist
sZielSpalte = InputBox(text1,text2 , "A")
text2 = "Fehlerhafte Eingabe, bitte korrigieren"
if len(sZielSpalte) <> 1 then Fehler = 1
if sZielspalte = "" then
MsgBox "Benutzerabbruch"
Exit Do
InputBox interpretiert eine leere Eingabe genau so wie die Taste 'Abbruch', beide erzeugen einen Leerstring "". Meiner Meinung nach sind dies zwei unterschiedliche Informationen. Nur die Taste 'Abbruch' sollte ein Verlassen der Schleife bewirken.
So und nun kommt mein Beitrag zum Wochenende. Wenn Du schon so viel Zeit investierst, muss ich da wohl mithalten. Bisher haben wir die Auswahl auf die Spalten A >> G beschränkt. Aber wenn wir schon einmal dabei sind, sollten wir auch ALLE möglichen Spalten ansprechen können.
Anbei mein Vorschlag (ohne Deine Vorarbeit wohl nicht möglich gewesen).
Sollte es eleganter gehen - Deine Kritik ist wie immer willkommen.
mit sportlichem gruss Wolf
sub Eingabe_Wolf
text1 = "Die Auswahl enthälte mehrere Spalten!" + chr(13) + "Geben Sie den Buchstaben der Spalte" + chr(13) + "mit dem Abfragekriterium ein"
text2 = "ABFRAGEBEREICH"
Do
iFehler = 0
sZielSpalte = InputBox(text1,text2 , "A")
if sZielspalte = "" then REM Benutzerabbruch
Exit Do
end if
iZeichen1 = ASC(UCase(Mid(sZielSpalte,1,1))) REM ASCII Code 1. Zeichen

select case len(sZielSpalte) REM Anzahl der eingegebenen Zeichen
case 1
if iZeichen1 < 65 or iZeichen > 90 then REM Gültigkeitbereich 1. Zeichen
iFehler = 2
else
iZielSpalte = iZeichen1 - 65
iFehler = 0
end if
case 2
iZeichen2 = ASC(UCase(Mid(sZielSpalte,2,1))) REM ASCII Code 2. Zeichen
if iZeichen1 < 65 or iZeichen > 90 or iZeichen2 < 65 or iZeichen2 > 90 then
iFehler = 2
else
iZielSpalte = (iZeichen1 - 65)*26 + iZeichen2 - 39
iFehler = 0
end if
case else
iFehler = 1 REM Eingabe 0 oder > 2 Zeichen
end select

if iZielSpalte < 0 or iZielSpalte > 255 then REM Eingabe nicht innerhalb SpaltenBereich 'A >> IV'
iFehler = 2
end if

Select case iFehler
case 1
msgbox "Eingabe bis 2 Buchstaben / Maximal 'IV': " + sZielSpalte
case 2
msgbox "Ungültige Eingabe: " + sZielSpalte
End Select

Loop While iFehler <> 0

msgbox "Gratuliere, Du kannst eine Spalte identifizieren :" + sZielSpalte + ": = Spalte#: " + iZielSpalte +CHR(13)+"Oder Du hast einfach die Taste 'Abbruch' gedrückt"+chr(13)+"Oder einen LeerString eingegeben"

end sub
Wolfgang Lampert
****
Beiträge: 102
Registriert: Do, 13.05.2004 16:24
Wohnort: Neuss

Beitrag von Wolfgang Lampert »

Hi Stephan,
danke für die Mühe - aber die Kenntnis darüber, das Abbruch und LeerInput = "" sind, reichen mir im Moment.
Forms sind erst übernächste Woche bei mir dran - und wie ich es einschätze, wirst Du davon erfahren :P
Gruss Wolf
Antworten