Inhalt von einem Sheet in ein anderes kopieren (Makro)

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: Inhalt von einem Sheet in ein anderes kopieren (Makro)

von mecki_45 » So, 22.08.2004 09:22

Hallo ihr Zwei,
Danke für diese Denkanstöße - werde heute mich heute abend mal dran setzen und weiterarbeiten, jetzt geht`s erst mal wandern.

Grüßle
Alex

von Stephan » Sa, 21.08.2004 14:57

Niels hat völlig recht, außer:
bis man z.B. auf 3 leere Zellen nacheinander (vermutlich kommt dann nichts mehr) stößt.
man kann in jeder Tabelle zuverlässig den "belegten Bereich" ermitteln mit:

oCellCursor = oSheet.createCursor()
oCellCursor.GotoEndOfUsedArea(True)
letzte_Zeile = oCellCursor.getRangeAddress.EndRow
letzte_Spalte = oCellCursor.getRangeAddress.EndColumn


ohne weitere Erklärungen entspricht das der Tastenkombination <STRG>+<Ende>

somit:
im Ausgangsdokument die "letzte Zelle" finden
Bereich mit den Koordinaten A2:"letzte Zelle" auswählen
kopieren
anderes Dokument öffnen, Blatt wählen
wieder "letzte Zelle" finden
eine Zeile tiefer als "letzte Zelle" Zelle in Spalte A markieren
einfügen

der folgende (nicht sehr schöne) Code sollte das erledigen:

Code: Alles auswählen

sub Bereich_kopieren
'das aktuelle Dokument
Doc = StarDesktop.CurrentComponent
oSheet = Doc.Sheets(0)
oCellCursor = oSheet.createCursor()
'Bereich ermitteln, welcher Inhalt enthält 
oCellCursor.GotoEndOfUsedArea(True) 
letzte_Zeile = oCellCursor.getRangeAddress.EndRow
letzte_Spalte = oCellCursor.getRangeAddress.EndColumn
'umformen von (0,0)-->($A$1)
nb= (letzte_Spalte+1) / 26 
if ( nb >= 1 ) then 
     AdrStr = Chr(64 + Fix(nb)) 
end if 
AdrStr = AdrStr+Chr((letzte_Spalte mod 26)+65)
AdrStr = "$" & AdrStr & "$" 
AdrStr = AdrStr+Cstr(letzte_Zeile+1) 
'gesamt 1. Zelle ist bekannt -->A2
bereich = "$A$2:" & AdrStr 
document   = ThisComponent.CurrentController.Frame 
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 
dim args1(0) as new com.sun.star.beans.PropertyValue 
args1(0).Name = "ToPoint" 
args1(0).Value = bereich
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1()) 
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
'auf anderes Dokument zugreifen
Dim mNoArgs() REM Empty Sequence 
Dim sUrl As String 
oDesktop = createUnoService("com.sun.star.frame.Desktop")
'Dokument muß bereits existieren 
sUrl = "file:///D:/test2.sxc" 
oThisDocument = Thiscomponent 
oThatDocument = oDesktop.LoadComponentFromURL(sUrl,"_blank",0,mNoArgs)
oCellCursor = oThatDocument.sheets(0).createCursor()
'wieder gesamten Bereich mit Inhalt ermitteln
oCellCursor.GotoEndOfUsedArea(True)   
letzte_Zeile = oCellCursor.getRangeAddress.EndRow
msgbox letzte_Zeile
document  = oThatDocument.CurrentController.Frame
'die erste leere Zelle in Spalte A selektieren
'wo die gesamte Zeile leer ist
bereich = "$A" & letzte_Zeile+2
args1(0).Name = "ToPoint" 
args1(0).Value = bereich
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
end sub

Gruß
Stephan

Ansatz?

von Niels » Fr, 20.08.2004 21:17

Wie wäre es denn, die Zelle im Zieldokument zu aktivieren, ab der einegfügt werden soll und dann per Makro Zelle für Zelle von Ursprungstabelle lesen (da ist noch die Frage, wie man das angeben kann, aus welcher Tabelle gelesen werden soll), bis man z.B. auf 3 leere Zellen nacheinander (vermutlich kommt dann nichts mehr) stößt. Dauert vielleicht etwas, aber müsste funktionieren.

Zum Markieren müsste man die Tastenkombination Strg+Ende - Strg+Shift+Pos1 - Schift+Cursor runter - Strg+C verwenden. Dass kann man aufzeichnen:

Code: Alles auswählen

sub Complete
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Sel"
args1(0).Value = false

dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Sel"
args2(0).Value = true

dispatcher.executeDispatch(document, ".uno:GoToStart", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(1) as new com.sun.star.beans.PropertyValue
args3(0).Name = "By"
args3(0).Value = 1
args3(1).Name = "Sel"
args3(1).Value = true

dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args3())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Nr"
args5(0).Value = 2

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args5())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())


end sub
Leider vergisst dieses Makro die Corsorposition. Die muss Du also vorher auslesen und danach wieder ansteuern. Auslesen habe ich schon gemacht:

Code: Alles auswählen

	Dim oDoc as Object
	Dim oZelle as Object
	Dim oZeile as Integer
    oDoc=thisComponent 
    oZelle=oDoc.getCurrentSelection().getCellAddress() 
    oZeile=oZelle.row 
Genau so kann man ja sicher,mit etwas lesen im Programmierhandbuch, auch die aktive Tabelle ermitteln. Das Ansteuern einer Zelle kannst Du auch aufzeichnen und musst nur noch Deine Variablen einfügen:
rem ----------------------------------------------------------------------
rem define variables
dim document as object
Dim Sheet As Object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
Sheet = Doc.Sheets(1)
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
Ich hofffe, Dir damit einen Denkanstoß gegeben zu haben.

Ciao
Niels

Inhalt von einem Sheet in ein anderes kopieren (Makro)

von mecki_45 » Fr, 20.08.2004 16:04

Hallo zusammen,
wie kann ich den Inhalt eines CALC-Dokuments (Tabelle 1) in ein anderes Dokument kopieren (Tabelle 1 unten angefügt). Ich denke hier nicht an die Funktion Tabelle kopieren.
Es sollte wie folgt funktionieren:
Markiere in Dokument (1) *Tabelle 1* alles bis auf die erste Zeile, kopiere ins Clipboard, öffne Dokument (2), *Tabelle 1* und kopiere jetzt den Inhalt des Clipboards in diese Tabelle ab Zeile 2 bzw. ab der nächsten freien Zeile.

Aufzeichnen klappt nicht, der Makrorecorder hat Probleme, wenn es über Dateigrenzen hinweg geht.

Irgendwelche Ideen?

Danke im voraus für Hilfe
Alex

Nach oben