Seite 1 von 1
Schleife in Makros einbauen
Verfasst: Di, 01.11.2005 12:01
von Virob
Guten Tag
Ich möchte in einer Tabelle (SpalteA) den Text (Werkzeug, Hersteller, Modell, Grösse etc.), der durch Komma getrennt ist (a la Excel) in andere Spalten verschieben.
Da ich von Programmieren Null Ahnung habe habe ich in den Treads gesucht und bin mit untem folgenden Makro fündig geworden.
Das Makro funktioniert (Text mittels Komma in andere Spalten aufteilen) -> ist aus einem Tread kopiert -> wie muss ich nun die Schleife machen, respektive wie sieht die Schleife aus, damit ich die ganze Tabelle und nicht nur eine Zeile abarbeiten kann??
Beim markieren mehrerer Zeilen erscheint ein "Laufzeitfehler" -> was immer das auch heissen mag javascript:emoticon(':(')
Sad
Sad
Könnte mir jemand behilflich sein??
---
Sub Main
trz="," ' Trennzeichen definieren
oDoc=thisComponent
' Werte einlesen
'aktive Zelle erhalten
oCelle=oDoc.getCurrentSelection()
'Inhalt der aktiven Zelle
inhalt=oCelle.getstring
'werte auf Array aufteilen am Trenner
atext=split(inhalt, trz)
'Position der aktiven Zelle erhalten
oZellPos=oCelle.getCellAddress()
'indexe der Reihe, Spalte und der Tabelle
reihe=oZellPos.row
spalte=oZellPos.column
tabelle=oZellPos.sheet
' Werte ausgeben
' aktives Tabellenblatt erhalten
oSheet=oDoc.sheets(tabelle)
'Schleife über alle Array-Inhalte
'Inhalte in Zellen aktive Zelle und rechts daneben
'schreiben. Die Funktion trim() entfernt dabei
'Leerzeichen vor und hinter den jeweiligen Texteinträgen
for i=lBound(atext()) to ubound(atext())
oSheet.getCellByPosition(spalte+i,reihe).string=trim(atext(i))
next
End Sub
---
Danke schon im voraus für Eure Bemühungen
Verfasst: Di, 01.11.2005 13:33
von Toxitom
Hallo Virob,
(so trifft man sich wieder

)
Bevor wir an das Makro gehen, zunächst ein paar andere Fragen:
Wo kommen denn die Daten her? Wenn du schreibst, dass in Spalte A die Daten (zeilenweise?) drinstehen, mit Kommas seperiert, a la Excel?
Wenn du diese Daten nämlich via Import aus einer Datei selbst einlädst, dann könntest du diese doch direkt beim Import trennen lassen. Wenn du eine Textdatei (*.txt) liest, so benenne diese vorher um -> in *.csv. Jetzt öffnet sich ein Importdialog und du kannst eine Trennung in verschiedene Spalten vornehmen.
2. Frage: Wie viele Daten stehen in Spalte A? Und welche willst du konvertieren? Alle? Nur die markierten?
Gib mir hierüber noch Auskunft, dann stellen wir das Makro zusammen. Ach ja, wie willst du das Makro starten? durch einen Button im Dokument?
Bis denn
Thomas
Schleife in Makro einbauen
Verfasst: Di, 01.11.2005 14:58
von Virob
Hallo Thomas,
... ja so schnell geht das - besten Dank
Wir haben teilweise Daten (von Lieferanten etc.) die sind wirr geordnet - mal mit Komma getrennt, mal mit Semikolon etc.
Mal in Spalte A, mal in B -> je nachdem wer diese Daten (Lieferantenseits) in einer Tabelle aufgenommen hat.
Mit importieren *.csv klappt es in der Regel -> aber beim kurchkämmen der Daten wäre ich schon froh, wenn ich dies in der "offenen Lösung" machen könnte. Zellen markieren und Makro die Arbeit übernehmen lassen.
Ganz komfortabel wäre es mit einem Button -> aber daran wage ich ja nicht zu denken.
Je nach Datenmenge -(Import) kann dies schon mal 1'000 Artikel sein, die
durchforstet werden müssen -> und da wäre für mich ein solches Makro schon hilfreich.
Habe ich Dir die Sachlage verständlich erklärt??
Danke für Deine Bemühungen
Verfasst: Di, 01.11.2005 16:16
von Toxitom
Hey Virob,
Habe ich Dir die Sachlage verständlich erklärt??
Ja, hast du. Also, fangen wir mal an.
Die erste Problematik ist, zu erkennen, was gerade markiert ist. Ich gehe mal von zwei Möglichkeiten aus:
1. eine einzelne Zelle -> dann wird nur dieser Text umgewandelt.
2. ein (zusammenhängender) Zellbereich -> jetzt werden alle Texte der ersten Spalte umgewandelt.
Den Umwandlungsprozess hast du ja schon gehabt, den hab ich soweit übernommen. Der Übersicht bleibt dies eine eigenständige Prozedur. Du startest das Makro "Selection", dann sollte es funktionieren:
Code: Alles auswählen
sub selektion
oDoc = StarDesktop.getCurrentComponent()
if not oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
msgbox "Dies ist keine Calc-Anwendung", 16, "Fehler"
exit sub
end if
oZell = oDoc.getCurrentSelection()
if oZell.supportsService("com.sun.star.sheet.SheetCellRanges") then
msgbox "Sorry, Mehrfachselektionen werden nicht unterstützt!", 48, "Makro kann nicht gestartet werden"
exit sub
elseif oZell.supportsService("com.sun.star.sheet.SheetCell") then
REM Cursor befindet sich in einer Zelle oder eine Zelle ist gewählt
REM Jetzt Wahl des umgebenden Zellbereiches
oZellAdr = oZell.CellAddress
iSheet = oDoc.sheets(oZellAdr.Sheet)
iColumn = oZellAdr.column 'Index der Spalte
iRow = oZellAdr.row 'Index der Zeile
Textsplitten(oZellAdr.Sheet, iColumn, iRow)
elseif oZell.supportsService("com.sun.star.sheet.SheetCellRange") then
REM ein Bereich wurde markiert
iSheet = oZell.rangeAddress.Sheet
iStartSp = oZell.rangeAddress.startColumn
iStartZe = oZell.rangeAddress.startRow
iEndSp = oZell.rangeAddress.EndColumn
iEndZe = oZell.rangeAddress.EndRow
Textsplitten(iSheet, iStartSp, iStartZe, iEndSp, iEndZe)
else
msgbox "kann Arbeitsbereich nicht erkennen", 16, "Fehler"
exit sub
end if
end sub
Hiermit hast du nun die Zell-Adressen(Indices) und kannst weiterarbeiten. Die Funktion, die benötigt wird, heisst "Textsplitten()"
Code: Alles auswählen
Sub TextSplitten(iSheet as integer, _
iStartColumn as integer, _
iStartRow as long, _
optional iEndColumn as integer, _
optional iEndRow as long)
If ismissing(iEndColumn) then iEndColumn = iStartColumn
if isMissing(iEndRow) then iEndRow = iStartRow
trz="," ' Trennzeichen definieren
oDoc=thisComponent
oSheet = oDoc.sheets(iSheet)
For i = iStartRow to iEndRow
oCelle = oSheet.getCellByPosition(iStartColumn, i)
'Inhalt der aktiven Zelle
inhalt=oCelle.getstring
'werte auf Array aufteilen am Trenner
atext=split(inhalt, trz)
'Schleife über alle Array-Inhalte
'Inhalte in Zellen aktive Zelle und rechts daneben
'schreiben. Die Funktion trim() entfernt dabei
'Leerzeichen vor und hinter den jeweiligen Texteinträgen
for n=lBound(atext()) to ubound(atext())
oSheet.getCellByPosition(iStartColumn+n,i).string=trim(atext(n))
next
next
End Sub
So, das war es. So sollte es gehen.
Gruss
Thomas
Verfasst: Di, 01.11.2005 16:44
von Virob
Hallo Thomas,
.... wow - das ging aber schnell - ich hoffe ich kann das heute noch ausprobieren und werde morgen eine Rückmeldung machen können
Auf jeden Fall bis anhin ganz grossen Dank
Schleife einbauen
Verfasst: Mi, 02.11.2005 10:02
von Virob
Hallo Thomas,
.... was soll ich da sagen? - perfekt - genau wie ich mir das gewünscht habe.
Einfach Super.
Habe noch eine Verknüpfung in der Symbolleiste erstellt und kann nun - danke Deiner Hilfe - perfekt damit arbeiten.
Wenn allenfalls vor er Ausführung des Makros noch ein Hinweis erscheinen würde: " Achtung es werden nachfolgende Zellen überschrieben", dann wäre jeder Benutzer gewarnt - aber das muss nicht sein.
Aber auch so - das Makro sollte ins Programm implementiert werden.
Ich möchte mich bei Dir in aller Form bedanken.
P.S Spendenkonto -> kannst Du mir eine Verbindung angeben?
Verfasst: Mi, 02.11.2005 13:56
von Toxitom
Hey Virob,
P.S Spendenkonto -> kannst Du mir eine Verbindung angeben?
Meinst du mein Konto???
Na ja, ok, ich verstehe schon. Geh einfach auf die Seite des Vereins -> und dort auf Spenden (
http://www.ooodev.org/index.php?ziel=s22&rm=r00 ), da sind alle Angaben zu finden.
Freut mich, dass das Makro gefällt. Den Rest kannst du einfach selbst einbauen.
Viele Grüße
Thomas