Excel Dokument sauber öffnen, auslesen und wieder schließen

  • NAbend leute,
    ich sitz mal wieder an meinem Datenbank projekt was mich schon seit nem Jahr hin und wieder beschäftigt - und eine Sache stört immer wieder für die ich glaub ich mal hilfe brauche:
    ich will ein ExcelDokument auslesen und in Arrays das Ergebnis speichern und danach excel schließen.
    Problem: wenn ich danach excel öffne schreibt er jedes mal : "excel hat die folgenden Dateien wiederhergestellt. Speichern Sie alle, die Sie behalten wollen." und das andere Problem ist, wenn während der ganzen Prozedur eine andere Excel Datei geöffnet war, wird diese auch geschlossen. Ich hab über die Forensuche auch schon vieles gefunden, aber alles samt mit Objekten und leider bekomm ich nix dafür für meinen Fall passend zurecht gerückt...

    [autoit]


    ;#include <_FileReadToArray2D_version2.au3>;diese UDF ist bearbeitet (um unterschiedlich lange spalten erkennen zu können)
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    ;#include <file2.au3> ;file2 weil standartfile fehlerhaft ist - und zwar muss Zeile 271 """For $y = 1 To $iDims""" zu """For $y = 1 To UBound($a_Array, 2)-1"""
    #include <Timers.au3>
    #Include <String.au3>
    ;#include <arraymore.au3>; Brauch ich um ein 2 dimensionales Array sortieren, erweitern oder verkürzen zu können
    #include <Excel.au3>
    ;....
    global $excelPfad = @ScriptDir&"\Namendatenbank.xlsx"
    ;....
    excel_holen()
    ;....

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

    func excel_holen()
    global $oExcel = _ExcelBookOpen($excelPfad,0,0)
    If @error = 1 or @error =2 Then
    $excelError =MsgBox(3, "Achtung!", "Das Excel-Objekt konnte nicht engelesen werden."&@lf&@lf&"Soll das Excelobjekt erstellt werden? (ohne kann nicht auf Nachnamen, Straßen oder Musterzeichen zugegriffen werden)")
    switch $excelError
    case 2 ;abbrechen
    Exit
    Case 6 ;File erstellen und speichern
    FileInstall("default_Namendatenbank.xlsx", $excelPfad)
    sleep(500)
    excel_holen()
    Case 7 ;File nicht einlesen (also dummiFile anlegen)
    global $excelmusterzeichen, $excelCity,$excelStreet,$excelLastName,$excelFirstNameF,$excelFirstNameM,$excelMaxLen[7]=[1,1,1,1,1,1,1] ;alternativzeile falls man excel einlesen auslässt
    EndSwitch
    Else
    ;TrayTip($toolname, "Excel Dokument wird eingelesen... das kann dauern", 5, 1)
    _ExcelSheetActivate($oExcel, "ACHTUNG-Wichtig")
    Global $excelMaxLen = _ExcelReadArray($oExcel,1,2,6,1,1) ;hier stehen die Zeichenbreiten in den einzelnen Excel Sheets eingetragen
    _ExcelSheetActivate($oExcel, "Vorname Mann")
    global $excelFirstNameM = _ExcelReadSheetToArray($oExcel, 1, 1,0, 1)
    _ExcelSheetActivate($oExcel, "Vorname Frau")
    global $excelFirstNameF = _ExcelReadSheetToArray($oExcel, 1, 1,0, 1)
    _ExcelSheetActivate($oExcel, "Nachname")
    global $excelLastName = _ExcelReadSheetToArray($oExcel, 1, 1,0, 1)
    _ExcelSheetActivate($oExcel, "Straße")
    global $excelStreet = _ExcelReadSheetToArray($oExcel, 1, 1,0, 1)
    _ExcelSheetActivate($oExcel, "Stadt")
    global $excelCity = _ExcelReadSheetToArray($oExcel, 1, 1,0, 1)
    _ExcelSheetActivate($oExcel, "Musterzeichen")
    global $excelmusterzeichen = _ExcelReadSheetToArray($oExcel, 1, 1,0, 1)
    local $tttemp = _ExcelBookClose($oExcel,0,0)
    if @error = 1 or @error =2 then ProcessClose("excel.exe")
    EndIf
    ProcessClose("excel.exe")
    EndFunc

    [/autoit]

    Ich möchte halt diese 7 Arbeitsblätter so in die einzelnen Arrays schreiben wie ich es bisher auch schon mache - nur halt eleganter...
    Kann mir büüüüddde jemand mit dem excelObjekt helfen? Ich weiß das es da schon etliches im Forum gibt, aber ich bekomm es nicht für mich angepasst... ?(

    danke
    PS: wenn es hilft, kann ich auch das Ganze script posten (ist aber echt lang)
    oder das Excel File anhängen um das es geht

    Für Rechtschreibfehler gibt es keinen Finderlohn!!

    Einmal editiert, zuletzt von WiDDoW (20. Juli 2013 um 14:25)

  • Das erste Problem wird dadurch verursacht, dass Du Excel mit ProcessClose "abwürgst".
    Das zweite Problem liegt daran, dass alles in einer einzigen Excel Instanz passiert.

    Lösung:
    Meine ExcelEX UDF (ist die Alpha Version eines kompletten rewrites der Excel UDF - also Vorsicht, da Änderungen jederzeit noch möglich sind).
    Für Problem 1 & 2: _Excel_Open(Parameter $bForceNew = True setzen), _Excel_BookOpen, _Excel_RangeRead, _Excel_BookClose, _Excel_Close.
    Du brauchst auch nicht jedes Sheet zu aktivieren, da die neue UDF nicht nur auf das aktive Sheet losgehen kann.

  • hey nochmal - schade das keine weiteren ideen kamen...

    aber das rewrite von der excel udf ist mir dann doch etwas zuviel beta (die Tatsache, dass sie nur mit der beta version von autoit läuft schreckt mich schon genug ab :whistling: )
    aber ich hab den fehler gefunden:
    der Excel prozess wird zu früh geschlossen ich habe jetzt noch einen sleep(500) davor gepackt - jetzt gehts

    _excelbookClose
    if $excelWasOpenBefore then
    sleep(500)
    processClose(excel.exe)
    else
    ;nix schließen weil excel händisch schon offen war
    endif

    Für Rechtschreibfehler gibt es keinen Finderlohn!!

  • Naja, immer noch nicht "schön", aber wenn's läuft ...