_ExcelBookOpen (Return Values, falls das Passwort nicht stimmt)

  • Hallo!


    Sollte diese Frage bereits beantwortet worden sein, bitte ich um Entschuldigung (ich habe aber bereits die Suchfunktion benutzt)...

    Ich versuche gerade ein altes Projekt erneut in Angriff zu nehmen. Gegeben sind mehrere hundert Excel-Dokumente mit unterschiedlichen Passwörtern. Ziel ist es, diese Dokumente ohne Passwort neu abzuspeichern (-> Save As... -> ohne Passwort -> Dateiname_decrypted.xlsx).
    Wenn ich eine Datei mit gültigem Passwort öffne, ist das kein Problem. Wenn ich jedoch ein falsches Passwort "mitgebe", passiert jedoch leider gar nichts.
    Ich bekomme lediglich folgende Fehlermeldung: "D:\Excel_neu.au3 (189) : ==> The requested action with this object has failed.:" (Excel_neu.au3 -> weil ich Änderungen bezüglich xlsx und leerem Passwort beim Speichern vornehmen musste).

    Kann mir evtl. jemand weiterhelfen? Ich würde gern diesen Fehler abfagen können um entweder ein anderes Passwort zu testen, oder diese Datei einfach zu überspringen.


    P.S.: Mit dem com error Handler habe ich bereits ein wenig "rumprobiert", werde aber nicht wirklich schlau draus. Es werden nämlich direkt zwei Fehler angezeigt. hex(80020009) und hex(000000A9).
    Und selbst dann weiß ich leider nicht, wie ich diese Werte nutzen könnte...

    Vielen Dank schom mal im Voraus!

    Gruß

    • Offizieller Beitrag

    Der com-Error Handler, wie du ihn in der Hilfe findest, ist schon das richtige Instrument.
    Welche Werte die Fehler haben ist eigentlich zweitrangig. Wichtig ist, dass sie erkannt werden und du reagieren kannst ohne dass dein Programm abstürzt.
    Und wenn ich dich recht verstanden habe, treten Fehler doch nur auf, wenn du mit falschem Passwort öffnen willst.

  • Lass Dein Script mal mit der aktuellen beta Version 3.3.9.2 laufen. Da gibt es kein crashen mehr mit der Meldung "The requested action with this object has failed".
    Das Skript soll dann immer korrekt weiterlaufen und nur das Makro @error setzen. Ein COM error handler ist damit nicht mehr notwendig und erleichtert die ganze Geschichte.

  • Kann es sein, dass im Excel UDF etwas nicht stimmt?
    Wenn ich oben genanntes Script mit dem Passwort "asdf" ausführe, läuft alles super.
    Wenn ich jedoch (wie im Beispiel) ein falsches Passwort eingebe "asd1", bekomme ich gleich zwei Fehlermeldungen vom COM-Error-Handler (siehe weiter oben).
    Bei der "000000A9" Fehlermeldung erhalte ich noch zusätzlich den Text von "WinDescription is:" -> Variable must be of type 'Object'

    In der Scite-Ausgabe steht folgendes:

    >Running:(3.3.8.1):C:\Program Files (x86)\AutoIt3\autoit3.exe "D:\Excel_Known_Password_Disabler.au3"
    D:\Excel_UDF.au3 (196) : ==> Error in expression.:
    If .ActiveWorkbook.Sheets($i).Visible = $xlSheetVisible Then
    If ^ ERROR
    ->11:17:16 AutoIT3.exe ended.rc:1
    >Exit code: 1 Time: 122.884


    Mit der 3.3.9.2 beta wird jetzt zwar nicht mehr das Excel-Fenster geschlossen, dafür bekomme ich aber auch keine Fehlermeldung mehr in der Scite-Ausgabe.

    Leider finde ich auch keine Möglichkeit den Fehler "aufzufangen". Wenn ich direkt nach der Zeile mit "_ExcelBookOpen" eine MsgBox einfüge (z.B. mit @error, oder mit einem Return-Wert der Funktion), wird dieser Befehl gar nicht erst ausgeführt.

    • Offizieller Beitrag

    If .ActiveWorkbook.Sheets($i).Visible = $xlSheetVisible Then


    Die Codezeile kann nie funktionieren: If .ActiveWorkbook.Sheets($i).Visible  ;)
    Und du kannst Objekt-Fehler nicht mit "If @error..." abfangen. Diese Aufgabe übernimmt ja der Error-Handler.
    Es ist doch völlig wurscht, welchen Fehlercode du bei falschem Passwort generierst. Schreib doch die Fehlerfunktion einfach so:

    [autoit]


    Func MyErrFunc()
    ConsoleWrite('Passwortfehler bei Datei: ' & $sFilePath1 & @CRLF)
    EndFunc

    [/autoit]

    Die Variable $g_eventerror kannst du dir hier schenken. Im Fehlerfall wird die definierte Funktion (MyErrFunc) aufgerufen und gibt dir die gewünschte Info.

  • Und du kannst Objekt-Fehler nicht mit "If @error..." abfangen. Diese Aufgabe übernimmt ja der Error-Handler.

    Ab 3.3.9.2 schon. Sagt zumindest trancexx. Und die muss es wissen, pinselt sie ja an dieser Stelle im Source Code rum ;)

  • Für Skripte die ich in Produktion verwende - oder wie ein anderer User meinte: für "ernsthafte Skripte" - verwende ich auch nur die aktuelle stabile Version.
    Aber es ist immer gut zu wissen, wo die Reise hingeht und dann spiele ich nicht ungern auch schon mal mit 'ner Beta rum um zu sehen, ob das dann auch funktioniert :rolleyes:
    Grüße vom Bodensee

  • Danke schon mal für die Antworten. Bin leider noch nicht dazu gekommen, es mir genauer anzuschauen.
    Wollte nur kurz anmerken, dass "If .ActiveWorkbook.Sheets($i).Visible" im Excel.au3 drin steht.

    Bis später...

    • Offizieller Beitrag

    Wollte nur kurz anmerken, dass "If .ActiveWorkbook.Sheets($i).Visible" im Excel.au3 drin steht.


    Dann aber in einem, hier nicht sichtbaren Kontext, z.B.:

    [autoit]


    With $oExcel
    If .ActiveWorkbook.Sheets($i).Visible .....
    ;...

    [/autoit]

    ;)
    Aus diesem Grund ist es immer sinnvoll das Skript zu zeigen und nicht nur Fragmente davon.