Syntax einer For-Schleife

  • Hallo zusammen,

    um es vorweg zu sagen, ich bin absoluter Neuling.
    Ich habe zwar einiges gelesen und auch das Forum durchforstet, aber irgendwie stehe ich auf dem Kriegsfuss
    mit der Syntax.

    Ich möchte aus einem Verzeichnis eine oder mehrere PDF-Dateien auswählen.
    Das funktioniert mit FileOpenDialog ohne Probleme.

    Jetzt möchte ich in einer Schleife eine PDF von den ausgewählten Dateien in Acrobat laden um diese weiter zuverarbeiten.
    Wenn das erledigt ist, soll über Hotkey die nächste Datei geladen werden.
    Mit der For- Schleife habe ich das Problem, nacheinander die Variable auszulesen.
    Irgendwie stehe ich auf dem Schlauch!

    Hat jemand einen Tipp für mich?

    Vielen Dank
    clint

    Einmal editiert, zuletzt von clint13 (8. Februar 2012 um 14:44)

  • Moin, also du brauchst keine Schleife dafür ^^, du möchtest dass nach jedem drücken eines Hotkeys eine Datei aufgerufen wird dass löst man also mit einer Funktion zb so

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    Local $aArray[3] = ["C:\PDF\001.pdf","C:\PDF\002.pdf","C:\PDF\003.pdf"] ; hier kommen die Einträge dann druch deinen FileOpenDialog in Verbinduzng mit einem _ArrayAdd oder einem ReDim
    Local $aBound = UBound($aArray)-1
    HotKeySet('{F10}','_OpenPDF')

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

    While 1
    Sleep(100)
    WEnd

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

    Func _OpenPDF()
    ConsoleWrite('Opening PDF >> '&$aArray[$aBound] &'<<'&@CRLF)
    ShellExecute($aArray[$aBound])
    If @error Then
    ConsoleWrite('ERROR Code >> '&@error & '<<'&@CRLF)
    Exit
    EndIf
    $aBound -= 1
    ConsoleWrite('PDF Opened'&@CRLF)
    EndFunc

    [/autoit]
  • Hallo Protex,

    danke für den interessanten Tipp.
    Den werde ich gleich einmal versuchen umzusetzen.

    Viele Grüße
    clint

  • Hallo,

    das laden der Dateien funktioniert soweit ganz gut, nur wenn alle Dateien abgearbeitet sind erscheint folgende
    Fehlermeldung:
    "Error: Array variable subscript badly formatted"

    Muss ich shellexecute in eine For-Schleife packen und das Ende des Arrays abfragen? Wie?
    Ich habe zwar schon herumexperimentiert, aber bisher ohne Erfolg.

    Vielen dank für Tipps
    clint

    Spoiler anzeigen

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

    $pfad = "C:\PDF\"
    $message = "Ctrl oder Shift drücken um mehrere Dateien auszuwählen."
    Local $string = FileOpenDialog($message, $pfad, "Datei (*.pdf)", 1 + 4)
    $trimmed = StringTrimLeft ($string, 7)

    $aArray = StringSplit($trimmed, '|', 2)
    _ArrayDisplay($aArray)

    Local $aBound = UBound($aArray)-1
    HotKeySet('{F10}','_OpenPDF')
    _ArrayAdd($aArray, $aBound)

    While 1
    Sleep(100)
    WEnd

    Func _OpenPDF()
    ConsoleWrite('Opening PDF >> '&$aArray[$aBound] &'<<'&@CRLF)
    ShellExecute($aArray[$aBound])
    If @error Then
    ConsoleWrite('ERROR Code >> '&@error & '<<'&@CRLF)
    Exit
    EndIf

    $aBound -= 1
    ConsoleWrite('PDF Opened'&@CRLF)
    EndFunc

    Exit

  • relativ weit unten bei dir im Script, füg das hier da ein wo $aBound -= 1 steht

    [autoit]

    $aBound -= 1
    If $aBound < 0 Then Exit

    [/autoit]
  • Na weil dein Script auch fast nur mist macht :D

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    HotKeySet('{F10}','_OpenPDF')

    [/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)
    Local $aArray = StringSplit($string, '|', 2)
    Local $aBound = UBound($aArray)-1
    Local $Tip = ToolTip('Smash Hotkey F10',1,1,"Programm wird ausgeführt")

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

    While 1
    Sleep(100)
    WEnd

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

    Func _OpenPDF()
    ConsoleWrite('Opening PDF >> '&$aArray[$aBound] &'<<'&@CRLF)
    ShellExecute($aArray[$aBound])
    If @error Then
    ConsoleWrite('ERROR Code >> '&@error & '<<'&@CRLF)
    Exit
    EndIf
    If $aBound = 0 Then Exit
    $aBound -= 1
    ConsoleWrite('PDF Opened'&@CRLF)
    EndFunc

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

    ist nicht komplett getestet nur kurz aber sollte laufen

    Gruß Marvin

  • @Protex
    Dein Script kann nicht laufen, weil du $array und $aBound lokal deklarierst, aber in einer Funktion nutzt ;)

  • OK sagen wir, es ist unsauber geschrieben ;)

    Es werden Lokale Variablen im Haupstscript deklariert, das ist Blödsinn, da Lokale Variablen in Funktionen genutzt werden.
    Die Lokalen Variablen werden von AutoIt automatisch in Globale Variablen gewandelt weil sie im Hauptscript stehen, sonst könntest du sie nicht in der Funktion benutzen.

    [autoit]

    HotKeySet('{F10}','_OpenPDF')

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

    _Start()

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

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

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

    While 1
    Sleep(100)
    WEnd
    EndFunc
    Func _OpenPDF()
    ConsoleWrite('Opening PDF >> '&$aArray[$aBound] &'<<'&@CRLF)
    ShellExecute($aArray[$aBound])
    If @error Then
    ConsoleWrite('ERROR Code >> '&@error & '<<'&@CRLF)
    Exit
    EndIf
    If $aBound = 0 Then Exit
    $aBound -= 1
    ConsoleWrite('PDF Opened'&@CRLF)
    EndFunc

    [/autoit]

    würde z.B. nicht klappen ;)

    $aArray und $aBound sind Globale Variablen, da sie in mehrern Funktionen genutzt werden (bei diesem Beispiel 2 Funktionen, bei dir das Haupstscript + die Funktion)

  • Moin, dann danke für die Erklärung.. habe noch nie so genau darauf gedachtet zumindest nie bei kleinen Scripts, immer nach dem Chema 'funzen solls doch nur ' ; )

    Gruß Marvin

  • Hallo,

    ich bräuchte noch einmal einen Denkanstoss!
    Wenn ich eine PDF geladen habe, möchte ich einen Bereich mit der Maus markieren und per Hotkey in eine bestimmte Zelle
    einer Vorlagendatei in Excel kopieren, danach in die gleiche PDF-Datei zurück und einen weiteren Bereich markieren und auch per Hotkey in einer anderen Zelle der gleichen Exceldatei kopieren.
    Dann soll die Exceldatei mit dem selben Namen der PDF abgespeichert werden.
    Beide Dateien werden in ein festgelegtes Verzeichnis verschoben bzw. abgespeichert.

    Jetzt kommt die nächste PDF an die Reihe und das gleiche Prozedere bis alle ausgewählten PDF abgearbeitet sind.

    Wie kann ich in eine bestimmte Zelle in Excel ansprechen, wenn ich mit

    Code
    Send("^v")

    Daten einfügen will?

    Weiterhin kämpfe ich mit der Schleife, um die einzelnen Schritte ordnungsgemäß abzuarbeiten.
    Der Code sieht für Euch sicherlich schlimm aus, aber ich habe einiges ausprobiert und gewisse Dinge klappen auch mehr schlecht als recht.

    Sorry, es ist mein erstes Script.

    Vielen Dank
    clint

    Spoiler anzeigen

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

    HotKeySet('{ESC}', 'Terminate') ; Esc
    HotKeySet('{F2}','_OpenPDF') ; F2
    HotKeySet('{F3}', 'copy_B1') ; F3
    HotKeySet('{F4}', 'copy_B2') ; F4

    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
    Local $Tip = ToolTip('Smash Hotkey F2',700,1,"Programm wird ausgeführt")

    While 1
    Sleep(100)
    WEnd

    Func Terminate()
    Exit 0
    EndFunc ; Terminate

    Func _OpenPDF()
    ConsoleWrite('Opening PDF >> '&$aArray[$aBound] &'<<'&@CRLF)
    ShellExecute($aArray[$aBound])
    WinWaitActive ("Adobe Acrobat Pro")
    If @error Then
    ConsoleWrite('ERROR Code >> '&@error & '<<'&@CRLF)
    Exit
    EndIf
    If $aBound = 0 Then Exit
    $aBound -= 1
    ConsoleWrite('PDF Opened'&@CRLF)
    EndFunc ; _OpenPDF

    Func copy_B1()
    Send("^c")
    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)
    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)
    _ExcelWriteCell($oExcel, "Test copy_B1 geschrieben!", 7, 1) ; nur zum Testen
    Send("^v")

    EndFunc ; copy_B1

    Func copy_B2()
    Send("^c")

    Sleep(50)
    Send("^v")
    _ExcelWriteCell($oExcel, "Test copy_B2 geschrieben!", 17, 1) ; nur zum Testen

    _ExcelBookSaveAs($oExcel, @ScriptDir & "\SaveAsExample", "xls")
    If Not @error Then MsgBox(0, "Erfolgreich!", "Die Datei wurde gespeichert.", 3)
    _ExcelBookClose($oExcel, 1, 0)
    FileMove($aArray[$aBound], "C:\PDF\bearbeitet\") ; verschiebt bearbeitete .PDF
    EndFunc ; copy_B2

  • Servous, also ich würde es so lösen dass jedes mal ein Array erweitert wird in dass die Daten geschrieben werden und beim schließen des PDF soll dass Array in die Exel Datei geschrieben werden

    Spoiler anzeigen
    [autoit]


    ; ***************************************************************
    ; Example 1 - After opening a workbook and returning its object identifier. Declare an Array, then input the Array
    ; *****************************************************************

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

    #include <Excel.au3>

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

    Local $oExcel = _ExcelBookNew() ;Create new book, make it visible

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

    ;Declare the Array
    Local $aArray[5] = ["LocoDarwin", "Jon", "big_daddy", "DaleHolm", "GaryFrost"]

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

    _ExcelWriteArray($oExcel, 1, 1, $aArray) ; Write the Array Horizontally
    _ExcelWriteArray($oExcel, 5, 1, $aArray, 1) ; Write the Array Vertically, starting on the 5th Row

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

    MsgBox(0, "Exiting", "Press OK to Save File and Exit")
    _ExcelBookSaveAs($oExcel, @TempDir & "\Temp.xls", "xls", 0, 1) ; Now we save it into the temp directory; overwrite existing file if necessary
    _ExcelBookClose($oExcel) ; And finally we close out

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

    > aus der Autoit Hilfe

    Gruß Marvin

  • Die Idee ist nicht schlecht, weil der Wechsel zwischen den Programmen wegfällt und ich die Zellen in Excel
    ohne Probleme auswählen kann.

    Aber für mich stellt sich die große Frage, wie ich den Bereich den ich mit der Maus markiert habe in ein Array bekomme?
    MouseGetPos?

    Viele Grüße
    clint

  • Moin, also du machst eine Funktion ähnlich dieser (nur aus dem Kopf) also mehr Pseudocode^^


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

    Func _ArrayAddText()
    Send(STRG+C)
    Local $ClipGet = ClipGet() ; ruft die zwischenablage ab (den Makierten test der mit Strg C in die Zwischenablage kopiert wurde)
    _ArrayAdd($avArray,$ClipGet) ; Fügt den Text in ein Array ein

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

    ggf kannste das ganze auch mit einer Ini Datei lösen oder sonstwas :D wie du lustig bist eigentlich^^

    Gruß Marvin

  • komischerweise funktioniert das mit der Zwischenablage erst korrekt,wenn ich zweimal Send("^c") ausführe.
    Sonst holt er mir alte Daten aus der Zwischenablage. Vorher ein ClipPut(" ") hat auch nicht geholfen.

    Spoiler anzeigen

    Func _ArrayAddText()
    ;~ ClipPut(" ") ; nur zum testen
    Send("^c")
    _ArrayDisplay($avArray) ; nur zum testen
    Send("^c")
    Local $ClipGet = ClipGet() ; ruft die zwischenablage ab (den Makierten test der mit Strg C in die Zwischenablage kopiert wurde)
    _ArrayAdd($avArray,$ClipGet) ; Fügt den Text in ein Array ein
    EndFunc

  • Bevor du den Array anzeigst musst du den Text(ClipGet()) zu deinem Array hinzufügen.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Sleep(3000)
    _ArrayAddText()

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

    Func _ArrayAddText()
    Send("^c")
    Local $ClipGet = ClipGet() ; ruft die zwischenablage ab (den Makierten test der mit Strg C in die Zwischenablage kopiert wurde)
    Local $avArray[1]
    _ArrayAdd($avArray,$ClipGet) ; Fügt den Text in ein Array ein
    _ArrayDisplay($avArray) ; nur zum testen
    EndFunc

    [/autoit]
  • Danke für den Tip. Jetzt geht es. :thumbup:
    Ich hatte zwar das Array am Anfang Global definiert, aber anscheinend war da noch etwas fehlerhaft.

    Vielen Dank an alle
    clint

  • Wenn ich mehrere Dateien nacheinander aufrufe werden diese abgearbeitet bis zur letzten.
    Da gibt es einen Fehler beim speichern der Exceldatei (Zeile 80). Weil die letzte Datei nicht geladen wird, sondern noch einmal die vorletzte Die Schleife funktioniert so noch nicht so richtig.
    Genauso wenn ich nur eine Datei auswähle.

    Habt ihr vielleicht noch einen Tipp?

    Wie realisiere ich das mit dem Array am besten, wenn ich mehrere Bereiche markieren und per Hotkey jeweils in ein bestimmtes Feld in Excel kopieren möchte?

    Vielen Dank
    clint

    Spoiler anzeigen

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

    HotKeySet('{ESC}', 'Terminate') ; Esc
    HotKeySet('{F1}', 'Hilfe') ; F1
    HotKeySet('{F2}', '_OpenPDF') ; F2
    HotKeySet('{F3}', 'copy_Titel') ; F3
    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)

    $trimmed = StringTrimLeft($string, 7) ; schneidet den Pfad C:\PDF ab ( 7 Stellen)
    ;~ MsgBox (0, "TRIMMED", "Trimed from '" &$string & "' to '"&$trimmed&"'") ; zum testen auskommentieren
    Global $aArray = StringSplit($string, '|', 2)
    Global $aBound = UBound($aArray) - 1
    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 - Tiel kopieren" & @CR & " F5 - Exceldatei erstellen")
    EndFunc ;==>Hilfe

    Func _OpenPDF()
    ConsoleWrite('Opening PDF >> ' & $aArray[$aBound] & '<<' & @CRLF)
    ShellExecute($aArray[$aBound])
    WinWaitActive("Adobe Acrobat Pro")
    If @error = 1 Then
    MsgBox(16, "Fehler!", "Adobe Acrobat Pro kann nicht gestartet werden")
    Exit
    ElseIf @error = 2 Then
    MsgBox(16, "Fehler!", "Vorlagendatei nicht gefunden!")
    Exit
    EndIf
    If @error Then
    ConsoleWrite('ERROR Code >> ' & @error & '<<' & @CRLF)
    Exit
    EndIf
    If $aBound = 0 Then
    MsgBox(48, "Hinweis", "Letzte ausgewählte PDF-Datei wird verarbeitet!")
    Exit
    EndIf
    $aBound -= 1
    ConsoleWrite('PDF Opened' & @CRLF)
    EndFunc ;==>_OpenPDF

    Func copy_Titel()
    Send("^c")
    Local $ClipGet = ClipGet() ; ruft die Zwischenablage ab (den Makierten Text der mit Strg+C in die Zwischenablage kopiert wurde)
    Global $avArray[1]
    _ArrayAdd($avArray, $ClipGet) ; Fügt den Text in ein Array ein
    _ArrayDisplay($avArray) ; zum testen auskommentieren
    EndFunc ;==>copy_Titel

    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(16, "Fehler!", "Excel kann nicht gestartet werden")
    Exit
    ElseIf @error = 2 Then
    MsgBox(16, "Fehler!", "Vorlagendatei nicht gefunden!")
    Exit
    EndIf
    Sleep(50)
    Global $trim_r = StringTrimRight($aArray[$aBound], 4) ; entfernt .pdf
    MsgBox (48, "Dateinamen bearbeiten", "geändert von '" &$aArray[$aBound] & "' nach '"&$trim_r&"'") ; zum testen auskommentieren
    Sleep(50)
    _ArrayDisplay($avArray) ; zum testen auskommentieren
    _ExcelWriteArray($oExcel, 7, 1, $avArray)

    $oExcel.ActiveWorkBook.SaveAs("C:\PDF\bearbeitet\" & $trim_r & ".xls")

    If Not @error Then MsgBox(64, "Erfolgreich!", "Die Datei wurde gespeichert.", 1)
    _ExcelBookClose($oExcel, 1, 0)
    EndFunc ;==>write_Excel