Excel Dateien per Visual Studio (vb.net) zusammen führen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    Excel Dateien per Visual Studio (vb.net) zusammen führen

    Sehr geehrte Damen und Herren

    Ich bin ein Neuling im Bereich der Programmierung. Seite ein paar Tagen versuche ich mit Hilfe von Visual Basic (Visual Studio 2017) ein Problem zu lösen.
    Ich habe schon viele Stunden der Recherche verbracht werde aber leider nicht fündig. :(

    Ich habe diverse *.Dbf (dBase) Dateien, die ich per Batch Skript von unterschiedlichen Sticks zusammenführen möchte.

    Mein Plan ist nun, die dbf Datei mit dem Visual Studio mit Hilfe von Excel zu öffnen und den Inhalt in einem anderen Excel Dokument zu speichern.
    Ich bin schon so weit, dass ich Inhalte einer Textbox in einer Excel Datei speichern kann.

    Da man immer, wenn es um Excel geht reichlich Anleitungen zu Makros und dem VB in Excel findet komme ich leider nicht weiter.

    Ich bin leider noch nicht sonderlich weit:

    Public Class Form1
    Dim Excel As Object
    Dim Workbook1 As Object
    Dim sheets As Object
    Dim cells As Object
    Dim Workbook2 As Object

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles
    Button1.Click Excel = CreateObject("Excel.Application")
    Workbook1 = Excel.Workbooks.OpenXML("C:\123\1.xls") bzw. („C:\123\1.dbf“)
    Workbook2 = Excel.Workbooks.OpenXML("C:\123\2.xls")

    INHALT Workbook1(BEREICH) -> Kopieren WORKBOOK2 (BEREICH - nächste freie Zelle)

    Workbook1.Close(True)
    Workbook2.Close(True)
    End
    SubEnd
    Class

    Es wäre super, wenn mir jemand bei meinem Problem helfen könnte. ;(

    Mit freundlichem Gruß
    K. Hoffmann

    vummerich schrieb:

    INHALT Workbook1(BEREICH) -> Kopieren WORKBOOK2 (BEREICH - nächste freie Zelle)
    Die Ranges (Bereiche) sind im Arbeitsblatt, nicht im Workbook.

    VB.NET-Quellcode

    1. Dim CopyRange = Workbook1.Sheets(1).UsedRange
    2. Dim DestinationCell = Workbook2.Sheets(1).Cells(1048576,1).End(-4162).Offset(1) 'Rows.Count, xlUp
    3. Dim DestinationRange = DestinationCell.Resize(CopyRange.Rows, CopyRange.Columns)
    4. DestinationRange.Value = CopyRange.Value

    Aber mit CreateObject zu arbeiten ist Late Binding. Das verträgt sich nicht mit Option Strict Off.
    Besser wäre es Interop.Excel zu verwenden, dann liesse sich auch mit Konstanten wie xlUp arbeiten.

    Oder gleich epplus einbinden. Das ist allerdings ein anderer Ansatz.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    petaod schrieb:


    Oder gleich epplus einbinden.


    EPPlus kann kein DBase einlesen meines Wissens.

    Sieht so aus als wäre Interop.Excel die richtige Wahl für die Problemstellung.
    Oder, wenn es Werkzeuge gibt seine DBF-Version (von dem wir auch nichts wissen) in ein Dataset einzulesen, dann würde ich wieder EPPlus zur Ausgabe in Excel empfehlen.
    Vielen lieben Dank für den neuen Ansatz Petaod. Für mich ist das alles ziemlich komplex.

    Hab jetzt einfach mal den von ihnen angegebenen Quellcode eingebaut.
    Bin jedoch leider weiterhin noch weit davon entfernt die Dateien bzw. die Inhalte zu kopieren. :(
    Wäre auch zu einfach gewesen ;)


    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Public Class Form1
    3. Dim Excel As Object
    4. Dim Workbook1 As Object
    5. Dim sheets As Object
    6. Dim cells As Object
    7. Dim Workbook2 As Object
    8. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    9. Excel = CreateObject("Excel.Application")
    10. Excel = CreateObject("Excel.Application")
    11. Workbook1 = Excel.Workbooks.OpenXML("C:\123\1.xls")
    12. Workbook2 = Excel.Workbooks.OpenXML("C:\123\2.xls")
    13. Dim CopyRange = Workbook1.Sheets(1).UsedRange
    14. Dim DestinationCell = Workbook2.Sheets(1).Cells(1048576, 1).End(-4162).Offset(1) 'Rows.Count, xlUp
    15. Dim DestinationRange = DestinationCell.Resize(CopyRange.Rows, CopyRange.Columns)
    16. DestinationRange.Value = CopyRange.Value
    17. Workbook1.Close(True)
    18. Workbook2.Close(True)
    19. End Sub
    20. End Class


    Ich bekomme die Meldung mit der Unbehandelten Ausnahme:
    System.Runtime.InteropServices.COMException: "Ausnahme von HRESULT: 0x800A03EC"

    Viele lieben Dank und Gruß
    K. Hoffmann
    Kannst Du sagen wo der Fehler auftritt? Wenn nicht, dann setze Haltepunkte und stepp im Debugmode durch den Code.

    Dann verwundert mich, dass Du Microsoft.Office.Interop und nicht Microsoft.Office.Interop.Excel verwendest.
    Weiter verwundert mich die Verwendung von Workbooks.OpenXML.
    Einmal weil ich denke Du willst DBF Files importieren, was bedeutet Du müsstest eine neues Workbook Object erzeugen und da dann die DBF Files reinlutschen. Zum anderen warum öffnest Du eine .XLS mit der Anweisung, kann das stimmen?

    Dksksm schrieb:

    Dann verwundert mich, dass Du Microsoft.Office.Interop und nicht Microsoft.Office.Interop.Excel verwendest.
    Das ist imho sowieso ein toter Import, weil im Code nirgends ein Objekt aus diesem Namespace verwendet wird.
    Es sei denn, die Fehlermeldung resultiert aus einem Dreckeffekt, der aus dem Import stammt.
    Dim Excel As Object könnte als Versuch gewertet werden, ein Objekt aus dem importierten Namespace illegal zu modifizieren.
    Aber da müsste ja die IDE schon aufheulen.

    Dksksm schrieb:

    Weiter verwundert mich die Verwendung von Workbooks.OpenXML.
    Das ist ein guter Einwand. Ist mir gar nicht aufgefallen. Wahr wohl noch zu früh.
    Mir ist auch raus, dass es sich eigentlich um DBase-Files drehen soll. Ich hatte nur .xls gesehen.

    @vummerich:
    Welches Format haben deine einzulesenden Dateien?
    Sind es DBase-Files oder Excel-Workbooks?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()

    Wieder mal vielen Dank das ihr euch bemüht und mich bei der Lösung unterstützt.

    Ich möchte tatsächlich viele dbf Dateien (dBase) einlesen und zu einer großen vereinen. Um diese zu vereinen, dachte ich, das kopieren
    mit Hilfe von Excel zu realisieren und dann die fertige Datei mit Hilfe von Libre Office wieder als dbf Datei zu speichern.

    Daher wollte ich zunächst herausbekommen wie man inhalte von Excel zu Excel kopiert und dann im nächsten Schritt dafür sorgen, dass bei jedem neuen Einlesen
    Daten hinter die schon vorhandenen kopiert werden.

    Das ist alles relativ umständlich nur wurde ich bei der Suche nach einem passenden Code (Codsnippsel) für die DBF Dateien nicht fündig.

    Mit freundlichen und dankbaren Grüßen
    K . Hoffmann