Anlegen und Auslesen von Excel-Dateien

  • Excel

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Flugmodellbauer.

    Anlegen und Auslesen von Excel-Dateien

    Hallo VB-Fangemeinde!

    Ich bin gerade dabei, mich in Visual Basic Studio 2010 einzuarbeiten. Für numerische Anwendungen möchte ich n*n-Matrizen in Excel-Dateien abspeichern. Bei der Suche im Internet bin ich nur teilweise fündig geworden, wie sich so etwas programmieren lässt. Die Überführung der Matrixelement in eine Excel-Tabelle bekomme ich hin:

    Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim oXL As Object ' Excel application
    Dim oBook As Object ' Excel workbook
    Dim oSheet As Object ' Excel Worksheet
    Dim oChart As Object ' Excel Chart

    Dim iRow As Integer ' Index variable for the current Row
    Dim iCol As Integer ' Index variable for the current Row

    Const cNumCols = 10 ' Number of points in each Series
    Const cNumRows = 2 ' Number of Series

    Dim A(0 To cNumRows + 1, 0 To cNumCols + 1) As Integer

    'Start Excel and create a new workbook
    oXL = CreateObject("Excel.application")
    oBook = oXL.Workbooks.Add
    oSheet = oBook.Worksheets.Item(1)

    ' Insert Random data into Cells for the two Series:
    Randomize(Now().ToOADate())
    For iRow = 1 To cNumRows
    For iCol = 1 To cNumCols
    A(iRow, iCol) = Int(Rnd() * 50) + 1
    Next iCol
    Next iRow
    oSheet.Range("A1").Resize(cNumRows, cNumCols).Value = A

    ' Make Excel Visible:
    oXL.Visible = True

    oXL.UserControl = True
    'ActiveWorkbook.Saveas("D:/VB_Test.xls")
    End Sub
    End Class

    Was nicht funktioniert, ist die Abspeicherung der Datei, den drittletzten Befehl habe ich deshalb wieder zum Kommentar gemacht. Für die Abspeicherung werde ich vorab auch auf die Befehle zur Ansicht und Veränderbarkeit verzichten können. Nun meine Fragen:

    Wie muss der Befehl/ müssen die Befehle lauten, um die Excel-Datei in einem von mir vorgegebenen Pfad abspeichern und schließen zu können?
    Letztlich soll die Abspeicherung der Matrixelemente nach folgendem Muster geschehen: Zelle A1=Größe der Matrix n, Zelle B1=Erstelldatum der Datei, Ab Zelle A2 Ablage der Matrixelemente.

    Wie muss die Prozedur im umgekehrten Fall lauten, wenn ich die abgespeicherten Daten in VB wieder einlesen möchte?

    Vielen Dank für Eure Hilfe!

    LG
    Thomas

    Anlegen und Auslesen von Excel-Dateien

    Hallo Philipp!

    Danke für Deine schnelle Antwort. Leider funktioniert das auch nicht (siehe Anlage!). Und wie gesagt, brauche ich auch noch den Befehl zum Schließen der Excel-Tabelle nach dem Speichern und die Prozedur für das Wiedereinladen der abgespeicherten Daten.

    LG
    Thomas
    Bilder
    • K1024_Fehlermeldung Speichern.JPG

      130,21 kB, 1.366×768, 161 mal angesehen
    Gibt es denn diese Datei "D:\//708BFA00" ... das würde ich ja sehr bezweifeln. Da ist wahrscheinlich irgentwas an deinem Pfad falsch.

    versuch mal:
    Workbook.SaveAs(Filename:="D:\VB_Test.xlsx")
    Workbook.Close()
    oXl.Quit()
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Anlegen und Auslesen von Excel-Dateien

    Hallo Shamash,

    die Datei existiert nicht, das wunderte mich ohnehin, da der Name keinen Bezug zu dem angegebenen Dateinamen hat. Aber vielleicht lag es an der Endung .xls

    Den Code habe ich geändert. Allerdings mussst ich oXL ergänzen, weil die Befehle ohne diesen Zusatz als Fehler angezeigt wurden. Leider ist das auch nicht die Lösung (siehe Anlage!)

    LG
    Thomas
    Bilder
    • K1024_Fehlermeldung-2.JPG

      119,42 kB, 1.366×768, 151 mal angesehen
    Achtung du hast einen /Frontslash statt einem \ drinnen im Pfad

    gerade gesehen - hast du in der Folge behoben

    aber warum hast du jetzt ActiveWorkbook in Workbook umbenannt - Workbook allgemein kann er nicht zuordnen => das ist eine Klasse aber kein Objekt - du könntest oBook statt Workbook probieren
    also: oXL.oBook.SaveAs....
    oder eigentlich kannst du dir dann das oXL ersparen also oBook.SaveAs

    lg Philipp

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „SG-Philipp“ ()

    Du hast den Code den du verwendest auch zu 0% verstanden kann das sein?

    Dein Workbook heist oBook

    das was du am Ende speicherst ist ein neues oXL.Woorkbook daher musst du auch das oXL davor schreiben, das hat aber an der stelle nix zu suchen.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Anlegen und Auslesen von Excel-Dateien

    Wie gesagt, bin ich gerade erst dabei, mich in VB einzuarbeiten. Die normalen Befehlsabläufe sind mir aus anderen Basicdialekten weitestgehend bekannt. Bislang hatte es aber noch nicht mit Datenaustausch von Office-Anwendungen zu tun.
    Den Sinn habe ich nun verstanden, es funktioniert aber noch immer nicht. Die erste Zeile enthält nach wie vor einen Fehler.

    LG
    Thomas
    Bilder
    • K1024_Fehlermeldung-3.JPG

      115,78 kB, 1.366×768, 139 mal angesehen
    Hier ist ein funktionierendes Beispiel das den Inhalt eines DataGridView als Excel abspeichert.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Using sfd As New SaveFileDialog
    3. sfd.Filter = "Excel-Dokument (*.xls)|*.xls"
    4. sfd.FileName = "Auswertung"
    5. Dim res As DialogResult = sfd.ShowDialog()
    6. If res = Windows.Forms.DialogResult.OK Then
    7. Dim xlApp As New Excel.Application
    8. xlApp.SheetsInNewWorkbook = 1
    9. Dim xlWorkBook As Excel.Workbook = xlApp.Workbooks.Add
    10. Dim xlWorkSheet As Excel.Worksheet = CType(xlWorkBook.Worksheets.Item(1), Excel.Worksheet)
    11. xlWorkSheet.Name = "Test"
    12. For nRow = 0 To DataGridView1.Rows.Count
    13. For nCol = 0 To DataGridView1.Columns.Count - 1
    14. If nRow = 0 Then
    15. xlWorkSheet.Cells(nRow + 1, nCol + 1) = DataGridView1.Columns(nCol).HeaderText
    16. Else
    17. xlWorkSheet.Cells(nRow + 1, nCol + 1) = DataGridView1.Rows(nRow - 1).Cells(nCol).Value
    18. End If
    19. Next nCol
    20. Next nRow
    21. xlApp.DisplayAlerts = False
    22. xlWorkBook.SaveAs(sfd.FileName, Excel.XlFileFormat.xlWorkbookDefault)
    23. xlWorkBook.Close()
    24. xlApp.Quit()
    25. End If
    26. End Using
    27. End Sub

    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Anlegen und Auslesen von Excel-Dateien

    Es bringt mir leider recht wenig, wenn ich nun einen gänzlich neuen Code erhalte, der wie man sehen kann, sofort Fehlermeldungen generiert, weil einzelne Variablen nicht definiert sind oder "Excel.Application" oder "Excel.Woorkbook" gar nicht bekannt ist.

    Wenn in meinem Beispiel bereits die Felder eines Excel-Blattes gefüllt werden, dann kann es doch nicht so schwer sein, den Code so zu ergänzen, dass dieses Blatt von VB aus auch gespeichert und geschlossen wird. Oder sehe ich das falsch?

    LG
    Thomas
    Bilder
    • Fehlermeldung-4.jpg

      933,5 kB, 5.691×3.199, 123 mal angesehen
    Ich habe deinen Code überarbeitet. Jetzt funktioniert er.

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. Dim oXL As New Excel.Application ' Excel application
    3. Dim oBook As Excel.Workbook ' Excel workbook
    4. Dim oSheet As Excel.Worksheet ' Excel Worksheet
    5. Dim iRow As Integer ' Index variable for the current Row
    6. Dim iCol As Integer ' Index variable for the current Row
    7. Const cNumCols = 10 ' Number of points in each Series
    8. Const cNumRows = 2 ' Number of Series
    9. Dim A(0 To cNumRows + 1, 0 To cNumCols + 1) As Integer
    10. 'Start Excel and create a new workbook
    11. oBook = oXL.Workbooks.Add
    12. oSheet = CType(oBook.Worksheets.Item(1), Excel.Worksheet)
    13. ' Insert Random data into Cells for the two Series:
    14. Randomize(Now().ToOADate())
    15. For iRow = 1 To cNumRows
    16. For iCol = 1 To cNumCols
    17. A(iRow, iCol) = 50 'Int(Rnd() * 50) + 1 - Diese Berechnung habe ich nicht übernommen da das VB6 ist und in einer VB.net anwendung nix zu suchen hat.
    18. Next iCol
    19. Next iRow
    20. oSheet.Range("A1").Resize(cNumRows, cNumCols).Value = A
    21. ' Make Excel Visible:
    22. oXL.Visible = True
    23. oXL.UserControl = True
    24. oBook.SaveAs(Filename:="Y:\VB_Test.xlsx")
    25. oBook.Close()
    26. oXL.Quit()
    27. End Sub
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Anlegen und Auslesen von Excel-Dateien

    Hallo Schamash,

    erst einmal Danke für Deine Bemühungen! Ich habe den Code übernommen, den Button wieder umbenannt und den Dateipfad auf D: gelenkt, ansonsten Deine Angaben belassen.
    Wie Du sehen kannst, gibt es bereits Probleme mit den Definitionen, die die Excel-Anwendung betreffen, es werden keine Deklarationen als Excel.Application, Excel.Workbook und Excel.Worksheet erkannt. Schau Dir bitte mal die Fehlerliste unten an.
    Das Excel-Blatt kann zwar beim Ignorieren der Definitionen erstellt werden, wird aber nicht abgespeichert. Das dürfte also ein Folgefehler sein.

    Fehlt bei meinem VB nicht eine grundsätzliche Einstellung/Erweiterung, weshalb die Definitionen als fehlerhaft erkannt werden?

    LG
    Thomas
    Bilder
    • K1024_Fehlermeldung-5.JPG

      122,09 kB, 1.366×768, 127 mal angesehen
    Füg zu deinen Referenzen die Microsoft.Office.Interop-Library hinzu.

    Im Gegensatz zu dir, der du Late Binding verwendest (CreateObject), arbeiten die Kollegen hier mit Early Binding.
    Deshalb muss zur Compilezeit die Bibliothek schon bekannt sein.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo Petaod,

    über den Link konnte ich die Lösung anhand ähnlicher Themen finden! Es ging also nur um das Einfügen folgender Zeile am Anfang:

    Imports Excel = Microsoft.Office.Interop.Excel

    Merkwürdigerweise wurde diese Zeile nicht durch Projekt, Verweis hinzufügen... eingesetzt. Ich habe sie aus einem anderen Programmcode hineinkopiert.
    Nun funktioniert das Schließen und Abspeichern des Excel-Blattes. Vielen Dank schon einmal dafür!
    Wie kann ich nun umgekehrt die Daten wieder einlesen und wie beim Abspeichern in A1 n und B1 das Abspeichdatum und ab A2 die Matrix schreiben?

    LG
    Thomas