Probleme mit Schleife und Zwischenablage

  • Hallo zusammen,

    das Script soll, wenn es mal fertig ist folgendes leisten:
    Aus einem Verzeichnis eine oder mehrere PDF-Dateien auswählen.
    Dann 1. PDF mit Adobe laden, mit der Maus wird ein Bereich markiert und per
    Hotkey einer Variablen übergeben. Das gleiche mit 2 anderen Bereichen.
    Wenn das erledigt ist, wird per Hotkey Excel gestartet und
    die Werte der Variablen werden in bestimmte Zellen geschrieben. Excel bekommt
    den gleichen Dateinamen wie die PDF-Datei und wird gespeichert.
    Und das in einer Schleife, bis alle PDF’s abgearbeitet sind.

    Jetzt habe ich folgende Probleme:
    1. Manchmal werden die Daten vom vorletzten STRG+C aus der
    Zwischenablage übergeben.
    2. Ich habe einen Denkfehler in der Schleife.
    Die Schleife lädt teilweise immer die gleiche Datei und
    das Ende der Schleife ist nicht korrekt.

    Hat jemand einen Tipp für mich?
    Ich weiss, es ist ein bisschen chaotisch, aber es ist mein erstes Script!

    Vielen Dank
    clint

    Spoiler anzeigen

    #include <File.au3>
    #include <Array.au3>
    #include <Excel.au3>

    Global $wert1, $wert2

    HotKeySet('{ESC}','Terminate') ; Esc
    HotKeySet('{F1}', 'Hilfe') ; F1
    HotKeySet('{F2}', 'OpenPDF') ; F2
    HotKeySet('{F3}', 'copy_1') ; F3
    HotKeySet('{F4}', 'copy_2') ; F4
    HotKeySet('{F5}', 'write_Excel') ; F5

    Local $sPfad = 'C:\PDF\', $sInfo = 'Ctrl oder Shift drücken um mehrere Dateien auszuwählen.'
    Local $string = FileOpenDialog($sInfo, $sPfad, "Datei (*.pdf)", 1+4)
    Global $aArray = StringSplit($string, '|', 2)
    Global $aBound = UBound($aArray)-1
    _ArrayDisplay($aArray) ; zum testen auskommentieren
    Local $Tip = ToolTip('Hotkey F2',700,1,"Programm wird ausgeführt")

    While 1
    Sleep(100)
    WEnd

    Func Terminate()
    Exit 0
    EndFunc ; Terminate

    Func Hilfe()
    MsgBox (64, "Belegung der Funktionstasten", "ESC - Abbrechen" &@CR & "F1 - Hilfe" &@CR & "F2 - PDF laden" &@CR & "F3 - Bereich 1 kopieren" &@CR & "F4 - Bereich 2 kopieren" &@CR & "F5 - Exceldatei erstellen" )
    EndFunc ; Hilfe

    Func OpenPDF()
    ConsoleWrite('Opening PDF >> '&$aArray[$aBound] &'<<'&@CRLF)
    ShellExecute($aArray[$aBound])
    Global $trim_r = StringTrimRight ($aArray[$aBound], 4) ; entfernt .pdf
    MsgBox (48, "Dateinamen bearbeiten", "geändert von '" &$aArray[$aBound] & "' nach '"&$trim_r&"'") ; zur Kontrolle aktivieren
    Sleep(50)
    WinWaitActive ("Adobe Acrobat Pro")
    If @error Then
    ConsoleWrite('ERROR Code >> '&@error & '<<'&@CRLF)
    Exit
    EndIf
    $aBound -= 1
    If $aBound = 0 Then Exit
    ConsoleWrite('PDF Opened'&@CRLF)
    EndFunc ; OpenPDF

    Func copy_1()
    Send("^c")
    $wert1 = ClipGet() ; ruft die zwischenablage ab (den Makierten test der mit Strg C in die Zwischenablage kopiert wurde)
    EndFunc ; copy_1

    Func copy_2()
    Send("^c")
    $wert2 = ClipGet() ; ruft die zwischenablage ab (den Makierten test der mit Strg C in die Zwischenablage kopiert wurde)
    EndFunc ; copy_2

    Func write_Excel()
    Local $sFilePath1 = "C:\PDF\Vorlage\Vorlage_PDF.xls" ; Diese Excel-Vorlage sollte existieren
    Global $oExcel = _ExcelBookOpen($sFilePath1)
    If @error = 1 Then
    MsgBox(0, "Error!", "Excel kann nicht gestartet werden")
    Exit
    ElseIf @error = 2 Then
    MsgBox(0, "Error!", "Vorlagendatei nicht gefunden!")
    Exit
    EndIf
    Sleep(50)
    MsgBox(0, "Wert1", "Wert1: " & $wert1 ) ; zur Kontrolle aktivieren
    MsgBox(0, "Wert2", "Wert2: " & $wert2 ) ; zur Kontrolle aktivieren
    _ExcelWriteCell($oExcel, $wert1, 4, 1)
    _ExcelWriteCell($oExcel, $wert2, 4, 3)

    $oExcel.ActiveWorkBook.SaveAs("C:\PDF\bearbeitet\" & $trim_r & ".xls")
    If Not @error Then MsgBox(0, "Erfolgreich!", "Die Datei wurde als "& $trim_r & ".xls gespeichert.", 3)
    _ExcelBookClose($oExcel, 1, 0)
    EndFunc ; write_Excel

  • Hallo clint13,

    ich denke das ein Bedienungsfehler vorliegt. Um diesen auszuschliessen habe ich das Skript etwas abgeändert:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    #include <Excel.au3>

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

    Global $wert1, $wert2

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

    HotKeySet('{ESC}', 'Terminate') ; Esc
    HotKeySet('{F1}', 'Hilfe') ; F1
    HotKeySet('{F2}', 'OpenPDF') ; F2
    HotKeySet('{F3}', 'copy_1') ; F3
    HotKeySet('{F4}', 'copy_2') ; F4
    HotKeySet('{F5}', 'write_Excel') ; F5

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

    Local $sPfad = 'C:\PDF\', $sInfo = 'Ctrl oder Shift drücken um mehrere Dateien auszuwählen.'
    Local $string = FileOpenDialog($sInfo, $sPfad, "Datei (*.pdf)", 1 + 4)
    Global $aArray = StringSplit($string, '|', 2)
    Global $aBound = UBound($aArray) - 1, $trim_r
    _ArrayDisplay($aArray) ; zum testen auskommentieren
    Local $Tip = ToolTip('Hotkey F2', 700, 1, "Programm wird ausgeführt")

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

    While 1
    Sleep(100)
    WEnd

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

    Func Terminate()
    Exit 0
    EndFunc ;==>Terminate

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

    Func Hilfe()
    MsgBox(64, "Belegung der Funktionstasten", "ESC - Abbrechen" & @CR & "F1 - Hilfe" & @CR & "F2 - PDF laden" & @CR & "F3 - Bereich 1 kopieren" & @CR & "F4 - Bereich 2 kopieren" & @CR & "F5 - Exceldatei erstellen")
    EndFunc ;==>Hilfe

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

    Func OpenPDF()
    HotKeySet('{F2}') ; F2
    ConsoleWrite($aBound & @TAB & 'Opening PDF >> ' & $aArray[$aBound] & '<<' & @CRLF)
    ShellExecute($aArray[$aBound])
    $trim_r = StringTrimRight($aArray[$aBound], 4) ; entfernt .pdf
    MsgBox(48, "Dateinamen bearbeiten", "geändert von '" & $aArray[$aBound] & "' nach '" & $trim_r & "'") ; zur Kontrolle aktivieren
    Sleep(50)
    WinWaitActive("Adobe Acrobat Pro")
    If @error Then
    ConsoleWrite('ERROR Code >> ' & @error & '<<' & @CRLF)
    Exit
    EndIf
    $aBound -= 1
    If $aBound = 0 Then Exit
    ConsoleWrite('PDF Opened ' & $aBound & @CRLF)
    HotKeySet('{F2}', 'OpenPDF') ; F2
    EndFunc ;==>OpenPDF

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

    Func copy_1()
    Send("^c")
    $wert1 = ClipGet() ; ruft die zwischenablage ab (den Makierten test der mit Strg C in die Zwischenablage kopiert wurde)
    EndFunc ;==>copy_1

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

    Func copy_2()
    Send("^c")
    $wert2 = ClipGet() ; ruft die zwischenablage ab (den Makierten test der mit Strg C in die Zwischenablage kopiert wurde)
    EndFunc ;==>copy_2

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

    Func write_Excel()
    Local $sFilePath1 = "C:\PDF\Vorlage\Vorlage_PDF.xls" ; Diese Excel-Vorlage sollte existieren
    Global $oExcel = _ExcelBookOpen($sFilePath1)
    If @error = 1 Then
    MsgBox(0, "Error!", "Excel kann nicht gestartet werden")
    Exit
    ElseIf @error = 2 Then
    MsgBox(0, "Error!", "Vorlagendatei nicht gefunden!")
    Exit
    EndIf
    Sleep(50)
    MsgBox(0, "Wert1", "Wert1: " & $wert1) ; zur Kontrolle aktivieren
    MsgBox(0, "Wert2", "Wert2: " & $wert2) ; zur Kontrolle aktivieren
    _ExcelWriteCell($oExcel, $wert1, 4, 1)
    _ExcelWriteCell($oExcel, $wert2, 4, 3)

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

    $oExcel.ActiveWorkBook.SaveAs("C:\PDF\bearbeitet\" & $trim_r & ".xls")
    If Not @error Then MsgBox(0, "Erfolgreich!", "Die Datei wurde als " & $trim_r & ".xls gespeichert.", 3)
    _ExcelBookClose($oExcel, 1, 0)
    EndFunc ;==>write_Excel

    [/autoit]

    auch sollten Globale Variablen bereits am Anfang und nicht erst innerhalb einer Funktion deklareirt werden, daher $trim_r schon oben deklariert,

    mfg autoBert

  • Danke, das funktioniert schon mit der Schleife besser.
    Ein Problem ist, wenn nur eine Datei ausgewählt wurde. Das hängt wohl mit

    Code
    StringSplit()

    zusammen.
    Bei Auswahl einer Datei hat der Index 0 als Wert den Pfad- und Dateinamen, bei Auswahl mehrerer Dateien
    hat Index 0 nur den Pfadnamen und Index 1 bis ? nur den Dateinamen.

    Was ich aber gar nicht verstehe ist das Phänomen mit der Zwischenablage. Da werden teilweise
    Bereiche von der letzten PDF-Datei übernommen. Ich habe schon mit

    Code
    ClibPut (" ")

    ein bisschen getestet,
    aber auch ohne Erfolg!
    Hab ich da einen Denkfehler?

    Danke
    clint