Excel Datei lässt sich nicht speichern; AutoIT Skript bricht beim öffnen der n-ten Excel Source Datei mit Fehler ab

  • Hallo AutoIT-er,

    bin neu hier und möchte mich vorweg bei all denen Bedanken die Leuten wie mir mit Rat und Tat zur Seite stehen.

    In AutoIT habe ich ein paar Probleme mit dem Transfer von Daten aus vielen Excel-Dateien in eine einzige Datei.

    Verwendung werden:
    AutoIT Version 3.3.14.0
    ScITE Version 3.5.4
    Office 2010 Pro
    Win7 Pro

    Was macht mein Skript...
    ---------------------------------------------------------
    Die Dateistruktur der Sources:
    RootDir/SourceDir/SubDir
    /SubDir
    /SubDir
    /SourceDir/SubDir
    /SubDir
    /SubDir
    /SourceDir/SubDir
    ...

    Source-Dateien:
    Die Source Dateien enthalten 1 Tabellenblatt und sind im Format .xls vorhanden.
    Auf dem Tabellenblatt sind die Daten in den Bereichen G13:G3252 und Z13:Z3252 vorhanden.

    Ziel-Datei:
    Die Datei wird bei Bedarf von einer bestehenden Vorlage kopiert und umbenannt.
    Die Ziel-Datei enthält 3 Tabellenblätter und sollte im Format .xlsx gespeichert werden, was ja nur von der Office Version und der verwendeten Vorlage abhängt. Kann jedoch auch .xls sein.
    Jedes SourceDir bekommt eine Ziel-Datei mit den Daten der 3 SubDirs.
    Die Daten jeder Datei pro SubDir schreibt das Skript in ein Tabellenblatt.

    In jedem Tabellenblatt werden 96 Spalten mit bis zu 3240 Zeilen gefüllt, wobei bei der Hälfte der Zellen der Wert multiziert wird.
    Da es zwei Versionen der Source-Dateien gibt müssen teilweise die Leeren Zellen der gelesenen Ranges entfernt werden.
    ---------------------------------------------------------


    ...oder auch nicht :^) , die Probleme

    Problem1:
    AutoIT schafft es nicht auch nur eine Excel-Datei zu speichern, es gibt aber keine Fehlermeldung.

    getestet wurden folgende Möglichkeiten:
    1, _Excel_BookSave($objTargetWorkbook)

    2, $objTargetWorkbook.Save

    3, $objTargetWorkbook.Activate
    $objTargetWorkbook.Save

    4, _Excel_Close($objTargetWorkbook)

    Problem2:
    AutoIT gibt im Output Fenster bei jeder 9. Datei, 8 Dateien = 16 Spalten erfolgreich transferiert, folgende Meldung aus und bricht ab:

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


    Spoiler anzeigen

    Hat jemand eine Idee woran das liegen könnte ?

    8 Mal editiert, zuletzt von smofax (11. August 2015 um 12:53) aus folgendem Grund: Häufig bearbeitet wegen Ansichtsproblemen des Codes.

  • Sorry, Dein Skript ist etwas umfangreich. Kannst Du das Problem mit einem kleineren Skript reproduzieren? Was Du gepostet hast, ist so ja nicht lauffähig und daher schwierig zu debuggen.

  • Hallo water,

    ich werde das Skript zusammenfassen und Source-Dateien dazugeben, dauert aber etwas. Danach hänge ich alles als 7zip Datei an.

    Einmal editiert, zuletzt von smofax (11. August 2015 um 23:25)

  • konnte jemand die Probleme ebenfalls reproduzieren oder tritt das nur bei mir auf, habe die Probleme auf 2 Rechnern.

    Ich hoffe die Beschreibungen des Ablaufs sind ausreichend.
    Versuche inzwischen einen Workaround zu schaffen.

  • Da ich noch keine echte Fehlerlösung gefunden wurden zwei einfache Workarrounds eingesetzt.

    1, Das speichern der Excel Datei wird jetzt über aktivieren des Excel-Dokuments und den Shortcut erledigt.
    2, Das Script bricht nicht mehr ab wenn in der include-Datei Excel.au3 die Zeile 227 auskommentiert wird.

    Das Script macht jetzt anstandslos was es soll.

    Falls doch jemand den "echten" Fehler findet würde ich mich über ein Echo freuen.

    lG
    Smo

  • Sorry, aber ein 650 Zeilen Skript ist einfach zu umfangreich um das Problem nachzustellen.
    Es wird keine Fehlermeldung ausgegeben, da (zumindest die UDF) über den Returnwert bzw. die Makros @error und @extended angibt, ob was falsch gelaufen ist.
    Da Du die aber nicht abfragst, läuft das Skript trotz Fehler einfach weiter. Das gilt natürlich nicht nur für _Excel_BookSave sondern für jeden anderen Befehl der UDF bzw. die direkte Verwendung von Excel Methoden.

  • hallo smofax,

    deine funktion _CloseExcelFile ist nirgends eingebunden und der aufbau der _OpenExcelFile sehr unübersichtlich.


    normalerweise ist das doch ganz einfach.

    die files in dein array laden
    ziel excel datei erstellen oder öffnen, wenn vorhanden ( fehlerabfrage einbauen)
    quell excel dateien durch eine schleife laufen lassen -> Excel datei öffnen, werte auslesen, wert in zieldatei schreiben, quelle datei schließen
    bei schleifenende ziel excel schließen
    programm excel schließen

    was willst du denn mit den ganzen IsObj Abfragen erreichen?

    If IsObj($objExcel) Then $sO1 = "Is Object"
    If IsObj($objWorkbook) Then $sO2 = "Is Object"
    If IsObj($strWorkbook) Then $sP1 = "Is Workbook"

    desweiteren benutzt du einmal zum declarieren local und dann wiederum das dim.

    Der Unterschied zwischen Dim, Local und Global ist der Gültigkeitsbereich, für den die Variablen deklariert werden:
    Dim = Wenn der Variablename nicht schon mit globalem
    Gültigleitsbereich existiert, hat die definierte Variable einen lokalen
    Gültigkeitsbereich (falls die Variable schon global existiert, so wird
    die globale Variable verwendet.)
    Global = Erzwingt globale Gültigkeit der Variablen
    Local = Erzwingt lokale Gültigkeit der Variablen, bzw. innerhalb der Funktion

    Man sollte Local oder Global anstelle von Dim verwenden, um explizit den
    Gültigkeitsbereich für die Variable / Konstante / Array festzulegen.

    gruß gmmg

    Einmal editiert, zuletzt von gmmg (17. August 2015 um 11:01)