Benutzer mit den meisten Antworten
Blatt aus anderer Arbeitsmappe in das aktuelle Projekt kopieren

Frage
-
Hallo,
wie kann ich aus einer anderen Arbeitsmappe ein Tabellenblatt in die aktuelle Arbeitsmappe kopieren. Ich kann eine Datei öffnen und einen Wert daraus lesen, aber ich schaffe es nicht ein Blatt aus der Datei zu kopieren. Ich bekomme außerdem eine Fehlermeldung wenn ich die Datei wieder schliessen will.
Kann mir jemand ein Beispiel geben?
Viele Grüße
Emil
Antworten
-
Hallo Emil,
das Problem habe ich schon verstanden, mir ging es eigentlich mehr um die Projekthintergründe, was das Addin im Allgemeinen leisten soll? Meistens ist es leichter eine Lösung zu bieten oder eventuell Alternativen anzubieten. Ich habe jetzt mal selber ein VSTO Addin Projekt erstellt.
Dim rng1 As Excel.Range Dim rng2 As Excel.Range 'Zellen mit Beispielwerten füllen rng1 = Globals.ThisAddIn.Application.Sheets(1).Range("A1") rng1.Value2 = 1 rng1 = Globals.ThisAddIn.Application.Sheets(1).Range("A2") rng1.Value2 = 2 'Formel einfügen rng1 = Globals.ThisAddIn.Application.Sheets(1).Range("A3") rng1.Formula = "=A1 + A2" rng1 = Globals.ThisAddIn.Application.Sheets(1).Range("A1:A3") 'Alles Fett formatieren rng1.Font.Bold = True rng1.Copy() 'Arbeitsmappe in aktuellen Instanz öffnen Globals.ThisAddIn.Application.Workbooks.Open("C:\test.xlsm") rng2 = Globals.ThisAddIn.Application.Workbooks(2).Sheets(1).Range("B1:B3") 'Einfügen mit allen Formatierungen und Formeln rng2.PasteSpecial(Paste:=Excel.XlPasteType.xlPasteAll) 'Neue Arbeitsmappe aktivieren Globals.ThisAddIn.Application.Workbooks(2).Activate()
Ich hoffe es hilft Dir weiter.
Gruß
Viktor
Alle Antworten
-
Hallo Emil,
ich habe Dein Problem mit dem Makrorecorder aufzeichnen lassen. Der Makrorecorder generiert folgende Anweisung:
Sheets("Tabelle2").Copy After:=Workbooks("Mappe1").Sheets(5)
Die Anweisung kopiert die Tabelle2 von der aktiven Arbeitsmappe in Mappe1 (zweite geöffnete Arbeitsmappe). Die Tabelle wird als letzte Tabelle hinten angefügt.
Gruß
Viktor
-
Hallo Viktor,
vielen Dank für deine Antwort.
Ich kann keine Blätter aus einer "normalen" Arbeitsmappe in eine mit VSTO erstellte Arbeitsmappe kopieren. Kopieren zwischen "normalen" Arbeitsmappen funktioniert und Kopieren zwischen mit VSTO erstellten Arbeitsmappen funktioniert, aber das erstgenannte nicht.
Viele Grüße
Emil
-
Hallo Emil,
wie Du merkst lässt mir das Thema keine Ruhe. Du hast nicht ganz Recht mit Deiner Aussage, dass man "normale" Arbeitsmappen nicht in VSTO erstellte Arbeitsmappen kopieren kann. Ich habe im englischen MSDN Forum folgendes gefunden:
http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/b31bf687-2549-436a-8997-c11c9f3258ed/
Der Grund dafür ist wohl das VSTO Programmier Modell. So wie ich das verstanden habe, haben VSTO Objekte eine andere Vererbungshirarchie (als die Objekte die Excel erstellt). Mit der Eigenschaft InnerObject kannst Du aber diesen Unterschied ausgleichen. Vielleicht kannst Du ja mit dieser Information, das Problem lösen.
Gruß
Viktor
-
Hallo Viktor,
vielen Dank für deine Antwort. Auf die von Dir genannte Seite bin ich zwischenzeitlich auch gestossen. Es ist mir aber bisher nicht gelungen, das konkret umzusetzen. Hast Du es versucht und hast Du ein Beispiel? Unabhängig davon versuche ich es weiter und melde mich falls ich Erfolg habe.
Viele Grüße
Emil
-
Hallo Emil,
nein, selber versucht habe ich es nicht. Ich habe vor Ort nur die Möglichkeit VBA Code zu erzeugen und zu testen. Ich müsste das auf später Verschieben.
Kannst Du den Debuggen?? Versuch doch mal Dir die Eigenschaften der Objecte anzeigen zu lassen. Dort müsste man eigentlich sehen können ob es sich um gültige Objekte handelt. Was klappt den nicht der Zugriff auf das VSTO-Objekt?? Vielleicht kannst Du ja noch einen Code-Ausschnitt mit anhängen.
Gruß
Viktor
-
Hallo Viktor,
vielen Dank für deine Antwort. Inzwischen geht es mir nicht mehr darum ein komplettes Arbeitsblatt zu kopieren, ich möchte einen Zellbereich inkl. aller Formatierungen aus einer normalen Arbeitsmappe in mein VSTO-Projekt kopieren.
Ich habe Folgendes versucht:
Dim objExcel As New Excel.Application
Dim rng1 As Excel.Range
Dim rng2 As Excel.Range
objExcel.Workbooks.Open("C:\test.xlsm")
rng1 = objExcel.Sheets("tab1").Range("A1:B5")
rng2 = Globals.ThisWorkbook.ActiveSheet.Range("A1:B5")
' Methode 1: versuche den Bereich zu kopieren
rng1.Copy()
rng2.PasteSpecial()
' Methode 2: Werte zuweisen
rng2.Value = rng1.Value
objExcel.Workbooks("test.xlsm").Close(SaveChanges:=False)
objExcel.Quit()
objExcel = NothingMethode 1 kopiert den Bereich als Grafik in das VSTO Projekt
Methode 2 kopiert zwar alle Werte in das VSTO Projekt, jedoch gehen alle Formatierungen verloren.
Was kann ich tun?
Viele Grüße
Emil -
Hallo Emil,
hast Du dir mal die Hilfe zu PasteSpecial aufgerufen? Der erste Parameter "Paste" hat eine Parameter "xlPasteFormats". Der Makrorecorder hat folgendes ausgeworfen:
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False
vieleicht klappt es ja damit? Ich habe dafür einen Wert in eine Zelle geschrieben, fett formatiert und dann kopiert. Danach den Zellenwert in eine neue Zelle eingefügt, wobei ich mit der Option "ursprüngliche Formatierung beibehalten" eingefügt habe.
Noch mal zu dem Kopierproblem zu kommen. Ich hatte mal in einem anderen Projekt den Weg gewählt, dass ich zuerst im Original geändert habe und dann die geänderte Tabell unter neuem Namen gespeichert habe.Gruß
Viktor
-
Hallo Viktor,
vielen Dank für deine Antwort. Das Problem scheint zu sein, dass ich die Datei mit den zu kopierenden Daten in einer neuen Excel-Instanz öffne. Dann kann ich zwar Daten aber z. B. keine Formeln kopieren. Wenn ich manuell zwei Dateien in der selben Excel-Instanz öffne, kann ich mit Copy+paste alles kopieren, wenn ich unterschiedliche Excel-Instanzen benutze, dann klappt das nicht.
Viele Grüße
Emil
-
Hallo Emil,
> Dann kann ich zwar Daten aber z. B. keine Formeln kopieren. Wenn ich manuell zwei Dateien in der selben Excel-Instanz öffne, kann ich mit Copy+paste alles
> kopieren, wenn ich unterschiedliche Excel-Instanzen benutze, dann klappt das nicht.
musst Du denn mit zwei Instanzen arbeiten? Man kann doch in einer Instanz mehrere Arbeitsmappen gleichzeitig öffnen. Was heißt denn klappt nicht? Bekommst Du eine Zugriffsverletzung, Fehlermeldungen falsche Einträge??? Mit den von Dir zur Verfügung gestellten Informationen ist es schwierig etwas zu empfehlen. Vielleicht kannst Du ja mal kurz (in Stichpunkte) beschreiben was das Addin im Idealfall ermöglichen soll? Für Formeln gibt es den Parameter xlPasteFormulas siehe auch: http://msdn.microsoft.com/de-de/library/microsoft.office.interop.excel.xlpastetype.aspx
Hoffe wir reden nicht aneinander vorbei.
Gruß
Viktor
-
Hallo Viktor,
ich formuliere das Problem nochmals neu: Ich habe ein Excel-VSTO-Projekt und möchte zur Laufzeit programmgesteuert aus einer normalen Excel-Arbeitsmappe einen bestimmten Bereich eines Arbeitsblattes in mein Projekt kopieren. Dabei sollen alle Formatierungen, Formeln und Bereichsnamen dieses Bereiches mit kopiert werden. So wie ich es jetzt gemacht habe (siehe oben) wird die Excel-Arbeitsmappe in einer neuen Instanz geöffnet. Kann ich die Arbeitsmappe auch in der gleichen Instanz öffnen? Wie genau ist dann die Syntax?
Viele Grüße
Emil
-
Hallo Emil,
das Problem habe ich schon verstanden, mir ging es eigentlich mehr um die Projekthintergründe, was das Addin im Allgemeinen leisten soll? Meistens ist es leichter eine Lösung zu bieten oder eventuell Alternativen anzubieten. Ich habe jetzt mal selber ein VSTO Addin Projekt erstellt.
Dim rng1 As Excel.Range Dim rng2 As Excel.Range 'Zellen mit Beispielwerten füllen rng1 = Globals.ThisAddIn.Application.Sheets(1).Range("A1") rng1.Value2 = 1 rng1 = Globals.ThisAddIn.Application.Sheets(1).Range("A2") rng1.Value2 = 2 'Formel einfügen rng1 = Globals.ThisAddIn.Application.Sheets(1).Range("A3") rng1.Formula = "=A1 + A2" rng1 = Globals.ThisAddIn.Application.Sheets(1).Range("A1:A3") 'Alles Fett formatieren rng1.Font.Bold = True rng1.Copy() 'Arbeitsmappe in aktuellen Instanz öffnen Globals.ThisAddIn.Application.Workbooks.Open("C:\test.xlsm") rng2 = Globals.ThisAddIn.Application.Workbooks(2).Sheets(1).Range("B1:B3") 'Einfügen mit allen Formatierungen und Formeln rng2.PasteSpecial(Paste:=Excel.XlPasteType.xlPasteAll) 'Neue Arbeitsmappe aktivieren Globals.ThisAddIn.Application.Workbooks(2).Activate()
Ich hoffe es hilft Dir weiter.
Gruß
Viktor
-
Hallo Viktor,
jetzt funktioniert es endlich auch bei mir. Manchmal hat man (ich) wirklich ein Brett vorm Kopf. Ich nutze Excel um technische Dokumentationen zu erstellen. In meinem VSTO Projekt erweitere ich Excel mit bestimmten Funktionen um dann bestimmte Aufgaben schneller ausführen zu können. Dazu gehört auch das vorgefertigte Teile der Dokumentation programmgesteuert aus anderen Arbeitsmappen einfügt werden können. Ich hatte das Ganze vor Jahren schon in VBA programmiert und stelle jetzt nach VSTO um. Dabei gibt es immer wieder Stolpersteine weil viele Dinge doch anders reagieren.
Nochmals vielen Dank für deine Hilfe.