Script verurscht hin und wieder Fehler im Clipboard

  • Servus leute,

    also ich war dabei in kleinen Script schreiben und das Kopieren zwischen pdf und xls zu beschleunigen. Im Prinzip klappt alles auch super nur hin und wieder bekomm ich vom Acrobat, dass ein Fehler beim ugreifen auf das Clipboard aufgetreten ist.

    Spoiler anzeigen
    [autoit]


    Opt("SendKeyDelay", 1)
    Opt ("WinWaitDelay", 1)
    Opt("GUIOnEventMode", 1)
    Opt("WinTitleMatchMode", 4)
    Opt("TrayMenuMode",1)
    Opt("TrayOnEventMode", 1)

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

    #include <GUIConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>

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

    $settingsitem = TrayCreateMenu("Settings")
    $abouttray = TrayCreateItem("About")
    TrayItemSetOnEvent ($abouttray, "ABOUT")
    $shortcut = TrayCreateItem("Set Shortcut", $settingsitem)
    TrayItemSetOnEvent ($shortcut, "SETTINGS")
    $exititem = TrayCreateItem("Exit")
    TrayItemSetOnEvent ($exititem, "CLOSEClicked")
    TraySetIcon("RegisCopyScript.exe")
    TrayTip ( "Reg-IS CopyScript", "gestartet", "5")
    TraySetToolTip ("Reg-IS CopyScript")

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

    Func SETTINGS ()
    #Region ### START Koda GUI section ### Form=
    Global $Form1 = GUICreate("Shortcut", 180, 160, 193, 128)
    GUISetIcon("E:\REG-IS Archiv\_REG_IS 20090419\Favicon.ico")
    GUISetOnEvent($GUI_EVENT_CLOSE, "CloseSet")
    $CloseSet = GUICtrlCreateButton("Close", 40, 120, 97, 25, 0)
    GUICtrlSetOnEvent($CloseSet, "CloseSet")
    $SET = GUICtrlCreateButton("Set", 40, 90, 97, 25, 0)
    GUICtrlSetOnEvent($SET, "SET")
    ; $ABOUT = GUICtrlCreateButton("About", 40, 150, 97, 25, 0)
    ; GUICtrlSetOnEvent ($ABOUT, "ABOUT")
    Global $Input1 = GUICtrlCreateInput("", 75, 16, 33, 21)
    $Label1 = GUICtrlCreateLabel("alt = !", 30, 48, 30, 17)
    $Label2 = GUICtrlCreateLabel("shift = +", 30, 65, 41, 17)
    $Label3 = GUICtrlCreateLabel("strg = ^", 90, 48, 39, 17)
    $Label4 = GUICtrlCreateLabel("{F1} - {12}", 90, 65, 53, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    EndFunc

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

    ;While 1
    ;$nMsg = GUIGetMsg()
    ;Switch $nMsg

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

    ;EndSwitch
    ;WEnd

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

    While 1
    Sleep (1000)
    WEnd

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

    Func _copy () ; Das eigentliche Kopierscript
    send ("^c")
    $cache = ClipGet () ; Zwischenspeicher auslesen
    $cache = StringRegExpReplace ( $cache,@crlf, " ") ; Umbrüche entfernen
    ClipPut ( $cache ) ; Zwischenspeicher zurückschreiben
    WinActivate ("[CLASS:XLMAIN]", "")
    WinWaitActive ("[CLASS:XLMAIN]", "")
    MsgBox (48, "Cache", $cache)
    ; send ( "{F2}" )
    send ( "^v")
    ; send ( $cache )
    send ( "{ENTER}" ) ; Zelle wechseln
    WinActivate ("[CLASS:AcrobatSDIWindow]", "")
    WinWaitActive ("[CLASS:AcrobatSDIWindow]", "")
    EndFunc

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

    Func CLOSEClicked ()
    Exit
    EndFunc

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

    Func SET () ; Tastenkombination setzten
    $key = GUICtrlRead ( $Input1 )
    if $key = "" Then
    MsgBox ( 48, "Fehler", "Bitte legen sie eine Tastenkombination fest!")
    Else
    MsgBox ( 64, "Meldung", "Tastenkombination wurde gesetzt" )
    $pdfexist = winExists ("classname=AcrobatSDIWindow", "")
    if $pdfexist = 1 Then
    GUISetState(@SW_MINIMIZE)
    WinActivate ("[CLASS:AcrobatSDIWindow]", "")
    WinWaitActive ("[CLASS:AcrobatSDIWindow]", "")
    Else
    $pdfstart = MsgBox (36, "Es ist kein PDF-File geöffnet!", "Wollen sie jetzt eine Quellpdf öffnen?")

    if $pdfstart = 6 Then ;pdf-file
    GUISetState(@SW_MINIMIZE)
    ; shellexecute("acrobat.exe")
    ; WinWaitActive ("[CLASS:AcrobatSDIWindow]", "")
    ; send ("^o")
    $pdfdir = FileOpenDialog("PDF öffnen", "", "Adobe PDF Files (*.pdf)")
    if $pdfdir = "" Then
    Else

    ; MsgBox ( 1, "test", $pdfdir)
    send ( "{LWINDOWN}"&"{r}"&"{LWINUP}") ; öffnen. Ich weiß nicht die beste Lösung. Anders ging es aber nicht...
    WinWaitActive ("[CLASS:#32770]", "")
    Send ($pdfdir)
    Send ("{Enter}")
    WinWaitActive ("[CLASS:AcrobatSDIWindow]", "")
    Sleep (1000)
    EndIf
    Else

    EndIf

    EndIf

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

    $xlsexist = WinExists ("classname=XLMAIN", "") ; Das selbe Spiel mit Excel
    if $xlsexist = 1 Then
    GUISetState(@SW_MINIMIZE)
    WinActivate ("[CLASS:XLMAIN]", "")
    WinWaitActive ("[CLASS:XLMAIN]", "")
    Else
    $xlsstart = MsgBox (36, "Es ist kein Excel Tabelle geöffnet!", "Wollen sie jetzt eine Tabelle öffnen?")
    if $xlsstart = 6 Then
    GUISetState(@SW_MINIMIZE)
    $xlsdir = FileOpenDialog("XLS öffnen", "", "Excel-Datein (*.xls;*.xlsx)")
    if $xlsdir = "" Then
    Else
    send ( "{LWINDOWN}"&"{r}"&"{LWINUP}")
    WinWaitActive ("[CLASS:#32770]", "")
    Send ($xlsdir)
    Send ("{Enter}")
    WinWaitActive ("[CLASS:XLMAIN]", "")
    ; Send ("{UP}")
    Endif
    Else

    EndIf
    EndIf

    EndIf

    HotKeySet ( $key, "_copy")


    EndFunc

    Func ABOUT ()
    MsgBox ( 64, "About:", "Scriped by Daniel Glauche ([email='d.glauche@gmx.de'][/email])")
    EndFunc
    Func CloseSet ()
    GUISetState (@SW_HIDE)
    EndFunc

    [/autoit]


    [Blockierte Grafik: http://www.efc-clan.de/error.jpg]


    Das Zweite, was mit aufgefallen ist ist, dass das Script immer recht lang braucht um das OpenFileDialog für die xls zu öffnen...

    Würde auch gerne beim setzten des Shortcuts eine Automatische Tastenerkennung reinbauen. Weiß aber nicht ganz genau wie. So, dass man nicht für sift+c nicht immer "+c" eintippen muss. Sonder das man direkt die Tastenkombination, so wie mann sie dann auch gebrauchen würde (entsprechend shift halten +c) machen kann und das dann automatisch gesetzt wird. Geht das?

    p.s.: ich weiß, dass das ganze nicht auf dem höchsten Progammierniveau geschrieben ist. Bin noch nicht lang am Programmieren mit AutoIT.

    Wär dankbar für jede Hilfe oder Verbesserungsvorschläge, die ich von euch bekomm.

    Im Anhang nochmal das komplette Script

  • Irgendwie funktioniert das nicht... Alleine klappts super, wenn ich dann aber dein Codeschnipsel bei mir einbau bekomm ich jedesmal:

    F:\onevent_COM.au3 (53) : ==> Variable must be of type "Object".:
    $oExcel.ActiveCell.Value = StringRegExpReplace(ClipGet(), @CRLF, ' ')
    $oExcel^ ERROR

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

    Opt("SendKeyDelay", 1)
    Opt("WinWaitDelay", 1)
    Opt("GUIOnEventMode", 1)
    Opt("WinTitleMatchMode", 2)
    Opt("TrayMenuMode",1)
    Opt("TrayOnEventMode", 1)

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

    #include <GUIConstants.au3>
    #include <Excel.au3>

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

    ;---------------TRAYMENU-----------------------------
    $settingsitem = TrayCreateMenu("Settings")
    $abouttray = TrayCreateItem("About")
    TrayItemSetOnEvent ($abouttray, "ABOUT")
    $shortcut = TrayCreateItem("Set Shortcut", $settingsitem)
    TrayItemSetOnEvent ($shortcut, "SETTINGS")
    $exititem = TrayCreateItem("Exit")
    TrayItemSetOnEvent ($exititem, "CLOSEClicked")
    TraySetIcon("RegisCopyScript.exe")
    TrayTip ( "Reg-IS CopyScript", "gestartet", "5")
    TraySetToolTip ("Reg-IS CopyScript")
    ;----------------------------------------------------
    Global $SettingsGUI = GUICreate("Shortcut", 180, 160, 193, 128)
    GUISetIcon("E:\REG-IS Archiv\_REG_IS 20090419\Favicon.ico")
    GUISetOnEvent($GUI_EVENT_CLOSE, "Hide")
    $CloseSet = GUICtrlCreateButton("Close", 40, 120, 97, 25, 0)
    GUICtrlSetOnEvent($CloseSet, "Hide")
    $SET = GUICtrlCreateButton("Set", 40, 90, 97, 25, 0)
    GUICtrlSetOnEvent($SET, "SET")
    ; $ABOUT = GUICtrlCreateButton("About", 40, 150, 97, 25, 0)
    ; GUICtrlSetOnEvent ($ABOUT, "ABOUT")
    Global $Input1 = GUICtrlCreateInput("", 75, 16, 33, 21)
    $Label1 = GUICtrlCreateLabel("alt = !", 30, 48, 30, 17)
    $Label2 = GUICtrlCreateLabel("shift = +", 30, 65, 41, 17)
    $Label3 = GUICtrlCreateLabel("strg = ^", 90, 48, 39, 17)
    $Label4 = GUICtrlCreateLabel("{F1} - {12}", 90, 65, 53, 17)
    ;------------------SHORTCUTSETTINGS------------------

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

    Func SETTINGS ()
    #Region ### START Koda GUI section ### Form=

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

    GUISetState(@SW_SHOW, $SettingsGUI)
    #EndRegion ### END Koda GUI section ###

    EndFunc

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

    Func SET ()
    $key = GUICtrlRead ( $Input1 )
    if $key = "" Then
    MsgBox ( 48, "Fehler", "Bitte legen sie eine Tastenkombination fest!")
    Else
    MsgBox ( 64, "Meldung", "Tastenkombination wurde gesetzt" )
    $pdfexist = winExists ("[CLASS:AcrobatSDIWindow]", "")
    if $pdfexist = 1 Then
    GUISetState(@SW_MINIMIZE)
    WinActivate ("[CLASS:AcrobatSDIWindow]", "")
    WinWaitActive ("[CLASS:AcrobatSDIWindow]", "")
    Else
    $pdfstart = MsgBox (36, "Es ist kein PDF-File geöffnet!", "Wollen sie jetzt eine Quellpdf öffnen?")

    if $pdfstart = 6 Then
    GUISetState(@SW_MINIMIZE)
    $pdfdir = FileOpenDialog("PDF öffnen", "", "Adobe PDF Files (*.pdf)")
    ShellExecute ($pdfdir)
    Else

    EndIf

    EndIf

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

    $xlsexist = WinExists ("[TITLE:Microsoft Excel]", "")
    if $xlsexist = 1 Then
    GUISetState(@SW_MINIMIZE)
    WinActivate ("[CLASS:XLMAIN]", "")
    WinWaitActive ("[CLASS:XLMAIN]", "")
    Else
    $xlsstart = MsgBox (36, "Es ist kein Excel Tabelle geöffnet!", "Wollen sie jetzt eine Tabelle öffnen?")
    if $xlsstart = 6 Then
    GUISetState(@SW_MINIMIZE)
    $xlsdir = FileOpenDialog("XLS öffnen", "", "Excel-Datein (*.xls;*.xlsx)")
    ShellExecute ($xlsdir)
    Else

    EndIf
    EndIf

    EndIf

    HotKeySet ( $key, "_copy")


    EndFunc

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

    Global $oExcel = ObjGet("", "Excel.Application")

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

    While True
    Sleep (100)
    WEnd

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

    Func _copy ()
    Send('^c')
    $oExcel.ActiveCell.Value = StringRegExpReplace(ClipGet(), @CRLF, ' ')
    $oExcel.ActiveCell.Offset(1, 0).Select
    EndFunc

    Func ABOUT ()
    MsgBox ( 64, "About:", "Scriped by Daniel Glauche ([email='d.glauche@gmx.de'][/email])")
    EndFunc

    Func Hide ()
    GUISetState (@SW_HIDE)
    EndFunc

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

    Func CLOSEClicked ()
    $save = MsgBox (36, "RegisCopyScript", "Wollen sie das Exceldokument speichern?")
    if $save = 6 Then
    _ExcelBookSave($oExcel, $fAlerts = 0)
    Exit
    Else
    Exit
    EndIf
    EndFunc

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

    Hast du eine Ahnung, woran das liegt?

    • Offizieller Beitrag

    Ich hab dein Skript erst mal lesbar gestaltet und ein paar Verbesserungen vorgenommen. Es läßt sich aber noch viel mehr machen, aber ich will dir ja nicht die Arbeit wegnehmen. :P

    Der Fehler kam, weil noch nicht auf die geöffnete Excelinstanz referenziert war. Du mußt das Objekt direkt nach dem Aufruf der Exceldatei erstellen.
    Habe das jetzt mal getan. Besser wäre eigentlich, die Datei über das Excelobjekt aufzurufen. Aber so sollte es zumindest schon mal gehen.
    Achja, ein Tipp noch: gewöhn dir Leerzeilen ab. Damit nimmst du jede Übersichtlichkeit aus deinem Code. Nur Einsetzen zum deutlichen Trennen von logischen Einheiten.

    Spoiler anzeigen
    [autoit]

    Opt("SendKeyDelay", 1)
    Opt("WinWaitDelay", 1)
    Opt("GUIOnEventMode", 1)
    Opt("WinTitleMatchMode", 2)
    Opt("TrayMenuMode",1)
    Opt("TrayOnEventMode", 1)

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

    #include <GUIConstants.au3>
    #include <Excel.au3>

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

    Global $oExcel

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

    ;---------------TRAYMENU-----------------------------
    $settingsitem = TrayCreateMenu("Settings")
    $abouttray = TrayCreateItem("About")
    TrayItemSetOnEvent ($abouttray, "ABOUT")
    $shortcut = TrayCreateItem("Set Shortcut", $settingsitem)
    TrayItemSetOnEvent ($shortcut, "SETTINGS")
    $exititem = TrayCreateItem("Exit")
    TrayItemSetOnEvent ($exititem, "CLOSEClicked")
    TraySetIcon("RegisCopyScript.exe")
    TrayTip ( "Reg-IS CopyScript", "gestartet", "5")
    TraySetToolTip ("Reg-IS CopyScript")
    ;----------------------------------------------------
    Global $SettingsGUI = GUICreate("Shortcut", 180, 160, 193, 128)
    GUISetIcon("E:\REG-IS Archiv\_REG_IS 20090419\Favicon.ico")
    GUISetOnEvent($GUI_EVENT_CLOSE, "Hide")
    $CloseSet = GUICtrlCreateButton("Close", 40, 120, 97, 25, 0)
    GUICtrlSetOnEvent($CloseSet, "Hide")
    $SET = GUICtrlCreateButton("Set", 40, 90, 97, 25, 0)
    GUICtrlSetOnEvent($SET, "SET")
    ; $ABOUT = GUICtrlCreateButton("About", 40, 150, 97, 25, 0)
    ; GUICtrlSetOnEvent ($ABOUT, "ABOUT")
    Global $Input1 = GUICtrlCreateInput("", 75, 16, 33, 21)
    $Label1 = GUICtrlCreateLabel("alt = !", 30, 48, 30, 17)
    $Label2 = GUICtrlCreateLabel("shift = +", 30, 65, 41, 17)
    $Label3 = GUICtrlCreateLabel("strg = ^", 90, 48, 39, 17)
    $Label4 = GUICtrlCreateLabel("{F1} - {12}", 90, 65, 53, 17)
    ;------------------SHORTCUTSETTINGS------------------

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

    Func SETTINGS ()
    #Region ### START Koda GUI section ### Form=

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

    GUISetState(@SW_SHOW, $SettingsGUI)
    #EndRegion ### END Koda GUI section ###

    EndFunc

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

    Func SET ()
    $key = GUICtrlRead ( $Input1 )
    if $key = "" Then
    MsgBox ( 48, "Fehler", "Bitte legen sie eine Tastenkombination fest!")
    Else
    MsgBox ( 64, "Meldung", "Tastenkombination wurde gesetzt" )
    if winExists ("[CLASS:AcrobatSDIWindow]", "") = 1 Then
    GUISetState(@SW_MINIMIZE)
    WinActivate ("[CLASS:AcrobatSDIWindow]", "")
    WinWaitActive ("[CLASS:AcrobatSDIWindow]", "")
    Else
    if MsgBox (36, "Es ist kein PDF-File geöffnet!", "Wollen sie jetzt eine Quellpdf öffnen?") = 6 Then
    GUISetState(@SW_MINIMIZE)
    $pdfdir = FileOpenDialog("PDF öffnen", "", "Adobe PDF Files (*.pdf)")
    ShellExecute ($pdfdir)
    EndIf
    EndIf
    if WinExists ("[TITLE:Microsoft Excel]", "") Then
    GUISetState(@SW_MINIMIZE)
    WinActivate ("[CLASS:XLMAIN]", "")
    WinWaitActive ("[CLASS:XLMAIN]", "")
    Else
    if MsgBox (36, "Es ist kein Excel Tabelle geöffnet!", "Wollen sie jetzt eine Tabelle öffnen?") = 6 Then
    GUISetState(@SW_MINIMIZE)
    $xlsdir = FileOpenDialog("XLS öffnen", "", "Excel-Datein (*.xls;*.xlsx)")
    ShellExecute ($xlsdir)
    $oExcel = ObjGet("", "Excel.Application")
    EndIf
    EndIf
    EndIf
    HotKeySet ( $key, "_copy")
    EndFunc

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

    While True
    Sleep (100)
    WEnd

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

    Func _copy ()
    Send('^c')
    $oExcel.ActiveCell.Value = StringRegExpReplace(ClipGet(), @CRLF, ' ')
    $oExcel.ActiveCell.Offset(1, 0).Select
    EndFunc

    Func ABOUT ()
    MsgBox ( 64, "about:", "Scriped by Daniel Glauche ([email='d.glauche@gmx.de'][/email])")
    EndFunc

    Func Hide ()
    GUISetState (@SW_HIDE)
    EndFunc

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

    Func CLOSEClicked ()
    if MsgBox (36, "RegisCopyScript", "Wollen sie das Exceldokument speichern?") = 6 Then
    _ExcelBookSave($oExcel, $fAlerts = 0)
    Exit
    EndIf
    EndFunc

    [/autoit]
  • vielleicht mach ich ja irgendwas falsch aber bei mir gibts immernoch den Fehler "Variable must be of type "Object".:" Diesmal in Zeile 89.

    Was würdest du denn noch verbessern? Ich glaub meine ganze Konstruktion mit dem Abfragen, ob schon ein Excel oder pdf-file offen ist, ist nicht ganz so elegant. Ich weiß nur nicht ganz, wie man das besser löst.
    Wenns um das ganze referenzieren und Objget geht hab ich noch leider nicht so viel Ahnung. Hab mir zwar die Hilfeartikel durchgelsen, bekomms aber trotzdem nicht so ganz raus, wie das funktioniert und wie man damit arbeiten kann...

    • Offizieller Beitrag

    Ich verstehe nicht den Sinn, warum du den ganzen PDF-Kram abfragst. Du mußt doch sowieso auf das PDF-Dokument wechseln, um zu kopieren. Also welchen Sinn hat es dann vom Skript prüfen zu lassen ob das PDF offen ist? ?(
    Automatisieren ist schön und gut, aber du baust dir hier Fallen.
    Verwende doch ausschließlich mein Bsp., wie von mir beschrieben. Evtl. noch mit 'nem Fileopen-Dialog vornweg. Das funktioniert problemlos.

    Der Fehler ist derselbe. Kein Excelobjekt. Nur kann ich dazu wenig sagen, was weiß ich, wann du _copy() aufrufst.
    Aber kopier mal diese Zeile:

    [autoit]

    $oExcel = ObjGet("", "Excel.Application")

    [/autoit]


    zusätzlich nach Zeile 69. Das könnte evtl. helfen.

  • Das Ganze ist als kleines Programm gedacht, was ich Mitarbeitern in die Hand gebe, dass sie dann damit die Daten aus den PDF-Files schneller sammeln können. Das mit dem Überprüfen war eigentlich nur ein kleine Funktion um das ganze bisschen bisschen auszuschmücken. Hab sonst noch keine gescheiten Ideen. Vielleicht noch bisschen an der Optik vom ganzen GUI. Aber das ist eigenltich erstmal unwichtig. Die Funktion würde es ja gut erfüllen, wenn jetz dann alles klappt. Hast du noch kleine Tipps? Will dich aber auch nicht zu sehr beanspruchen. Aber wenns dir das ganze soviel Spaß macht wie mir... :)