Excel-Zugriff über VB.NET: HRESULT 0x800A03EC beim Speichern

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

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Mabbi.

    Excel-Zugriff über VB.NET: HRESULT 0x800A03EC beim Speichern

    Ich würde das Problem gerne nochmal angehen.

    Office 2016 wird genutzt, seitdem Wechsel von 2010 auf 2016 tritt ein Fehler auf.

    Nun tritt beim Speichern einer .xlsx Datei der gleiche Fehler wie oben genannt auf, die Tabelle hat aber gar keine Makros und auch keine Formeln.
    Die .xlsx wird geladen, in einem bestimmten Tabellenblatt werden Daten ergänzt, dann sol die Tabelle wieder gespeichert werden.
    Ich prüfe vorab ob die Datei existiert oder gerade benutzt wird.
    DP_Anw_Archiv enthält den kompletten Dateipfad.

    Dies ist der Code:

    VB.NET-Quellcode

    1. Private Sub Btn_xls_Export_Click(sender As System.Object, e As System.EventArgs) Handles Btn_xls_Export.Click
    2. 'Excel-> einlesen
    3. If System.IO.File.Exists(DP_Anw_Archiv) Then
    4. If FileInUse(DP_Anw_Archiv) = False Then
    5. Try
    6. 'Variablen für Excel-Ansteuerung
    7. Dim xlApp As New Excel.Application
    8. Dim xlWorkbooks As Excel.Workbooks = xlApp.Workbooks
    9. Dim xlWorkbook = xlApp.Workbooks.Open(DP_Anw_Archiv)
    10. Dim tmp As String = ""
    11. Dim aktMonat_plus As Boolean = False
    12. With xlApp
    13. 'geladenes Tabellenbaltt bearbeiten
    14. For i As Integer = 2015 To Date.Now.Year
    15. For j As Integer = 1 To 12
    16. ' bla bla bla
    17. Next 'Monat
    18. Next 'Jahr
    19. 'Speichern xlsx
    20. .DisplayAlerts = False
    21. 'hier
    22. .Save()
    23. .Workbooks.Close()
    24. .Quit()
    25. End With
    26. Catch ex As Exception
    27. MessageBox.Show(ex.Message)
    28. End Try
    29. End If
    30. End If
    31. End Sub


    Beim .Save kommt die exception
    Google sagt dazu vieles.

    Ausgeschlossen habe ich das alte .xls, ich benutze ja .xlsx
    Zu groß kann die Tabelle auch nicht sein, die benutzte Range beeinhaltet keine großen Spalten oder Zeilennummern (alles kleiner als 200)
    Die Bearbeitung der Tabelle läuft fehlerfrei (habe ich hier auskommentiert "'bla bla bla"), wenn man in die Excel tmp-Datei reinschaut ist alles korrekt eingetragen und bis zum Ende durchgelaufen.
    Wenn ich das Datei speichern auskommentiere läuft es auch ohne Fehler durch.

    Bin ziemlich ratlos ...weis einer hier eventuell einen Lösungsansatz ?

    Vielen Dank vorab für Eure Hilfe.

    Nachtrag: Sogar wenn ich die .xlsx nur öffne und direkt wieder speichern will ohne diese zu verändern kommt der HResult Fehler.

    Nachtrag 2:

    VB.NET-Quellcode

    1. With xlApp
    2. 'solves: 0x800A03EC
    3. .Visible = False
    4. .WindowState = XlWindowState.xlMinimized


    Auch die Ergänzung zur Sichtbarkeit und dem Windowstate löst das Problem nicht (irgendwo im Netz gefunden)

    ausgelagert aus vb.net Probleme beim Excel beenden nach bearbeiten erhalte Fehler: HRESULT: 0x800A03EC ~VaporiZed

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „VaporiZed“ ()

    Was passiert, wenn Du eine neue, leere XLSX hernimmst? Was passiert, wenn Du ein unproblematisches Verzeichnis hernimmst (z.B. D:\Test, ein USB-Stick-Laufwerk, …)? Wie sicher ist, dass FileInUse korrekt arbeitet?

    btw, auch wenn's nicht fehlerrelevant ist:
    Ggf. eine If-Umkehrung verwenden, um die Übersicht zu verbessern bzw. den Code etwas zu vereinfachen.
    Boolean-Vergleiche mit True sind überflüssig und Vergleiche mit False sollte man meist umschreiben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vollzitat eines Vorposts durch Anredefunktion ersetzt ~VaporiZed
    @VaporiZed:
    Danke für die Tipps, ich arbeite konstant an Verbesserung meiner Syntax :)

    Ich habe nun mein Problem eingegrenzt und gelöst, vorerst mit einem Workaround:

    Zur Lösung:
    Ewig rumprobiert bis ich einfach mal ein leeres Excelblatt als Datei geöffnet habe und ungeändert wieder gespeichern wollte. Auch da lommt es zu dem der Hresult Fehler.
    Leider hat das Internet zu dem Fehler x-Lösungen, die ich (fast alle) vorher probiert habe und keine hat funktioniert.

    Bottom line...mit .save oder xlworkbook.saveas(Original-Pfad) ploppt der Fehler auf, auch bei einer leeren .xlsx Tabelle.

    SaveAs auf einen neuen Dateipfad funktioniert aber ohne Probleme, egal wie vollgepropft die Tabelle mit Inhalten und Farben.
    Als speichere ich nun eine temporäre Datei, wenn das erfolgreich war lösche ich das Original, kopiere die temp-Datei auf den Orginal-Pfad und lösche danach die temp-Datei.
    Das ganze mit System.IO.File.Delete oder System.IO.File.Copy


    Unbefriedigend, aber erstmal gehts.
    ich brauche das Programm täglich, also muss das so erstmal funktionieren.


    Wenn jemand das hier mit office 2016(alle Updates) zum Laufen bekommt ohne HRESULT 0x800A03EC und ohne meine Notlösung wäre das Klasse:

    VB.NET-Quellcode

    1. If Not FileInUse(Dateipfad) Then
    2. Try
    3. 'Variablen für Excel-Ansteuerung
    4. Dim xlApp As New Excel.Application
    5. Dim xlWorkbooks As Excel.Workbooks = xlApp.Workbooks
    6. Dim xlWorkbook = xlApp.Workbooks.Open(Dateipfad)
    7. Dim tmp As String = ""
    8. Dim aktMonat_plus As Boolean = False
    9. With xlApp
    10. 'Speichern xlsx
    11. .DisplayAlerts = False
    12. 'hier
    13. xlWorkbook.SaveAs(Filename:=Dateipfad)
    14. .Workbooks.Close()
    15. .Quit()
    16. End With
    17. Catch ex As Exception
    18. MessageBox.Show(ex.Message)
    19. End Try
    20. End If


    Ich benutze:

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop.Excel

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Nimm bitte mal das "DisplayAlerts = False" raus. Dann sollte Excel eine Fehlermeldung auswerfen. Du unterdrückst diese Fehlermeldung mit dem Befehl.

    Im Zweifall solltest Du bei Workbook.Save noch den Dateityp genau spezifieren:

    Visual Basic-Quellcode

    1. xlWorkbook.SaveAs(Filename:=Dateipfad, FileFormat:= 51)


    in VBA gilt

    Visual Basic-Quellcode

    1. FileFormat:= xlOpenXMLWorkbook


    Die Auflösung von _xlOpenXMLWorkbook zu 51 findest Du docs.microsoft.com/de-de/office/vba/api/excel.xlfileformat


    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „INOPIAE“ ()

    @Mabbi
    versuche es mal so...

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Try
    3. Dim xlApp As New Microsoft.Office.Interop.Excel.Application()
    4. Dim xlWb As Microsoft.Office.Interop.Excel.Workbook
    5. xlWb = xlApp.Workbooks.Open("E:\Names.xls")
    6. Dim xlSt As Microsoft.Office.Interop.Excel.Worksheet = CType(xlWb.Worksheets("Tabelle3"), Worksheet)
    7. With xlSt
    8. 'schreibe was und speichern
    9. .Range("A9").Value = "in Zelle "
    10. .Range("B9").Value = "schreibe"
    11. .Range("C9").Value = "Hi there"
    12. End With
    13. xlApp.DisplayAlerts = False
    14. xlSt.SaveAs("E:\Names.xls")
    15. xlApp.Quit()
    16. xlApp = Nothing
    17. Catch g As Exception
    18. MessageBox.Show(g.ToString)
    19. End Try
    20. End Sub