Fehlersuche bei Autoit mit geöffnetem Excelfile

  • Hallo,

    Ich muss einige Exceldateien in ein Array schreiben lassen. Die Exceldateien liegen mir "unbearbeitet" vor, d.h. ich muss auslesen, was ich bekomme. Hierbei gibt es einige Zellen, die sich auf Grund einer Formel befüllen. Mir ist dabei aufgefallen, das es Zellen gibt, die Fehlerhaft sind, d.h. in der Zelle steht nur #NV und links oben das kleine Dreieck mit "Fehler: Der Wert ist nicht verfügbar".

    Wenn ich diese Felder komplett lösche und das Excel nochmals speichere, dann wird alles sauber ins Array geschrieben. Da ich diesen händischen Schritt aber nicht machen kann, wollte ich mal fragen, wie ich hier mit einer Fehlerbehandlung umgehen kann. Als erstes habe ich mal folgendes versucht, aber das haut noch gar nicht hin:

    [autoit]

    Global $aFolder = _GetFilesFolder_Rekursiv('.', 'xlsx', 0, 0); Suche XLSX Dateien ab dem Root Verzeichnis wo diese Datei hier liegt
    ;~ _ArrayDisplay($aFolder, "Gefundene XLSX Dateien")
    Local $Counter = 1; Setze Counter auf 1
    For $i = 1 To UBound($aFolder) - 1
    ;~ ConsoleWrite("Counter: " & $Counter & " " & $aFolder[$i] & @CRLF)
    Local $oExcel = _ExcelBookOpen($aFolder[$i]) ;Create new book, make it visible
    ;~ Local $iNumberOfWorksheets = $oExcel.Worksheets.Count
    ;~ MsgBox($MB_SYSTEMMODAL, "Count", "Number of sheets found = " & $oExcel.Worksheets.Count)
    _ExcelSheetActivate($oExcel, 1)
    Local $aArray = _ExcelReadSheetToArray($oExcel) ;Using Default Parameters
    If @error = 0 Then
    MsgBox(0, "Kein Fehler", "alles OK")
    EndIf
    If @error = 1 Then
    MsgBox(4096, "Fehler", "Specified object does not exist")
    EndIf
    If @error = 2 Then
    MsgBox(4096, "Fehler", "Start parameter out of range")
    EndIf
    If @error = 3 Then
    MsgBox(4096, "Fehler", "Count parameter out of range")
    EndIf
    _ArrayDisplay($aArray, "Excel ausgelesen")
    _ExcelBookClose($oExcel) ; And finally we close out
    $Counter = $Counter + 1
    Next

    [/autoit]

    Es sind *.XLSX Dateien aus Office 2013 mit AutoIt Version: 3.3.10.2.

  • Ich habe das ganze jetzt mal auf ein "_ExcelReadCell" umgeschrieben. Bei der letzten "gute" Zelle bekomme ich einen Error Code 0 noch mitgeteilt. Bei der ersten "schlechten" Zelle fliegt Autoit komplett raus, d.h. ich bekomme keinen Error Code mitgeteilt und kann somit auch nicht gegen steuern.

    Hier meine Consolenausgabe:

    [autoit]


    >Error code: 0
    Durchgang 58 :a.[email='b@def.com'][/email]
    !>16:29:49 AutoIt3.exe ended.rc:-1073741819
    +>16:29:49 AutoIt3Wrapper Finished..
    >Exit code: -1073741819 Time: 5.928

    [/autoit]

    Wie geht man in so einem Fall vor ?

    [autoit]


    For $j = 1 To 100
    Local $sExcel = _ExcelReadCell($oExcel, $j + 1, 4)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : Local $sExcel = _ExcelReadCell($oExcel, $j + 1, 4) = ' & _ExcelReadCell($oExcel, $j + 1, 4) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    If @error = 0 Then
    ConsoleWrite("Durchgang " & $j & " :" & $sExcel & @CRLF)
    Else
    MsgBox(4096, "Fehler", "Im Durchgang " & $j & " kam es zu einem Fehler!")
    EndIf
    Next

    [/autoit]

    Eigentlich dachte ich, es würde eine Messagebox erscheinen, aber zu dem Zeitpunkt ist Autoit schon "finished"

  • Du könntest mal die letzte Beta Version von AutoIt probieren. Die Excel UDF wurde komplett neu geschrieben.
    Statt _ExcelReadSheetToArray heisst die Funktion nun _Excel_RangeRead und ist 20-100 mal schneller.

  • Hallo water,

    danke für den Tip, werde ich mal versuchen.

    BTW: Bisher hatte ich mit den Beta's nicht gearbeitet, von daher eine Frage zum Include der Excel.au3. Wenn ich mein Script mit der Beta compiliere, nimmt er dann automatisch auch die Excel.au3 aus dem Betaverzeichnis, oder muss ich die speziell angeben ? Wenn ja, wie ?

  • Wenn Du für die beta kompilierst, dann werden automatisch die Beta Includes verwendet.

  • Hallo water,

    ich brauche mal dringend Deine Hilfe. Hier mal mein neuer Code. Ich lasse das mit ALT+F5 laufen, damit die Beta rangezogen wird

    [autoit]


    #include <Excel.au3>
    #include <Array.au3>
    #include <MsgBoxConstants.au3>
    #include <StringConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $aFolder = _GetFilesFolder_Rekursiv('.', 'xlsx', 0, 0); Suche XLSX Dateien ab dem Root Verzeichnis wo diese Datei hier liegt
    ;~ _ArrayDisplay($aFolder, "Gefundene XLSX Dateien")
    ;~ Local $Counter = 1; Setze Counter auf 1
    For $i = 1 To UBound($aFolder) - 1
    Local $oExcel, $oWorkbook, $aWorkbook
    $oExcel = _Excel_Open() ;Neues leeres Excel Objekt erstellen
    $oWorkbook = _Excel_BookOpen($oExcel, $aFolder[$i], False, True); gefundene Exceldatei öffnen (beschreibbar und sichtbar)
    $aWorkbook = _Excel_RangeRead($oWorkbook, 1, Default, 3, True); Lese den kompletten Range ins Array (erste Sheet, Alles, angezeigter Text, verwende _ArrayTranspose)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $aWorkbook = ' & $aWorkbook & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    _ArrayDisplay($aWorkbook, "Ergebnis aus Excel"); Zeige Inhalt vom Array
    _Excel_Close($oExcel, False, True); Schließe Excelobjekt (nichts speichern, Schließung erzwingen)
    ;~ $Counter = $Counter + 1; Counter um 1 hochzählen
    Next

    [/autoit]


    und hier die Consolenausgabe:

    [autoit]


    >"C:\MyApps\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /beta /ErrorStdOut /in "Z:\_TEMP\XFDL User\Test\FindEmail.au3" /UserParams
    +>11:57:12 Starting AutoIt3Wrapper v.2.1.4.5 SciTE v.3.3.7.0 Keyboard:00000407 OS:WIN_81/ CPU:X64 OS:X64 Environment(Language:0409)
    >Running AU3Check (3.3.11.5) from:C:\MyApps\AutoIt3\Beta input:Z:\_TEMP\XFDL User\Test\FindEmail.au3
    +>11:57:12 AU3Check ended.rc:0
    >Running:(3.3.11.5):C:\MyApps\AutoIt3\Beta\autoit3.exe "Z:\_TEMP\XFDL User\Test\FindEmail.au3"
    --> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop
    @@ Debug(14) : $aWorkbook =
    >Error code: 0
    +>11:57:13 AutoIt3.exe ended.rc:0
    +>11:57:13 AutoIt3Wrapper Finished..
    >Exit code: 0 Time: 1.821

    [/autoit]


    Mir ist klar, das ich in Zeile 14 das Array "$aWorkbook" so nicht ausgeben kann (ich weiß gerade nicht wieviel eckige Klammern ich brauche und was ich da eintragen muss), aber im Anschluss wir via "_ArrayDisplay" auch gar nichts geöffnet und das Excel schließt sich dann.

    Ich bräuchte mal ein wenig Hilfe, wie ich den Fehler besser abfangen kann (vielleicht ein wenig Codeschnipsel) - Danke

  • Habe es mal so abgeändert, aber immer noch kein Ergebnis:

    [autoit]

    #include <Excel.au3>
    #include <Array.au3>
    #include <MsgBoxConstants.au3>
    #include <StringConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $aFolder = _GetFilesFolder_Rekursiv('.', 'xlsx', 0, 0); Suche XLSX Dateien ab dem Root Verzeichnis wo diese Datei hier liegt
    ;~ _ArrayDisplay($aFolder, "Gefundene XLSX Dateien")
    ;~ Local $Counter = 1; Setze Counter auf 1
    For $i = 1 To UBound($aFolder) - 1
    Local $oExcel, $oWorkbook, $aWorkbook
    $oExcel = _Excel_Open() ;Neues leeres Excel Objekt erstellen
    $oWorkbook = _Excel_BookOpen($oExcel, $aFolder[$i], False, True); gefundene Exceldatei öffnen (beschreibbar und sichtbar)
    $aWorkbook = _Excel_RangeRead($oWorkbook, 1, Default, 3, True); Lese den kompletten Range ins Array (erste Sheet, Alles, angezeigter Text, verwende _ArrayTranspose)
    ConsoleWrite("Return value = " & $aWorkbook & @CRLF & "Value of @error is: " & @error & @CRLF & "Value of @extended is: " & @extended & @CRLF & @CRLF); Display the return value, @error and @extended value.
    _ArrayDisplay($aWorkbook, "Ergebnis aus Excel"); Zeige Inhalt vom Array
    _Excel_Close($oExcel, False, True); Schließe Excelobjekt (nichts speichern, Schließung erzwingen)
    ;~ $Counter = $Counter + 1; Counter um 1 hochzählen
    Next

    [/autoit]


    Console:

    [autoit]

    >"C:\MyApps\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /beta /ErrorStdOut /in "Z:\_TEMP\XFDL User\Test\FindEmail.au3" /UserParams
    +>12:18:01 Starting AutoIt3Wrapper v.2.1.4.5 SciTE v.3.3.7.0 Keyboard:00000407 OS:WIN_81/ CPU:X64 OS:X64 Environment(Language:0409)
    >Running AU3Check (3.3.11.5) from:C:\MyApps\AutoIt3\Beta input:Z:\_TEMP\XFDL User\Test\FindEmail.au3
    +>12:18:01 AU3Check ended.rc:0
    >Running:(3.3.11.5):C:\MyApps\AutoIt3\Beta\autoit3.exe "Z:\_TEMP\XFDL User\Test\FindEmail.au3"
    --> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop
    Return value =
    Value of @error is: 0
    Value of @extended is: 0

    [/autoit][autoit][/autoit][autoit]

    +>12:18:02 AutoIt3.exe ended.rc:0
    +>12:18:02 AutoIt3Wrapper Finished..
    >Exit code: 0 Time: 1.732

    [/autoit]
  • Bin leider ab sofort für den Rest der Woche geschäftlich unterwegs.
    Was mir aber auffällt. _Excel_Open gehört nicht in die For $i = 1 Loop. Verschieb das bitte vor die Schleife. Dasselbe gilt ür die variablendeklaration mittels Local.
    Check mal mit VarGetType, was für einen Typ $aWorkbook hat.