Problem mit _Excel_BookOpen und WinAPI

  • Hallo zusammen,

    in meinem Skript soll Excel geöffnet werden (welches auf einem Netzlaufwerk liegt) und dort etwas eingetragen, gespeichert und geschlossen werden.

    Soweit alles super. Um Fehlerquellen auszuschließen habe ich nun eine Funktion eingebaut, die prüft, ob diese Excel Datei bereits geöffnet ist / in Benutzung ist (von einer anderen Person) und demnach mein Skript zu warten hat, bis der Zugriff wieder klappt.

    Hier mal ein Schnipsel, wie der Zugriff auf die Datei problemlos funktioniert:

    AutoIt
    #include <Excel.au3>
    Local $oExcelapp = _Excel_Open(True,False,True,True,True)
    Local $oExcel = _Excel_BookOpen($oExcelapp, "C:\Users\751076\Desktop\MAF.xlsx", False, True, "123")
    Sleep(3000)
    _Excel_BookClose($oExcel, True)
    _Excel_Close($oExcelapp, Default, True)


    Er öffnet Excel, lädt die Arbeitsmappe, wartet 3 Sekunden und schliesst anschliessend wieder alles. Genau soll es sein - hier gibts auch nichts zu meckern.

    Nun zum Problem. Baue ich hier vorher die Abfrage ein, ob die Datei derzeit verwendet wird und demnach zu warten hat, funktioniert zwar noch das öffnen von Excel, aber das Laden der Arbeitmappe vollzieht er nichtmehr... allerdings wirft er auch keinen Fehler aus - er tut es einfach nur nicht.

    So der modifizierte Code mit Access-Prüfung:


    Warum um Himmels Willen tut er das? Ich kann nicht nachvollziehen warum er das "_Excel_BookOpen" komplett ignoriert, obwohl es im obigen Beispiel noch wunderbar funktioniert...

    Jemand ne Idee?

    LG
    Mirko

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Ach Mensch... manchmal kann es doch so einfach sein :)

    An dem Close hat's gelegen... jetzt geht es. Werd es nachher mal mit dem "FileInUse" testen... das hatte ich in der deutschen Hilfe gar nicht gefunden - scheint nur in der englischen Hilfe vorhanden zu sein, daher ist es mir nciht aufgefallen.

    Danke @Zeitriss

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Noch ein Hinweis:
    Wenn Du eine Excel-Datei für Schreibzugriff öffnest (also Parameter $bReadOnly = False für _Excel_BookOpen) und diese Datei durch einen anderen Benutzer geöffnet ist und Du daher nur Lesezugriff bekommst, dann wird @error auf 4 (AutoIt 3.3.12.0) oder @extended auf 1 (AutoIt 3.3.15.0) gesetzt - hängt also von der AutoIt Version ab. Details in der Hilfe.

  • Ich hab nochmal etwas bezüglich dem Excel_BookOpen...

    Nachdem die Arbeitsmappe geöffnet wurde soll er natürlich in der Datei Daten einfügen. In meinem Skript beginne ich immer damit, dass in der besagten Excel-Datei eine leere Zeile eingefügt wird (und anschliessend dann die Daten).

    Ab und zu in meinen Tests bricht dort mein Skript aber ab... hier mal der Ausschnitt:


    Er bricht jedoch manchmal mein Skript ab mit dem folgenden Fehler:

    "C:\Program Files\AutoIt3\Include\Excel.au3" (227) : ==> Variable must be of type "Object".:
    $oExcel.Windows($oWorkbook.Name).Visible = $bVisible
    $oExcel.Windows($oWorkbook.Name)^ ERROR

    Ich bin der Meinung, dass er sich durch Aufruf der Zeile 7 verabschieded, weiß aber nicht warum. Manchmal sind unserer Rechner hier sehr langsam oder auch manchmal das Netzlaufwerk. Kann es sein, dass einfach die Exceldatei noch nicht vollständig geöffnet ist und er deswegen den Fehler wirft? Die Exceldatei lasse ich auf invisible starten, da der Mitarbeiter nur meine Maske ausfüllen soll, ohne jedoch die eigentliche Excel-Datei (diese dient dann als Art Datenbank). Ich hab versucht ein paar Sleeps einzubauen nach dem Excel_Open und dem Excel_BookOpen Befehl, aber der Skriptabsturz erfolgt dennoch immer mal sporadisch. Lässt sich der Fehler irgendwie abfgangen damit der User ohne Absturz des Programmes arbeiten kann?

    Sorry das ich das eigentlich fertige Thema nochmal eröffne...

    LG
    Mirko

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

    • Offizieller Beitrag

    Die Exceldatei lasse ich auf invisible starten, da der Mitarbeiter nur meine Maske ausfüllen soll, ohne jedoch die eigentliche Excel-Datei (diese dient dann als Art Datenbank).

    Es ist sicher toll, dass man mit AutoIt auf Excel zugreifen kann. Hier jedoch halte ich das für wenig sinnvoll.
    Du hast eine Excel-Datei als Datenbank und verwendest eine Maske um dort Daten abzulegen.
    Mein Tipp: Verwende dazu VBA. Du sperrst die Tabelle und läßt den User nur über die Maske interagieren.
    All die Probleme mit Zugriff regelt dann Excel alleine.

  • Verwendest Du die aktuelle Version der Fuktionen?
    https://www.autoitscript.com/forum/topic/18…r-autoit-33120/

  • @BugFix

    Leider kann ich"nur" AutiIT. Mit VBA kenn ich mich überhaupt nicht aus... auch wenn es evtl sehr ähnlich ist.... man klammert sich halt immer an dingen die man kennt bzw kann...

    @water
    Hm ich glaube nicht - ich werde das aus Deinem Post mal testen (allerdings erst morgen - bin heute nur noch im Meeting)...

    Ich melde mich dann nochmal zurück.

    LG
    Mirko

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Schön. Dann lassen wir das so :)