Text über mehrere Spalten einfügen

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 über mehrere Spalten einfügen

Re: Text über mehrere Spalten einfügen

von Karolus » Di, 17.03.2009 09:23

Hallo
Den Code könntest du schon im Dokument (genauer in einem Basic-modul des Dokuments) speichern - bringt aber nichts da die Tastenkombi mindestens allgemein für Calc gilt und dann meckert wenn das Dok geschlossen ist.

Also wenns denn so sein muss, ruf mit der Tastenkombi eine kleines "Entscheidungsmakro" auf:

Code: Alles auswählen

sub split_and_paste_or_paste_only
if thiscomponent.url = converttourl("pfad\zu\deinem\spezziellen\dok.sxc") then
 clipboard_split_and_paste
else
 paste_dispatcher
end if
end sub
Gruß Karo

Re: Text über mehrere Spalten einfügen

von AndreasB. » Di, 17.03.2009 08:42

Hallo Karo,

funktioniert alles wunderbar.
Eine Frage hätte ich noch: Ist es möglich, dieses Makro nur in einer Calc-Tabelle
zu verwenden? Also das Makro und auch die Tastenzuweisung.

Vielleicht geht das ja sogar, dass das Makro und die Tastenzuweisung in der
Calc-Tabelle gespeichert wird.

Gruß
Andreas

Re: Text über mehrere Spalten einfügen

von Karolus » Mo, 16.03.2009 14:26

Hallo
setze in der 3.letzten Zeile (in die Zeile oberhalb von: ErrorHandler:)
Exit sub
Entschuldige hab ich vergessen.

Re: Text über mehrere Spalten einfügen

von AndreasB. » Mo, 16.03.2009 13:58

Hallo Karo,

das Einfügen funktioniert jetzt, aber wenn ein Text zum Splitten mit dabei ist,
wir der ganze Text in die erste Spalte eingefügt und zusätzlich auf die anderen
Spalten aufgeteilt.

Da muss irgendwo noch ein kleiner Fehler sein.

Gruß
Andreas

Re: Text über mehrere Spalten einfügen

von Karolus » Mo, 16.03.2009 13:48

Hallo
Mir ist noch was brauchbares eingefallen,-- bei einem Fehler wird schlicht aufgezeichneter Code der Aktion: "Einfügen" ausgeführt. Ich fasse hier nochmal alles zusammen:

Code: Alles auswählen

sub clipboard_split_and_paste
'15.3.2009 http://de.openoffice.info/viewtopic.php?f=2&t=23238
'Makro zum Einfügen aus der Zwischenablage
'in mehrere Spalten
'unter Benutzung der Function 'GetClipboard → siehe dort

dim osheet as object
dim nlines% , maxs% , startsp% , startze% , endsp% , endze%

tr = ";" 'Spaltentrenner

'die Zwischenablage...
alines() = split( getclipboard,chr(10))'..in Zeilen splitten.
'unter Windows geht auch: ...,chr(13)) ?

On Error goto ErrorHandler
nlines = ubound(alines())'Anzahl der Zeilen Null-basiert
dim iline(nlines)

for iz = 0 to nlines
   'Zeilenweise in Array splitten..
   iline(iz) = split( alines(iz) , tr )
   '...und maximal benötigte Spaltenanzahl ermittteln
   if maxs < ubound( iline(iz) ) then
      maxs = ubound( iline(iz) )
   endif
next iz
for iz = 0 to nlines
	atmpline = iline(iz)
	redim preserve atmpline(maxs)
	for io = ubound(iline(iz))+1 to maxs
		atmpline(io) = ""
	next io
	iline(iz) = atmpline()
next iz

'Startzelle zum Einfügen ist die  aktuell selektierte Zelle
with thiscomponent.currentselection().rangeaddress
   osheet = thisComponent.sheets(.sheet)
   startsp = .startcolumn
   startze = .startrow
end with

endsp = startsp + maxs
endze = startze + nlines

'Zielbereich festlegen
ozielbereich = osheet.getcellrangebyposition( startsp , startze , endsp , endze )

'setformulaarray statt setdataarray überschreibt nicht die Formatierungen.
ozielbereich.setdataarray(iline())
ochange = ozielbereich.createReplaceDescriptor()
	ochange.searchString = "^[0-9]"
	ochange.ReplaceString = "&" 
	ochange.SearchRegularExpression = true
	ozielbereich.replaceall(ochange)
	
	ochange.searchString = ",[0-9]+$"
	ochange.ReplaceString = "&€" 
	ochange.SearchRegularExpression = true
	ozielbereich.replaceall(ochange)
Exit sub
ErrorHandler:
paste_dispatcher

end sub

'entnommen aus "Makros für OOo" http://www.galileocomputing.de/1938?GPP=ooo
function GetClipboard
   On Error goto ErrorHandler
   Dim ClipBoardHandle as Object, DataObj as object
   Dim DataTypSeq() as object, sClipBoardString as String
   
   ClipBoardHandle = createUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
   DataObj = createUnoService("com.sun.star.datatransfer.XTransferable")
   DataObj = ClipBoardHandle.getContents()
   DataTypSeq = DataObj.getTransferDataFlavors()
   sClipBoardString = DataObj.getTransferData(DataTypSeq(0))
   getClipboard = sClipBoardString
   Exit function
   REM Wenn die Zwischenablage Bilder oder Objekte enthält
   REM oder leer ist:
   ErrorHandler:
   GetClipboard = ""
end function

sub paste_dispatcher
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
end sub
Korrektur eingefügt: "Exit Sub"

Gruß Karo

Re: Text über mehrere Spalten einfügen

von AndreasB. » Mo, 16.03.2009 12:58

Hallo Karo,

kein Problem.
Das was du mir gemacht hast, ist schon super.
Wenn dir doch noch was einfällt, einfach melden.

Danke noch mal.

Gruß
Andreas

Re: Text über mehrere Spalten einfügen

von Karolus » Mo, 16.03.2009 12:45

Hallo
Tut mir leid bei der Fragestellung kann ich dir nicht weiterhelfen, der OOo-interne Zwischenspeicher kann so nicht übertragen werden.
Freunde dich mit zwei verschiedenen Tastenkombis an, und/oder frag nochmal im Basic-forum an wie man interne - und Betriebssystemzwischenablage unterscheiden kann.

Gruß Karo

Re: Text über mehrere Spalten einfügen

von AndreasB. » Mo, 16.03.2009 11:40

Hallo Karo,

sorry, habe die Code-Erweiterung ganz übersehen.

Wenn ich das gemacht habe, dann wird auch die Zahl wieder eingefügt.
Aber die Aufteilung funktioniert nicht mehr richtig. Es wird zwar noch
über die Spalten verteilt, aber in der ersten Spalte steht alles mit dabei.

... ich glaube ich weis, wie du es nachvollziehen kannst.

Kopiere mal irgend eine Zelle vom Calc-Dokument und füge es dann mit
dem Makro ein. Dann kommt die Fehlermeldung.

Wenn ich es von einer externen Datei einfüge, dann kommt die Meldung
nicht und das einfügen geht auch. Es hat also gar nichts damit zu tun,
ob es Zahlen sind, oder ein Text.

Gruß
Andreas

Re: Text über mehrere Spalten einfügen

von AndreasB. » Mo, 16.03.2009 11:27

Hallo Karo,

also bei folgenden Zahlen tritt es auf:
123
12345

Also eigentlich bei allen.
Es sind nur diese Zahlen, ohne ein ;

Einfach 12345 in die Zwischenablage und dann einfügen.

Ich mache derzeit eigentlich alles mit der STRG-V beim einfügen.
Das geht sehr schnell. Und wenn ich mich hier einen anderen Buchstaben verwende,
dann muss ich mich schon wieder verkopfen, wo ich es so mache, und wo nicht.

Oder geht eine Abfrage mit rein, dass wenn kein ; vorkommt, dass dann ganz normal
eingefügt wird, ohne dass der ganze Code durchlaufen wird?

Gruß
Andreas

Re: Text über mehrere Spalten einfügen

von Karolus » Mo, 16.03.2009 11:05

Hallo
Ich kann den Fehler nicht nachvollziehen, tritt der nur bei einzelnen (auch mehrstelligen) Zahlen, oder auch bei Text ohne ; auf ?
Ansonsten würde ich dir empfehlen diese Sub nicht auf Strg+V zu legen, weil Strg ziemlich nah bei der shift-Taste liegt!
___
Füg mal vor der angemeckerten Zeile ein:
On Error goto ErrorHandler

und oberhalb von 'End Sub' die beiden Zeilen:
ErrorHandler:
thiscomponent.currentselection().formulalocal = getclipboard

Gruß Karo

Re: Text über mehrere Spalten einfügen

von AndreasB. » Mo, 16.03.2009 08:45

Hallo Karo,

ich möchte diesen Import eigentlich jetzt auf STRG-V legen und diesen immer verwenden.
Wenn ich nur eine Zahl (1234) einfüge, kommt folgende Fehlermeldung:

Unzulässiger Wert oder Datentyp. Index außerhalb des definierten Bereichs.

Folgende Zeile wird markiert:
nlines = ubound(alines())'Anzahl der Zeilen Null-basiert

Kann man das ändern, so dass alle Zeichen funktionieren?

Gruß
Andreas

Re: Text über mehrere Spalten einfügen

von Karolus » So, 15.03.2009 19:36

Hallo
Ich hab grad noch einen Fehler in der 4.letzten Zeile oben ausgebessert, in den Searchstring gehört ein + zeichen statt des ?zeichens:
ochange.searchString = ",[0-9]+$"

Gruß Karo

Re: Text über mehrere Spalten einfügen

von AndreasB. » So, 15.03.2009 19:28

Hallo Karo,

super, jetzt funktionert es so, wie es sein soll.
Ich teste es jetzt mal die nächsten Tage, aber das muss so passen.

Vielen, vielen Dank.

Gruß
Andreas

Re: Text über mehrere Spalten einfügen

von Karolus » So, 15.03.2009 19:22

Hallo
Lass die Zeile:
ozielbereich.setDataarray(iline()) so wie sie hier steht und füg direkt unterhalb folgendes ein:

Code: Alles auswählen

ochange = ozielbereich.createReplaceDescriptor()
	ochange.searchString = "^[0-9]"
	ochange.ReplaceString = "&" 
	ochange.SearchRegularExpression = true
	ozielbereich.replaceall(ochange)
	
	ochange.searchString = ",[0-9]+$"
	ochange.ReplaceString = "&€" 
	ochange.SearchRegularExpression = true
	ozielbereich.replaceall(ochange)
Ich hoffe das wars!
Gruß Karo

Re: Text über mehrere Spalten einfügen

von AndreasB. » So, 15.03.2009 18:09

Hallo Karo,

der Import setzt sich so zusammen:
Name;SSL;Datum;Betrag;Text

Das Feld SSL und Text ist nicht immer belegt. Hier ist halt dann ein Semikolon nach dem
anderen. Aber das funktioniert ja.

Hier mal drei Beispiele:
Max Mustermann;SSL;12.03.09;35,90;Das ist der Text
Max Mustermann;;09.03.09;48,60;Das ist der Text
Max Mustermann;SSL;07.03.09;125,80;

Nachdem ich die Zeile so geändert habe, wird zwar das Datum nicht mehr umgedreht, aber als
Text importiert. Das ist nicht gut, da ich dann nicht mehr mit dem Datum arbeiten kann.

Der Betrag wird auch noch als Text importiert (also mit einem ' vorangestellt).

Fehlermeldungen hat es nicht gegeben.

Gruß
Andreas

Nach oben