Zellbereich von einem Dokument in ein anderes kopieren

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: Zellbereich von einem Dokument in ein anderes kopieren

von ck » Mo, 14.02.2005 12:48

Hallo Vanished,

entschuldigung für die verspätete Antwort, aber in den letzten Tagen hatte ich recht wenig Zeit.

Die Idee mit dem Kopieren über die Zwischenablage hatte ich auch schon, wußte aber bis zu Deinem Beitrag nicht so genau wie. Dafür erst einmal vielen Dank. Ich werde das Ganze beim nächsten mal so verwenden.

Mein Problem habe ich jetzt (wie weiter oben bereits angedeutet) so gelöst, daß ich die unterschiedlichen Dateien in einem Dokument zusammengefaßt habe und jedem Benutzer nur die für ihn benötigten Tabellenblätter anzeige und den Rest einfach ausblende.

von Vanished » Mi, 09.02.2005 15:06

Bei näherem Hinsehen kann die Methode CopyRange hier nicht erfolgreich sein. CopyRange ist eine Methode des Interfaces XCellRangeMovement und ist in der API unter com.sun.star.sheet zu finden. Da heißt es dann auch gleich "copies a cell range to another position in the document. .
Die Range funktioniert über das aktuelle Dokument hinaus nicht.

Das gewünschte Ziel ist aber relativ einfach, wenn auch nicht gerade elegant, über ein mit Hilfe des Makro-Rekorders zusammengesetzen Code erreichbar:

Code: Alles auswählen

sub ClipboardCopy
dim document  as object, dispatcher as object, myDoc as Object, newdoc as Object
dim Dummy()

'get access to the document
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"
      'hier muß die Quell-Range eingegeben werden
      args1(0).Value = "$A$1:$E$10"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

'Jetzt wird das neue Dokument geladen
       myDoc = StarDesktop.loadComponentFromURL("file:///DerPfadzurneuenDatei" , "_blank", 0, Dummy() )
newdoc = myDoc.getCurrentController.Frame

'Jetzt geht das Pasten los
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
      'Hier muß die Ziel Range rein)
      args2(0).Value = "$A$1:$E$10"
dispatcher.executeDispatch(newdoc, ".uno:GoToCell", "", 0, args2())
dispatcher.executeDispatch(newdoc, ".uno:Paste", "", 0, Array())
end sub
Dinge, die noch individuell anzupassen sind, habe ich eingerückt geschrieben. Hoffe, es hilft!

Viele Grüße,
Vanished

von ck » Mi, 09.02.2005 10:42

Hallo Stephan,

vielen Dank noch einmal für Deine Mühe. Da ich auch noch keine praktikable Lösung gefunden habe, habe ich die Dateien einfach zu einer Datei mit verschiedenen Tabellen vereinigt. Darin funktioniert die Kopiererei ja problemlos. Nun bekommen die Anwender, welche ja eigentlich die eine Datei (Rechnungsformular) nicht haben sollten, einfach die zugehörige Tabelle nicht sichtbar geschaltet. Für jemanden ohne Programmierkenntnisse ist das auch nicht so einfach wieder einzuschalten (hoffe ich jedenfalls).

von Stephan » Mo, 07.02.2005 23:55

Hallo Carsten,

Dein Einwand ist berechtigt. Ich müßte das erstmal überlegen und testen bezüglich CopyRange. Reicht es nicht nur die Zellwerte der einzelnen Zellen zu kopieren? Dann geht sowas hier (müßtest Du noch etwas ergänzen):

Code: Alles auswählen

myDoc = ThisComponent
myDoc2 = 'ergänzen 
oT1 = myDoc.Sheets(0)
oT2 = myDoc2.Sheets(0) 
For i=1 to 2
 For j=1 to 359
  x = oT1.getCellByPosition(i,j).value
  oT2.getCellByPosition(i-1,j-1).value = x
 Next j
Next i


Sind die zu kopierenden Werte nicht alles Zahlen müßtest Du statt .value etwas anderes verwenden.
UNd vorher ggf. prüfen was.

-->Erläuterungen: http://docs.sun.com/db/doc/817-3924?l=de (Seite 124)

Sorry, bin heute mit der Zeit knapp - vielleicht kommt Du mit den Infos allein weiter. Sonst wieder nachfragen.

Gruß
Stephan

von ck » Mo, 07.02.2005 21:13

Hallo Stephan,

danke für die schnelle Antwort, obwohl sie mir so noch nicht viel weiter hilft.
Wie ich ein 2. Dokument öffne und dieses einer Objektvariablen zuweise habe ich mir schon erarbeitet.
Was mir jedoch noch fehlt ist der Punkt, an dem ich diese Objektvariable mit dem QuellBereich verknüpfe.
Bei dem Befehl copyRange kann ich doch nur 2 Parameter angeben, einmal die CellAddress des Zieles und einmal den CellRangeAddress des Quellbereiches. Bei beiden kann ich jedoch meines Wissens nach kein Dokument-Objekt festlegen, oder täusche ich mich da?
Kann ich vielleicht folgendes schreiben:

Code: Alles auswählen

QuellBereich.Component = MyDoc2
?

von Stephan » Mo, 07.02.2005 18:28

Du greifst auf das eine Dokument mit der Objektvariable myDoc zu. Vergib für das andere eine andere objektvariable und alles läuft analog.
ThisComponent kann natürlich nur für das eine aktuelle Dokument gelten, die Wertzuweisung für das andere Objekt muß über das entsprechende Frame erfolgen ( viewtopic.php?t=1842&highlight=aktuell+haslocation ) oder einfacher durch Öffnen des Dokuments im Sinne:

Code: Alles auswählen

myDoc2 = StarDesktop.loadComponentFromURL(<Pfad> , "_blank", 0, Dummy() )
Gruß
Stephan

Zellbereich von einem Dokument in ein anderes kopieren

von ck » Mo, 07.02.2005 17:09

Hallo,

ich bin zur Zeit auf der Such nach einer Möglichkeit mit Basic einen Zellbereich aus einem Dokument in ein anderes kopieren zu können.

Von einer Tabelle in eine andere Tabelle des gleichen Dokumentes habe ich bisher mit Erfolg folgenden Code verwendet:

Code: Alles auswählen

  Dim QuellBereich As New com.sun.star.table.CellRangeAddress
  Dim ZielZelle  As New com.sun.star.table.CellAddress
  Dim oT1 as Object
  Dim myDoc as Object
  myDoc = ThisComponent
  oT1 = myDoc.Sheets(0)
  QuellBereich.Sheet = 1
  QuellBereich.StartColumn = 1
  QuellBereich.StartRow = 1
  QuellBereich.EndColumn = 2
  QuellBereich.EndRow = 359
  ZielZelle.Sheet = 0
  ZielZelle.Column = 0
  ZielZelle.Row = 0
  oT1.copyRange(ZielZelle, QuellZelle)

Ich sehe hier aber keine Möglichkeit ein 2. Dokument entweder als Quellbereich oder als Ziel zu verwenden.

Kann mir vielleich jemand helfen ?

Nach oben