Text aus Zelle weiterverarbeiten

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Text aus Zelle weiterverarbeiten

von turtle47 » Mi, 07.03.2007 21:53

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

von Karolus » Mi, 07.03.2007 21:10

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

von turtle47 » Mi, 07.03.2007 19:46

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

von Karolus » Mi, 07.03.2007 19:17

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

von turtle47 » Mi, 07.03.2007 14:18

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

von Karolus » Mi, 07.03.2007 11:20

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

von turtle47 » Mi, 07.03.2007 10:21

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

von turtle47 » Mi, 07.03.2007 00:40

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

von Karolus » Mi, 07.03.2007 00:18

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

von turtle47 » Di, 06.03.2007 15:34

Hallo Karo,

danke, das ist schon mal ein Ansatz.

Ich muss noch einmal auf den von Thomas zuletzt geposteten Code zurückkommen.

Dort kann ich die Zeile:

Code: Alles auswählen

s = oZelle.String
löschen und das Programm verichtet seine Dienste so wie es soll.

Wenn ich dieselbe Zeile in meinem modifizerten Code lösche dann hängt das
Makro an dieser Stelle:

Code: Alles auswählen

if oZelle.String = oZelle2.String then
mit der Fehlermeldung:
BASIC-Laufzeitfehler.
Objektvariable nicht belegt.
Wenn ich nach Deinen Hinweis folgenden Teilcode verwende:

Code: Alles auswählen

ozelle = oSheet.getCellbyPosition(4,10) 
   s = oZelle.string
   for i = 4 to 10
      oZelle2 = oSheet.getCellbyPosition(i, 0)
         if oZelle.String = oZelle2.String then
           oZelle.CellBackColor = oZelle2.cellBackColor
dann läuft das Programm durch aber die Zellen erhalten auf dem ersten
Blatt nicht die entsprechenden Farben.

Was ist da noch nicht in Ordnung?
Kann der Code in dieser Konstellation überhaupt funktionieren?

Dankende Grüße

Jürgen

von Karolus » Di, 06.03.2007 14:04

Hallo Jürgen

So wie es ausschaut hast du an der Stelle 'ozelle' noch nicht definiert ? -
Ich finde nichts in der Art :

ozelle = oSheet.getCellbyPosition(?, ?) -oder so ähnlich.

Gruß Karo

von turtle47 » Di, 06.03.2007 12:58

Hallo Zusammen,

der von Thomas gepostete Code funktioniert jetzt einwandfrei.
Die Tabelle ist nun viel flexibler geworden.

In der Planungstabelle sind in festen Bereichen (12) die Kürzel aus der Optionstabelle schon vorhanden.
Diese sollen nicht einzeln durch Markieren die Farben aus der Optionstabelle erhalten sondern auf einen Schlag.

Habe den Code von Thomas wie folgt umgebaut:

Code: Alles auswählen

Sub FarbeZellen
	z = Array("A1:D1","A2:D2")
	oCalc = ThisComponent
	 For i = LBound(z()) To UBound(z())
	  oBereich=oCalc.Sheets(0).getCellRangeByName(z(i))
      'oBereich.CellBackColor = RGB (47, 138, 221) 'aus dem Ursprungscode!!
   		ZelleFaerben(oZelle)
Next i
end sub

Sub ZelleFaerben(oBereich)
   oSheet = thisComponent.sheets(2)  'eventuell anpassen! Optionstabelle.
   s = oZelle.string
   for i = 4 to 10
      oZelle2 = oSheet.getCellbyPosition(i, 0)
         if oZelle.String = oZelle2.String then
           oZelle.CellBackColor = oZelle2.cellBackColor
           exit sub
         end if
   next
   oZelle.cellBackColor = -1
   msgbox "Das Kürzel wurde nicht gefunden"   
End Sub
An der Stelle:

Code: Alles auswählen

s = oZelle.string
kommt die Fehlermeldung:
BASIC-Laufzeitfehler.
Objektvariable nicht belegt.
Wie muss der Code umgebaut werden das er für die Bereiche funktioniert?

Vorab schon mal Danke.

Jürgen

von turtle47 » Mo, 05.03.2007 00:16

Hi Thomas,

habe das Makro zu laufen gebracht.
Hier auch, kleine Ursache, große Wirkung.

Die Zeile in Sub ZelleFaerben(oZelle):

Code: Alles auswählen

oZelle2 = oSheet.getCellbyPosition(i, 1)
habe ich abgeändert in:

Code: Alles auswählen

oZelle2 = oSheet.getCellbyPosition(i, 0)
und der Code war perfekt. :D

Vielen Dank und schöne Grüße.

Jürgen

von turtle47 » Fr, 02.03.2007 21:11

Hallo Thomas,

habe Deinen Rat befolgt und folgendes in das bestehende Makro eingebaut:

Code: Alles auswählen

sub meinMakro
  thisComponent.lockControllers()
  ' hier folgt jetzt dein Makrocode
  ' und weiter'

  thisComponent.unlockControllers()  'Controller wieder entsperren
end sub
Funktioniert wunderbar. Kleine Ursache, große Wirkung. Es flackkert nichts mehr. :D

Den anderen Code habe ich auch ausprobiert aber leider nicht mit dem gewünschten Erfolg.
Daraufhin habe ich mir das Format der Zellen mal angeschaut und festgestellt
das diese im Datumsformat vorlagen. Das ist wahrscheinlich durch Kopieraktionen beim Erstellen
der Tabelle passiert. :oops:

Habe diese Zellen jetzt, wie es sich gehört, als Text formatiert.
Aber meistens kommt die Fehlermeldung: "Das Kürzel wurde nicht gefunden".
Sheets(0) habe ich umgeschrieben zur Optionstabelle auf sheets(2) (3. Tabelle im Dokument).

Dann habe ich ein bischen expiremtiert und dabei ist es je nach Codekonsterlation vorgekommen,
das die erste Zelle der Vorgabezeile einen weißen Hintergrund bekommen hat.
Ich versuche das mal reproduzierbar zu machen.

Werde am Wochenende mal weiter daran arbeiten, mich in mein Makrobuch vertiefen,
um zu sehen wo der Hund begraben liegt.

Vielen Dank für die sehr guten Tips.

Was mich wundert ist, dass Du eigentlich der Einzige bist der zu solchen Themen etwas beiträgt.
Was ist da los? Wo sind die anderen Spezialisten? Thomas, das soll nicht heissen das ich mit Dir
nicht zufrieden bin, ganz im Gegenteil, aber mich wundert es doch ein wenig.

Schöne Grüße

Jürgen

von Toxitom » Fr, 02.03.2007 12:17

Hey Jürgen,

hmm, was fehlt dir denn noch? ist doch eigentlich schon alles gesagt?

Bastle alles zusammen - dann läuft das:

Deine Ursprungsfunktion:

Code: Alles auswählen

sub FarbAenderung  'Füllt die Zellen mit Farbe

   If MsgBox ("Möchten Sie die ausgefüllten Zellen wirklich in Farbe darstellen?", 36 , "Farbige Darstellung der ausgefüllten Zellen") = 7 Then
   ' Yes button pressed

exit sub 'No button pressed
End IF

   oSelect=ThisComponent.CurrentSelection
oRow=oSelect.Rows
oColumn=oselect.Columns
For m = 0 To oRow.getCount-1
  For n= 0 To oColumn.getCount-1
    oCell=oselect.getCellByPosition (n, m) 
    REM jetzt Aufruf der neune funktion
    ZelleFaerben(oCell)
  next
next
End sub
Und dan packst du die Zusatzfunktion als eigenständige sub rein:

Code: Alles auswählen

Sub ZelleFaerben(oZelle)
   oSheet = thisComponent.sheets(0)  'eventuell anpassen! Optionstabelle.
   s = oZelle.string
   for i = 4 to 10
      oZelle2 = oSheet.getCellbyPosition(i, 1)
         if oZelle.String = oZelle2.String then
           oZelle.CellBackColor = oZelle2.cellBackColor
           exit sub
         end if
   next
   oZelle.cellBackColor = -1
   msgbox "Das Kürzel wurde nicht gefunden"   
End Sub
Fertig :-)

Gruss
Thomas

Nach oben