Buchstaben in markierte Zellen einfügen

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

Moderator: Moderatoren

bmh1980
*
Beiträge: 13
Registriert: Mo, 23.08.2004 23:11

Buchstaben in markierte Zellen einfügen

Beitrag von bmh1980 »

Hallo.

Vorab sollte ich wohl bemerken, dass ich absolut keine Ahnung von Basic, geschweigedenn StarBasic habe.

Die Makros, die ich erstellt habe, habe ich mit der Funktion "Makro aufzeichnen" erstellt.

Bisher hat das für meine Vorhaben gelangt.

Leider habe ich jetzt das Problem, dass ich über einen Makro einen Buchstaben in einen markierten Zellenbereich einfügen möchte. Dummerweise wird der Buchstabe nur in der zuletzt markierten Zelle eingefügt.

Hier mal der Basic-Code (Ausschnitt):

Code: Alles auswählen

rem ---------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "StringName"
args3(0).Value = "A"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args3())
Davor ist nur noch Code um die Zelle und die Schrift einzufärben.

Könntet ihr mir sagen, wie ich den Code abändern muss, damit der Buchstabe in alle markierten Zellen eingefügt wird?

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

Beitrag von Stephan »

Das Folgende funktioniert für einen (geschlossenen) Bereich:

Code: Alles auswählen

Sub string_in_zellenbereich
auswahl = ThisComponent.CurrentSelection
For x = 0 To auswahl.Columns.getCount-1
	For y = 0 To auswahl.Rows.getCount-1
		auswahl.getCellByPosition(x, y).string = "A"
	Next y
Next x
End Sub

Gruß
Stephan
bmh1980
*
Beiträge: 13
Registriert: Mo, 23.08.2004 23:11

Beitrag von bmh1980 »

Danke. Funktioniert super.

Damit ich auch weiß, was ist da schreibe, wäre es nett, wenn du mir das nochmal erklären könntest.

Code: Alles auswählen

Sub string_in_zellenbereich
Ist klar. Der Name des (oder der?) sub.

Code: Alles auswählen

auswahl = ThisComponent.CurrentSelection
auswahl ist hier wohl eine Variabel. CurrentSelection sagt mir ja schon der Name. Nämlich der gerade markierte Bereich. Was ist aber ThisComponent? In den aufgezeichneten Makros taucht das auch immer wieder auf.

Code: Alles auswählen

For x = 0 To auswahl.Columns.getCount-1
	For y = 0 To auswahl.Rows.getCount-1
Werden hier die markierten Zellen gezählt? Wegen dem Count. Ansonsten verstehe ich den Teil überhaupt nicht.

Code: Alles auswählen

		auswahl.getCellByPosition(x, y).string = "A"
Hier wird dann wohl das A in die Zellen eingefügt.

Code: Alles auswählen

	Next y
Next x
Ist das eine Art Shiftfunktion wie shift in der Bash unter Linux? Sprich: Wenn Zelle 1 bearbeitet wurde, mach mit Zelle 2 weiter. Oder?

Code: Alles auswählen

End Sub
Auch klar. Das Ende von string_in_zellenbereich.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

CurrentSelection sagt mir ja schon der Name. Nämlich der gerade markierte Bereich.
Nein, die gegenwärtige Markierung.
Das können Zellen ODER Zellbereiche sein und die müssen nicht zusammenhängend sein. Das Makro was ich gepostet habe funktioniert nur für EINEN GESCHLOSSENEN (zusammenhängenden) Zellbereich, sonst müßte man eine Prüfung einbauen. Ist nur eine Zelle markiert, ist das sowohl eine Zelle als auch ein Zellbereich (Sonderfall) aber allgemein mußt Du zwischen Zellen und Zellbereichen unterscheiden. (Ganz strenggenommen handelt es sich wirklich nur um die gegenwärtige Auswahl, das kann dann auch eine Grafik oder ein Teil des Zelleninhalts usw. sein.)
Was ist aber ThisComponent?
Das ist im Prinzip 'das Dokument welches gerade den Fokus besitzt', hier das spezielle Tabellenblatt der Datei. Da tatsächlich ein Zellbereich markiert ist ist das auch eindeutig, wäre keiner markiert könntest Du mit z.B. ThisComponent.Sheets(0).GetCellByPosition(0,0) auf die Zelle A1 des ersten Tabellenblattes der aktuellen Datei zugreifen auch wenn diese Zelle nicht markiert wäre (geht auch mit Namen der Tabelle und Zelle und Zellbereichen).
Werden hier die markierten Zellen gezählt? Wegen dem Count.
Ja, hier werden getrennt die Werte für die Anzahl der Zeilen und Spalten des markierten Bereichs gezählt. Das geht so nur weil ich vorraussetzte das die Markierung tatsächlich ein Bereich ist (s.o.).
Hier wird dann wohl das A in die Zellen eingefügt.
Ja, geht so aber nur weil "A" ein String ist, für Zahl hieße das .Value = für Formel .Formula =
Ist das eine Art Shiftfunktion wie shift in der Bash unter Linux?
Ich weiß über Bash/Kommandozeile unter Linux zu wenig, ich vermute aber nein. Das Ganze ist eine Verschachtelung von For-Next-Schleifen bzw.
Sprich: Wenn Zelle 1 bearbeitet wurde, mach mit Zelle 2 weiter. Oder?
in diesem Sinne irgendwie schon.

Beispiel, wenn die Zellen A1,A2,B1,B2 als Bereich markiert sind:

Code: Alles auswählen

(1)For x = 0 To auswahl.Columns.getCount-1 
(2)  For y = 0 To auswahl.Rows.getCount-1 
(3)      auswahl.getCellByPosition(x, y).string = "A" 
(4)  Next y 
(5)Next x 
so wird das abgearbeitet:
-(1) --> x=0 (Obergrenze(*) noch nicht überschritten), deshalb
-(2) --> y=0 (Obergrenze noch nicht überschritten), deshalb
-(3) --> in Zelle mit Koordinaten (0,0) "A" eintragen (Koordinaten beziehen sich hier auf den markierten Bereich und nicht auf die gesamte Tabelle)
-(4) --> y=1
-(2) --> Obergrenze noch nicht überschritten, deshalb
-(3) --> in Zelle mit Koordinaten (0,1) "A" eintragen
-(4) --> y=2
-(2) --> Obergrenze überschritten, deshalb diese Schleife verlassen
-(5) --> x=1
-(1) --> Obergrenze noch nicht überschritten, deshalb
-(2) --> y=0
-(3) --> in Zelle mit Koordinaten (1,0) "A" eintragen
-(4) --> y=1
-(2) --> Obergrenze noch nicht überschritten, deshalb
-(3) --> in Zelle mit Koordinaten (1,1) "A" eintragen
-(4) --> y=2
-(2) --> Obergrenze überschritten, deshalb diese Schleife verlassen
-(5) --> x=2
-(1) --> Obergrenze überschritten, deshalb diese Schleife verlassen


(*)Obergrenze ist Anzahl der Zeilen minus 1 bzw. Spalten minus 1


Gruß
Stephan
bmh1980
*
Beiträge: 13
Registriert: Mo, 23.08.2004 23:11

Beitrag von bmh1980 »

Sorry für die späte Antwort. Hatte die letzte Zeit tierisch Stress.

Eigentlich wollte ich mich nur für die Erklärung bedanken. Die Bezeichnungen, die OOo verwenden sind mit zwar teilweise etwas unverständlich, aber so oft habe ich mit StarBasic ja nicht zu tun.

Ich habe mir zwei PDF-Dateien, die jeweils über 300 Seiten umfassen runtergeladen, in denen es über StarBasic geht.

Sicherlich werde ich damit weiter kommen, wenn ich das nächste Mal mit StarBasic arbeiten muss.

Gruß

Marcus
Fahrradfahrer
Beiträge: 1
Registriert: Fr, 22.10.2004 14:54
Wohnort: Braunschweig

Beitrag von Fahrradfahrer »

[quote="Stephan"]Das Folgende funktioniert für einen (geschlossenen) Bereich:

[code]Sub string_in_zellenbereich
auswahl = ThisComponent.CurrentSelection
For x = 0 To auswahl.Columns.getCount-1
For y = 0 To auswahl.Rows.getCount-1
auswahl.getCellByPosition(x, y).string = "A"
Next y
Next x
End Sub[/code]


Gruß
Stephan[/quote]

Hallo Stephan,

wo hattest Du das denn her? Ich habe ein ähnliches Problem
und hatte versucht, das über die Dokumentation zu lösen.
In dem Starbasichandbuch (817-3924g.pdf) findet man nicht
einmal den Begriff "ThisComponent"!

Grüsse
Gunther
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Gunther,
wo hattest Du das denn her? Ich habe ein ähnliches Problem
und hatte versucht, das über die Dokumentation zu lösen.
Ich verwende im Wesentlichen das Material das ich hier im Forum umter "Informationen zur Starbasic-Programmierung" (erster Post hier im Forum) hinterlegt habe.
Ansonsten enthält der Code wirklich nichts Besonderes. Du kannst im Grundsatz für 'ThisComponent' auch 'Stardesktop.CurrenComponent' verwenden wenn Dir das lieber ist. (Zu den Unterschieden beider Ausdrücke gibt es hier im Forum einen post vom "Toxitom" , suche nach "ThisComponent")
In dem Starbasichandbuch (817-3924g.pdf) findet man nicht
einmal den Begriff "ThisComponent"!
Ich stelle erstaunt fest das es so ist, aber 'ThisComponent' ist wirklich einer der Standardausdrücke zur Starbasic-Programmierung den Du fast überall findest wo es um diese Programmierung geht.


Gruß
Stephan
Antworten