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
Inhalt von einem Sheet in ein anderes kopieren (Makro)
Moderator: Moderatoren
Ansatz?
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:
Leider vergisst dieses Makro die Corsorposition. Die muss Du also vorher auslesen und danach wieder ansteuern. Auslesen habe ich schon gemacht:
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:
Ciao
Niels
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
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
Ich hofffe, Dir damit einen Denkanstoß gegeben zu haben.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())
Ciao
Niels
Wer lesen kann ist klar im Vorteil.
Niels hat völlig recht, außer:
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:
Gruß
Stephan
man kann in jeder Tabelle zuverlässig den "belegten Bereich" ermitteln mit:bis man z.B. auf 3 leere Zellen nacheinander (vermutlich kommt dann nichts mehr) stößt.
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