Text aus Zelle weiterverarbeiten

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

Moderator: Moderatoren

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

Text aus Zelle weiterverarbeiten

Beitrag von turtle47 »

Hallo Spezialisten

brauche mal wieder Eure Hilfe.

Ich arbeite gerade an unserer MA-Planung um diese für die Anwender
noch flexibler zu gestalten.

Bisher sind die Kürzel, z.B. "U" "K" etc . von uns fest vorgegeben.
Jetzt bin ich gerade dabei die Tabelle so zu modifizeren, dass der
User die Kürzel selbst definieren kann. Soweit kein Problem.

Die ausgefüllte Zellen können mit diesem Makro farbig gemacht werden:

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)
    Select Case oCell.String
      Case ""
      oCell.CellBackColor = -1
      Case "U" 
      oCell.CellBackColor = RGB(35, 184, 220)
      Case "K" 
      oCell.CellBackColor = RGB(255, 255, 153)
      Case "F" 
      oCell.CellBackColor = RGB(125, 166, 71)
      Case "W" 
        oCell.CellBackColor = RGB(255, 153, 102)
      Case "S"
        oCell.CellBackColor = RGB(153, 102, 204)
      Case "B"
        oCell.CellBackColor = RGB(255, 255, 0)
      
    End Select
  next
next
End Sub
Funktioniert auch super.
Wenn der Anwender jetzt aber andere Kürzel vorgibt dann passt das Makro nicht mehr.

Die Kürzel müssten zunächst ausgelesen und dann weiterverarbeitet werden.

Zum Auslesen von Zellen habe ich folgenden Codes gefunden:
>über Position

Code: Alles auswählen

myDoc = thisComponent
mySheet = myDoc.sheets(2)
mycell = mysheet.getCellByPosition(6,8)
myString=mycell.string
>über Name:

Code: Alles auswählen

  oDoc = thiscomponent
  oSheet=oDoc.sheets(0)
  ocell =osheet.getCellRangeByName("Name")
Wie bekomme ich das Grundmakro so angepasst das die Kürzel ausgelesen werden
und einem Farbcode zugewiesen werden?

Im voraus vielen Dank für Eure Hilfe.

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

Beitrag von Toxitom »

Hey Jürgen,

ich verstehe deine Problematik nicht. Auch in deinem bisherigen Code wurde das Kürzel innerhalb der Zelle ausgelesen und dann entsprechend ausgewertet:

Code: Alles auswählen

...Select Case oCell.String ...
Wenn du jetzt also andere Kürzel verwenden möchtest, so erweitere doch einfach die Case-Struktur.

Oder was soll passieren, wenn der Benutzer z.B. "T" eingibt?

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Sorry Thomas,

vielleicht habe ich mich zu ungenau ausgedrückt.:oops:
Der User soll in einer extra Tabelle seine Kürzel, z.B. "T" selber definieren können.
Wenn du jetzt also andere Kürzel verwenden möchtest, so erweitere doch einfach die Case-Struktur.
Ich weiss ja nicht welche Kürzel der User verwenden möchte.

Diese selbst definierten Kürzel sollen dann ausgelesen werden und dann in dem Farbmakro eingebunden werden.

In etwa so:

Code: Alles auswählen

myDoc = thisComponent
mySheet = myDoc.sheets(2)
Platzhalter=mycell = mysheet.getCellByPosition(6,8)
oCell.CellBackColor = RGB(35, 184, 220)
      Case "Platzhalter" 
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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Jürgen,
Der User soll in einer extra Tabelle seine Kürzel, z.B. "T" selber definieren können.
Ah, ok. und wie ordnest du dann die Farben zu? in einer seperaten Spalte?
Wieviel Kürzel werden maximal zugelassen? Gibt es Kürzel, die unabänderbar sind?

Wahrscheinlich wäre es das einfachste, die Kürzel in einer Spalte zu organisieren (z.B. Tabelle2 - Spalte A) und direkt daneben die Farbwerte als RGB oder so.
Dann könntest du die Kürzel und die Farbwerte in einen Array einlesen und statt der Case-Bedingung den Array durchsuchen, um die passende Farbe zuzuweisen.

Also, bitte nioch ein paar mehr Informationen :-)

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hallo Thomas,

jetzt wird es kniffelig aber auch interessant.

Am besten Du ladest Dir die derzeitige Version zur Ansicht mal
hier http://www.office-center-epj.info/zaehl ... -2007-V4-0 runter.

Die Version an der ich jetzt arbeite hat aber noch mehr Eingabemöglichkeiten und
zusätzlich ein drittes Tabellenblatt für die Optionen. Dort soll dann auch die
Kürzelzuweisung erfolgen. In der Tabelle Planung ist auf der rechten
Seite eine Monatsauswertung zu sehen.
Die ist ja auch farblich. Die sollte (müsste) dann ja auch farblich verändert werden.
Kann man Zellvorlagen in einem Makro zuweisen?
Ah, ok. und wie ordnest du dann die Farben zu?
Die Farben sind derzeit in dem Makro schon vorgegeben entsprechend der
Farben in der Auswerttabelle rechts.

Wenn es aber möglich sein sollte die Farben selber zu bestimmen um so besser. :lol:
Wieviel Kürzel werden maximal zugelassen?
Derzeit sind es in der neuen Tabelle 9 Kürzel, können aber auch 10 daraus machen.
Als Kürzel sollte aber auch z:B. WE1 möglich sein.
Gibt es Kürzel, die unabänderbar sind?
Ja, nach meinem dafürhalten das "U" für Urlaub.
Die Farbe dafür sollte fest sein wegen der Darstellung im Tabellenblatt "Übersicht".

In dem Tabellenblatt Optionen, welches erst jetzt in meiner Version vorhanden ist, habe
ich die Kürzel in einer Zeile stehen "G11:O11".

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

Beitrag von Toxitom »

Hallo Jürgen,

also, ein Vorschlag: Die Frarben und die Kürzel können frei definiert werden. In den Optionen lässt du die Kürzel in eine Zeile schreiben und die jeweiligen Zellen dann farblich verändern (Hintergrundfarbe- individuell).

Das folgende Codefragment zeigt dir dann eine entsprechende Lösung:

Code: Alles auswählen

Sub ZelleFaerben
	oSheet = thisComponent.sheets(0)
	oZelle = oSheet.getCellRangeByName("B2")
	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
In Zelle B2 steht das Kürzel in der Tabelle. Diese Zelle wirst du später durch eine Schleifenbedingung ändern :-)
Die zur Auswahl stehenden Kürzel stehen in den Zellen E2 bis J2, wobei bei Übereinstimmung die Hintergrundfarbe der jeweiligen Zelle übernommen wird.

Das ist der flexibelste Weg :-)

Und natürlich kannst du Zellen per Makro auch Formatvorlagen zuweisen, ganz einfach:

Code: Alles auswählen

oZelle.cellStyle = "ROT"
weist der Zelle die Zellvorlage "ROT" zu, die muss natürlich existieren :-)

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Danke Thomas,

das funktioniert ja schon mal bestens. :lol:

Jetzt muss ich als erstes bewerkstelligen das wie in dem Ursprungsmakro

Code: Alles auswählen

oSelect=ThisComponent.CurrentSelection
oRow=oSelect.Rows
oColumn=oselect.Columns
For m = 0 To oRow.getCount-1
For n= 0 To oColumn.getCount-1 
ein Zellbereich eingefärbt wird.

Hab leider noch keine Idee wie ich das einbaue werde mich aber mal rannmachen.

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

Beitrag von Toxitom »

Hallo Jürgen,
Am besten Du ladest Dir die derzeitige Version zur Ansicht mal
hier http://www.office-center-epj.info/zaehl...-2007-V4-0 runter.
Nette Seite :-)
Da sollten wir mal gemeinsam etwas mehr machen...

Also, unabhängig von deinen aktuellen "Schleifenbemühungen", deinem Makro würde noch ein "Unterdrücken des Flackerns" gut tun. Das tritt bei Calc immer dann auf, wenn du viele Zellen einzeln bearbeitest...
Das Unterdrücken ist ganz einfach zu bewerkstelligen: Verhindere, dass der Controller jeden Schritt aktiv aktualisiert. Dazu sperrst du am Anfang die Controller, und am Ende hebst du die Sperre wieder auf. So belibt der Bildschirm ruhig:

Code: Alles auswählen

sub meinMakro
  thisComponent.lockControllers()
  ' hier folgt jetzt dein Makrocode
  ' und weiter'
  thisComponent.unlockControllers()  'Controller wieder entsperren
end sub
Hast du allerdings viel zu bearbeiten, so wäre es sinvoll, einen Statusbar oder einen andere Form der Rückmeldung einzublenden, damit der Benutzer weiss, es passiert noch etwas ;-)

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

Hey Thomas,
Nette Seite
freut uns, dass Dir die Seite gefällt. :lol:
Anderen wahrscheinlich auch, was unsere Zufriffs- und Downloadzahlen bestätigen.

Initiator dieser Seite ist mein Freund Ernst-Peter den ich so weit es geht unterstütze.
Wir haben letztes Jahr an dem Vorlagenwettbewerb teilgenommen und ein
Buch von Dir gewonnen. Wir dachten deshalb, dass Du die Seite kennst.
Da sollten wir mal gemeinsam etwas mehr machen...
Gerne. Dann schieß mal los, aber am besten über PN.

Wir hatten damals schon einmal eine Anfrage über Florian
an Euch gestellt, was sich aber aus technischen Gründen leider
nicht realisieren ließ.
Also, unabhängig von deinen aktuellen "Schleifenbemühungen", deinem Makro würde noch ein "Unterdrücken des Flackerns" gut tun.
Das ist ein guter Tip denn das Flackern hat mich auch schon immer gestört.
Hast du allerdings viel zu bearbeiten, so wäre es sinvoll, einen Statusbar oder einen andere Form der Rückmeldung einzublenden, damit der Benutzer weiss, es passiert noch etwas
Die Meldung hatte ich früher auch mal drinn, habe die dann wieder rausgenommen.
Warum weis ich nicht mehr. Baue sie jetzt dann wieder ein. Danke für den Hinweis. :lol:

Nun zu meinem aktuellen Problem von gestern. Währe nett, wenn Du mir
da noch weiter auf die Sprünge helfen würdest. Komme da ehrlichgesagt nicht weiter.:oops:
Ich weiss, Du schreibst in der Regel nur Teilcodes aber in diesem Fall ist es
ja für die OOo-Gemeinde.

Freue mich auf Deine Anwort , auch von anderen natürlich.

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

Beitrag von Toxitom »

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Beitrag von turtle47 »

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

Beitrag von turtle47 »

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

Beitrag von turtle47 »

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
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
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

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

Beitrag von turtle47 »

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
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