Seite 2 von 2

Verfasst: Mi, 07.03.2007 00:18
von Karolus
Hallo Jürgen

Ich hab zu deinem Problem mal einen anderen Lösungsansatz entwickelt, vielleicht kannst du dich damit anfreunden:

1.Schritt
Der Benutzer definiert in einem Zellbereich (fürs Beispiel Tabelle1.A1:A7)
eigene Kürzel[1] und weist gleich die jeweils gewünschte Hintergrundfarbe zu.

[1]Die Wahlmöglichkeit kann ja mit ->Daten->Gültigkeit eingeschränkt werden.

Im
2. Schritt-
-erstellt der folgende Code daraus Zellvorlagen benamt mit den Kürzeln in den Zellen (ich habs leider nur mit Dispatcher-code geschafft neben den Vorlagennamen auch die Formatierungen in die Zellvorlagen aufzunehmen):

Code: Alles auswählen

sub zellvorlagen
odoc = thisComponent
osheet = odoc.sheets(0)
for zeile = 0 to 6
ozell = osheet.getcellbyPosition(0,zeile)
zvorlname = ozell.string
odoc.CurrentController.Select(ozell)
neuVorlageausSelektion(zvorlname) 'Aufruf Dispatcher-function
odoc.CurrentController.Select(-1)
osheet.getcellbyPosition(0,zeile).cellstyle = zvorlname
next zeile

end sub

function neuVorlageausSelektion(vorlagenname as string)
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")
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Param"
args1(0).Value = vorlagenname
args1(1).Name = "Family"
args1(1).Value = 2
dispatcher.executeDispatch(document, ".uno:StyleNewByExample", "", 0, args1())
end function
3. Schritt
Zum "Einfärben" schreibt folgendes Makro bedingte Formatierungen in selektierte Zellbereiche (das kann aber auch in festeingestellte Zellbereiche geändert werden):

Code: Alles auswählen

Sub bedingteFormatierung()
dim BedingtFormat as Object
dim tabblatt
bereich = thisComponent.getcurrentSelection.rangeAddress
with bereich
	erstSp = .startColumn
	erstzei = .startRow
	endSpa = .EndColumn
	endZei = .EndRow
end with
dim Zellformat(3) as New com.sun.star.beans.PropertyValue
Zellformat(0).Name = "Operator"
Zellformat(0).value = com.sun.star.sheet.ConditionOperator.EQUAL
Zellformat(1).Name = "Formula1"
Zellformat(2).Name = "StyleName"

tabblatt = ThisComponent.Sheets(0)
for sp = erstSp to endSpa
	for ze = erstzei to endZei
	BedingtFormat = tabblatt.getcellbyPosition(sp,ze).ConditionalFormat
		For bf = 0 to 6
			ocell = thisComponent.sheets(0).getcellbyPosition(0,bf).string
			Zellformat(1).value = chr(34) & ocell & chr(34)
			Zellformat(2).value = ocell
			BedingtFormat.addNew( Zellformat())
		next bf
		tabblatt.getcellbyPosition(sp,ze).ConditionalFormat = BedingtFormat
	next ze
next sp
end sub
Anmerkung: Das letzte Makro führt eine richtige 'bedingte Formatierung' durch, d.h.: Bei Änderungen werden die Hintergrundfarben automatisch angepasst. (Quelle : OOo-user Mailliste - Stephan)

Gruß Karo

Verfasst: Mi, 07.03.2007 00:40
von turtle47
Hi Karolus,

da hast Du Dir aber eine Arbeit gemacht. Das muss ich mir morgen mal in Ruhe reinziehen.
Das mit den Zellvorlagen ist sicher eine super Sache.

Habe mir zwischenzeitlich einen Code zusammengestellt der den Vorgabebereich
aus der Optionstabelle in die Planungstabelle überträgt.

Code: Alles auswählen

Sub FarbeZellen

   oDocument = ThisComponent
   oSheet1 = oDocument.Sheets.getByIndex(0)
   oSheet2 = oDocument.Sheets.getByIndex(1)
  
   oQuelleRange = oSheet1.getCellRangeByName("A1:D1")
   oQuellRangeAddresse = oQuelleRange.getRangeAddress
   
   oZiel = oSheet2.getCellRangeByName("F3") 
   oZielCellAddresse = oZiel.getCellAddress
   
   oSheet2.copyRange(oZielCellAddresse,oQuellRangeAddresse)

End Sub
Jetzt müsste da noch eine Schleife rein die bei:

Code: Alles auswählen

("F3") 
ersetzt durch

Code: Alles auswählen

("F"& x)
Startwert für x=5 und dann 11 mal um 33 höchzählen.

Nochmals tausend Dank für Deine Hilfe.
Werde weiter berichten.
Wenn Dir noch etwas einfällt dann gerne posten.

Jürgen

Verfasst: Mi, 07.03.2007 10:21
von turtle47
Hallo Karolus,

wollte Dir nur schon mal kurz Feedback zu Deinem Code geben.

Die Zellvorlagen aus den Zellen selbst herraus zu erstellen funktioniert hervorragend!

Nur bei dem Makro für die bedingte formatierung da klemmt es ein wenig.
Wenn ich das Makro habe ausführen lassen, dann funktioniert dieses nur
für das was in Zelle A1 gestanden hat.

Schöne Grüße

Jürgen

Verfasst: Mi, 07.03.2007 11:20
von Karolus
Hallo Jürgen
Startwert für x=5 und dann 11 mal um 33 höchzählen.

Code: Alles auswählen

....
for i = 0 to 11
  z = i*33+5
   oZiel = oSheet2.getCellRangeByName("F" & z)
   oZielCellAddresse = oZiel.getCellAddress
   oSheet2.copyRange(oZielCellAddresse,oQuellRangeAddresse)
next i
end sub
Nur bei dem Makro für die bedingte formatierung da klemmt es ein wenig.
Wenn ich das Makro habe ausführen lassen, dann funktioniert dieses nur
für das was in Zelle A1 gestanden hat.
Man sollte am Code nichts mehr ändern wenn man ihn bereits hierher kopiert hat, in der Zeile:
ocell = thisComponent.sheets(0).getcellbyPosition(0,b).string
muss b natürlich durch bf ersetzt werden. Ich habs im Original korrigiert.

Gruß Karo

Verfasst: Mi, 07.03.2007 14:18
von turtle47
Hi Karolus,

die Schleife habe ich ausprobert und funktioniert super.

Die Lösung für die bedingte Formatierung (bF) ist einfach genial.
An sowas habe ich schon lange gesucht, auch schon hier im Forum damals.
Es wurde mir dann geraten die Zellvorlagen mit Formel über die bF zuzuweisen.
Aber dann flackerte der Bildschirm. Aber dieser Code ist wirklich super.

Mein Ziel rückt immer näher.

Es gilt jetzt aber noch zwei Hürden zu nehmen.
Das Eine ist, wenn man den Code von:

Code: Alles auswählen

sub zellvorlagen
odoc = thisComponent
osheet = odoc.sheets(0)
for zeile = 0 to 6
ozell = osheet.getcellbyPosition(0,zeile).....
zweimal (hintereinander) ausführt, das kann ja dann der Fall sein wenn sich der
User plötzlich für ein anderes Kürzel entscheidet, dann werden die Zellfarben
alle -1, also ohne Farbe. Warum das so ist versuche ich noch herrauszufinden.
Vielleicht hast Du eine Idee.

Als Workaround hatte mir gedacht der User muss zuerst eine "RESET" Taste
drücken bevor er etwas neues macht.

Das Zweite sind die Bereiche der bF.
(das kann aber auch in festeingestellte Zellbereiche geändert werden):
Wie setze ich das den z.B. für die Bereiche:

Code: Alles auswählen

("C8:AG37";"C44:AE73";C80:"AG109";.......)
am besten um?

Vielen Dank im vorraus.

Jürgen

Verfasst: Mi, 07.03.2007 19:17
von Karolus
Hallo Jürgen
Zum Reset der Formatvorlagen geht folgendes:

Code: Alles auswählen

sub resetzellvorlagen
odoc = thisComponent
osheet = odoc.sheets(0)
for zeile = 0 to 6
ozell = osheet.getcellbyPosition(0,zeile)
zvorlname = ozell.string
resetvorlname(zvorlname) 'Aufruf Dispatcher-function
next
end sub

function resetvorlname(vorlagenname as string)
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
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Param"
args1(0).Value = vorlagenname
args1(1).Name = "Family"
args1(1).Value = 2
dispatcher.executeDispatch(document, ".uno:DeleteStyle", "", 0, args1())
end function
Zu deiner nächsten Frage eine Gegenfrage:
"C8:AG37";"C44:AE73";C80:"AG109";.......)
Müssen hier wirklich die wenigen Zeilen Zwischenraum von der bedingten Formatierung ausgenommen werden ? - Sofern die Kürzel in diesen Zeilen nicht auftauchen, hätte die Formatierung keine Auswirkung, ebenso würde eine direkte Formatierung dieser Zwischenräume nicht überschrieben werden.
Solltest du den ganzen Bereich mit Zwischenzeilen nehmen dann:

Code: Alles auswählen

setzt du hier hinter die Gleichheitszeichen die entsprechenden Spalten- und Zeilennummern und löscht den Rest der Zeile und die oberste und unterste Zeile( C→2, Zeile8→7,AG→32, ?→?
....
with bereich
   erstSp = .startColumn
   erstzei = .startRow
   endSpa = .EndColumn
   endZei = .EndRow
end with 
....
Gruß Karo

Verfasst: Mi, 07.03.2007 19:46
von turtle47
Hey Karolus,

ich weiss nicht, ob Du Dir die MA-Planung mal runtergeladen und angesehen hast.

Hier nochmals der Link dazu:
http://www.office-center-epj.info/zaehl ... -2007-V4-0

In der Fassung die derzeit bearbeite (noch nicht im Netzt) ist ein ewiger Kalender eingearbeitet.
Die Zelle an Wochenenden werden darin schon über bF farblich anders dargestellt.
Ich müsste jetzt erst mal ausprobieren ob diese bestehende bF von der bF
über das Makro "zerschossen" wird.

Sonst muss ich in den sauren Apfel beissen für diese 12 Bereiche je ein Makro
anzulegen und diese dann alle 12 über ein Master-Makro aufzurufen.

Da Du das Reset-Makro schon "mitgeliefert" hast gehe ich davon aus, dass Du
das auch als vertretbare Lösung siehst.

Vielen Dank für die rege Teilnahme an diesem Projekt, welches der OOo-Gemeinde ja zugute kommt. :lol:

Schönen Abend noch.

Jürgen

Verfasst: Mi, 07.03.2007 21:10
von Karolus
Hallo Jürgen

Falls du mir das Passwort für den Tabellenschutz verrätst, kann ich mir das Dokument auch wirklich anschauen.
Eine bestehende bedingte Formatierung wird nicht gelöscht.

Es ginge wohl auch die 12 Bereiche in ein array zu schreiben:
array(12) = ("C8:AG37",.....)
und die Bereiche mit einer Schleife über array(i) auszulesen..., aber ich hoffe es geht ohne.

Gruß Karo

Verfasst: Mi, 07.03.2007 21:53
von turtle47
Hey Karolus,
Es ginge wohl auch die 12 Bereiche in ein array zu schreiben:
array(12) = ("C8:AG37",.....)
Das hatte ich auch gemeint mit:

Code: Alles auswählen

("C8:AG37";"C44:AE73";C80:"AG109";.......)
habe Dir eben eine PN gesendet .

Schöne Grüße.

Jürgen