none
Blatt aus anderer Arbeitsmappe in das aktuelle Projekt kopieren RRS feed

  • 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

    Dienstag, 14. Februar 2012 15:21

Antworten

  • Hallo,

    ich habe gelernt, dass es wohl nicht geht. Ich löse das Problem jetzt so, dass ich mir ein neues Blatt erstelle und nur die Daten kopiere.

    Viele Grüße

    Emil

    • Als Antwort markiert Emil60 Freitag, 17. Februar 2012 12:06
    Freitag, 17. Februar 2012 12:04
  • 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

    • Als Antwort vorgeschlagen v.hirsch Mittwoch, 29. Februar 2012 21:10
    • Als Antwort markiert Emil60 Mittwoch, 21. März 2012 10:15
    Dienstag, 28. Februar 2012 20:04

Alle Antworten

  • Hallo,

    ich habe gelernt, dass es wohl nicht geht. Ich löse das Problem jetzt so, dass ich mir ein neues Blatt erstelle und nur die Daten kopiere.

    Viele Grüße

    Emil

    • Als Antwort markiert Emil60 Freitag, 17. Februar 2012 12:06
    Freitag, 17. Februar 2012 12:04
  • 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

    Freitag, 17. Februar 2012 12:22
  • 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

    Dienstag, 21. Februar 2012 18:24
  • 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

    Freitag, 24. Februar 2012 09:10
  • 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

    Freitag, 24. Februar 2012 11:43
  • 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

    Freitag, 24. Februar 2012 12:17
  • 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 = Nothing

    Methode 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

    Samstag, 25. Februar 2012 09:18
  • 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

    Sonntag, 26. Februar 2012 19:56
  • 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

    Dienstag, 28. Februar 2012 11:27
  • 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

    Dienstag, 28. Februar 2012 12:09
  • 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

    Dienstag, 28. Februar 2012 14:58
  • 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

    • Als Antwort vorgeschlagen v.hirsch Mittwoch, 29. Februar 2012 21:10
    • Als Antwort markiert Emil60 Mittwoch, 21. März 2012 10:15
    Dienstag, 28. Februar 2012 20:04
  • 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.

    Mittwoch, 29. Februar 2012 16:39