none
per VBA von einer Datei die mehrere Datenblätter enthält, von einem Blatt zu einem anderen Daten zu kopieren RRS feed

  • Frage

  • Hallo

    Ich hätte mal wieder eine Hilfe nötig

    Ich habe eine Excel-Datei "Jahr.xlsx", die 13 Sheets enthält. Januar bis Dezember plus Stammdaten.

    Bis jetzt kann ich meine Datei fehlerfrei öffnen, in der fetten Zeile durch eintragen des Sheet-Namen dort Werte eintragen, und das kleine Test_Programm ohne Fehler beenden. Was ich einfach nicht hinbekomme, das ich von Januar Daten nach Februar kopieren kann.

    Über jede Hilfe bin ich dankbar, bostic

    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            UP_1()
            End
        End Sub
    
        Public Function UP_1() As Boolean
    
            Dim Exceldatei2 As Object = CreateObject("Excel.Application")
            Exceldatei2.Application.Workbooks.Open("M:\Test\Jahr.xlsx")  ' File aus dem gelesen werden soll öffnen
            Exceldatei2.Application.Sheets("Oktober" ).Select(1)
     
            Exceldatei2.Cells(10, 20).Value = 17
            Exceldatei2.Cells(10, 22).Value = "NEUER INHALT"
    
            Exceldatei2.ActiveWorkbook.Save()
            Exceldatei2.ActiveWorkbook.Close()
            Exceldatei2.Workbooks.Close()
            Exceldatei2.Quit()
            Exceldatei2 = Nothing
    
            Return True
    
        End Function
    End Class


    Hobby Programmierer aus Butzbach, Hessen

    Donnerstag, 17. Mai 2018 12:07

Antworten

  • Hallo bostic,

    so sollte es funktionieren:

    Dim xlsApp As Microsoft.Office.Interop.Excel.Application = CreateObject("Excel.Application")
    
    Dim wsQuelle As Microsoft.Office.Interop.Excel.Worksheet
    Dim wsZiel As Microsoft.Office.Interop.Excel.Worksheet
    
    Dim wb As Microsoft.Office.Interop.Excel.Workbook
        wb = xlsApp.Workbooks.Open("M:\Test\Jahr.xlsx")  ' File aus dem gelesen werden soll öffnen
        wsQuelle = wb.Sheets("Januar")
        wsZiel = wb.Sheets("Februar")
        wsZiel.Cells(1, 1) = wsQuelle.Cells(1, 1)
    .
    .
    .
    .

    Ich verwende hier übrigens die frühe Bindung, d.h. Du musst vorher die Verweise auf Excel im Visual-Studio eintragen.

    Grüße

    Roland

    Freitag, 18. Mai 2018 10:09
  • Hi,
    im Betreff der Frage schreibst Du von VBA. Das Forum betrifft aber Fragen zu VB.NET. VBA nutzt VB6 als Sprach-Version.

    Die Antwort von Roland bezieht sich auf VB.NET, nicht auf VBA. Damit das in VB.NET funktioniert, muss natürlich auf die Excel-PIA referenziert werden. Das kannst Du im Visual Studio 2017 über rechte Maustaste über dem markierten Objekt -> Add -> Reference -> Com -> Microsoft Excel 16.0 Object Library machen. Da wird die PIA-dll automatisch generiert und referenziert. In der Code kannst Du dann Imports für den Excel-Namensraum nutzen.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Montag, 21. Mai 2018 12:34
  • Hallo bostic,

    wie Peter schon geschrieben hat ist mein Antwortbeispiel natürlich in VB.NET, das habe ich so gewählt weil Dein Codeauschnitt ja ebenfalls in VB.NET geschrieben war.

    Falls Du lieber nicht die frühe Bindung wie in Deinem Beispiel verwenden willst (weshalb auch immer) kannst Du über die späte Bindung die Variablen auch vom Typ Object deklarieren.

    Mein Beispiel sieht dann so aus:

    .
    .
    .
    Dim xlsApp As Object = CreateObject("Excel.Application")
    Dim wsQuelle As Object
    Dim wsZiel As Object
    Dim wb As Object
    wb = xlsApp.Workbooks.Open("m:\test\Jahr.xlsx")  ' File aus dem gelesen werden soll öffnen
    wsQuelle = wb.Sheets("Januar")
    wsZiel = wb.Sheets("Februar")
    wsZiel.Cells(1, 1).value2 = wsQuelle.Cells(1, 1).value2
    .
    .
    .
    

    Grüße

    Roland

    Mittwoch, 23. Mai 2018 08:55

Alle Antworten

  • Hallo bostic,

    so sollte es funktionieren:

    Dim xlsApp As Microsoft.Office.Interop.Excel.Application = CreateObject("Excel.Application")
    
    Dim wsQuelle As Microsoft.Office.Interop.Excel.Worksheet
    Dim wsZiel As Microsoft.Office.Interop.Excel.Worksheet
    
    Dim wb As Microsoft.Office.Interop.Excel.Workbook
        wb = xlsApp.Workbooks.Open("M:\Test\Jahr.xlsx")  ' File aus dem gelesen werden soll öffnen
        wsQuelle = wb.Sheets("Januar")
        wsZiel = wb.Sheets("Februar")
        wsZiel.Cells(1, 1) = wsQuelle.Cells(1, 1)
    .
    .
    .
    .

    Ich verwende hier übrigens die frühe Bindung, d.h. Du musst vorher die Verweise auf Excel im Visual-Studio eintragen.

    Grüße

    Roland

    Freitag, 18. Mai 2018 10:09
  • Hallo Roland

    Erstmal Danke für Deinen Vorschlag, leider bkomme ich Fehlermeldungen.

    Ich habe UP_1() einfach mal weggelassen und habe Deinen Code eingetragen.

    Als Fehlermeldung bekomme ich für alle 4 DIM Anweisungen folgende Fehlermeldung:

    Der Typ "Microsoft.Office.Interop.Excel.Worksheet" ist nicht definiert.

    Vieleicht könntest Du nochmal drüberschauen woran es liegen könnte.

    Gruss bostic


    Hobby Programmierer aus Butzbach, Hessen

    Sonntag, 20. Mai 2018 13:15
  • Hi,
    im Betreff der Frage schreibst Du von VBA. Das Forum betrifft aber Fragen zu VB.NET. VBA nutzt VB6 als Sprach-Version.

    Die Antwort von Roland bezieht sich auf VB.NET, nicht auf VBA. Damit das in VB.NET funktioniert, muss natürlich auf die Excel-PIA referenziert werden. Das kannst Du im Visual Studio 2017 über rechte Maustaste über dem markierten Objekt -> Add -> Reference -> Com -> Microsoft Excel 16.0 Object Library machen. Da wird die PIA-dll automatisch generiert und referenziert. In der Code kannst Du dann Imports für den Excel-Namensraum nutzen.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Montag, 21. Mai 2018 12:34
  • Hallo bostic,

    wie Peter schon geschrieben hat ist mein Antwortbeispiel natürlich in VB.NET, das habe ich so gewählt weil Dein Codeauschnitt ja ebenfalls in VB.NET geschrieben war.

    Falls Du lieber nicht die frühe Bindung wie in Deinem Beispiel verwenden willst (weshalb auch immer) kannst Du über die späte Bindung die Variablen auch vom Typ Object deklarieren.

    Mein Beispiel sieht dann so aus:

    .
    .
    .
    Dim xlsApp As Object = CreateObject("Excel.Application")
    Dim wsQuelle As Object
    Dim wsZiel As Object
    Dim wb As Object
    wb = xlsApp.Workbooks.Open("m:\test\Jahr.xlsx")  ' File aus dem gelesen werden soll öffnen
    wsQuelle = wb.Sheets("Januar")
    wsZiel = wb.Sheets("Februar")
    wsZiel.Cells(1, 1).value2 = wsQuelle.Cells(1, 1).value2
    .
    .
    .
    

    Grüße

    Roland

    Mittwoch, 23. Mai 2018 08:55
  • Hi Roland und bostic,
    wichtig ist, bei später Bindung nicht das Option Strict Off vergessen!

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 23. Mai 2018 09:33