von Toxitom » Di, 01.11.2005 16:16
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
Hey Virob,
[quote]Habe ich Dir die Sachlage verständlich erklärt?? [/quote]
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]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
[/code]
Hiermit hast du nun die Zell-Adressen(Indices) und kannst weiterarbeiten. Die Funktion, die benötigt wird, heisst "Textsplitten()"
[code]
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 [/code]
So, das war es. So sollte es gehen.
Gruss
Thomas