Wie kann ich die mausposition weiter verwenden?

  • Hallo erstmal, ich mach seit einigen tagen meine ersten gehversuche in autoit und hab auch großen spaß daran.
    jetzt bin ich allerdings auf ein problem gestoßen bei dem mich auch intensives googlen nicht weiter gebracht hat...

    erstmal zum verdeutlichen was ich überhaupt bastle: ziel ist es aus einer tabelle (navision) bestimmte zusammenhängende
    zeilen auszulesen und nach excel zu übertragen. wäre eigentlich gar nicht so schwer wenn diese zeilen immer die
    selben koordinaten hätten, es kann aber sein das ich mal ein paar zeilen aus der mitte oder dem unteren bereich der tabelle
    benötige. ich möchte nun also die maus auf der ersten benötigten zeile platzieren, per knopfdruck (hotkey?) die koordinaten
    auslesen und diese in einer schleife weiterverwenden.
    genau hier stoße ich man meine (eng gesteckten) autoit grenzen :(

    ich weiß das ich so die koordinaten der maus auslesen kann:

    [autoit]


    $pos = MouseGetPos()
    Sleep(2000)
    MsgBox(0, "Maus x,y:", $pos[0] & "," & $pos[1])

    [/autoit]


    markieren würde ich die zeilen die ich benötige dann so:

    [autoit]

    For $i= 1 to $nav

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

    Send("{CTRLDOWN}")
    Sleep (200)
    MouseClick("left", 1301, (114+$k2), 1)
    $k2=$k2+17
    Sleep (200)
    Send("{CTRLUP}")
    send("^c")

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

    $nav=$nav-1
    Next

    [/autoit]

    jetzt fehlt mir zum einen die lösung wie ich die mauskoordinaten per hotkey auslesen kann und zum andren wie ich sie dann in meiner for-schleife weiterverwende.
    ich hoffe ich konnte es einigermaßen verständlich darstellen :P

    2 Mal editiert, zuletzt von mario (13. Januar 2012 um 07:49) aus folgendem Grund: Alle Fragen beantwortet. Danke an alle die geholfen haben!!!

  • [autoit]

    HotKeySet("{F1}", "Getcoords")
    Global $Pos

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

    While 1
    If IsArray($Pos) Then
    For $i = 1 To $nav

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

    Send("{CTRLDOWN}")
    Sleep(200)
    MouseClick("left", 1301, (114 + $k2), 1)
    $k2 = $k2 + 17
    Sleep(200)
    Send("{CTRLUP}")
    Send("^c")

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

    $nav = $nav - 1
    Next
    $Pos = ""
    EndIf
    WEnd

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

    Func Getcoords()
    $Pos = MouseGetPos()
    Sleep(2000)
    MsgBox(0, "Maus x,y:", $Pos[0] & "," & $Pos[1])
    EndFunc ;==>Getcoords

    [/autoit]
  • Spoiler anzeigen
    [autoit]

    HotKeySet("o","hotkey")
    HotKeySet("e","close")

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

    While(1)
    Sleep(1)
    WEnd

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

    Func hotkey()
    $pos = MouseGetPos()
    Sleep(2000)
    MsgBox(0, "Maus x,y:", $pos[0] & "," & $pos[1])
    copy($pos[0],$pos[1])
    EndFunc

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

    Func copy($x,$y)
    Local $i
    Local $nav = 10; Anzahl Spalten
    Local $k2 = 0 ; Offset

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

    For $i= 1 to $nav ; To = normalerweiße fester Wert, du zählst diesen allerdings runter?

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

    Send("{CTRLDOWN}")
    Sleep (200)
    MouseClick("left", $x, ($y+$k2), 1) ; Maus wandert nach unten(y Koordinate)-> sollte glaube ich eher auf der X Koordinate laufen?
    $k2 += 17
    Sleep (200)
    Send("{CTRLUP}")
    send("^c")

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

    ;$nav=$nav-1
    Next

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

    EndFunc

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

    Func close()
    Exit
    EndFunc

    [/autoit]

    In etwa so..

    Da war jemand shcneller

  • wow, das ging ja schnell, vielen dank euch beiden erstmal, das ist mir schon einmal ne riesenhilfe!
    @Death:
    $nav ist die anzahl der zeilen, nicht spalten, von daher ist es schon richtig das die maus auf der y-achse wandert :)

    ziel ist es das ich noch ne kleine oberfläche draufbastle in die der anwender dann den wert, der letztendlich für $nav übernommen
    wird, eingeben kann. naja und am besten am ende noch die mausposition abhängig von der auflösung machen damit ich das nicht
    für jeden arbeitsplatz neu anpassen muss...aber das ist noch zukunftsmusik :P

    hier mal mein bisheriges werk, bin für jeden tipp dankbar, wie gesagt hab ich vor etwa einer woche erst mit autoit angefangen und
    es gibt sicher noch viel verbesserungsbedarf :)

    Spoiler anzeigen
    [autoit]

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NavisionExcelExport V 0.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;Variablendeklaration i=schleifenzähler, x=anzahl durchläufe, k/k2=NAVkoordinatensprünge, ke=Excelkoordinatensprünge,
    ;$z=zellenwechsel, $nav=anzahl der zeilen zum kopieren, $pos=mauskoordinaten

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

    Dim $i,$o, $x=4, $k=17, $ke=20, $z=2, $nav=4, $k2=17

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

    ;;;;;;;;;;;;;;;;;Notaus

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

    HotKeySet("{F1}","ende")
    Func Ende ()
    While 1
    Exit
    WEnd
    EndFunc

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

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Festlegen des startpunktes und kopieren der folgenden $nav zeilen;;; thx [email='death@autoit.de'][/email]

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

    HotKeySet("o","hotkey")
    HotKeySet("e","close")

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

    While(1)
    Sleep(1)
    WEnd

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

    Func hotkey()
    $pos = MouseGetPos()
    Sleep(2000)
    MsgBox(0, "Maus x,y:", $pos[0] & "," & $pos[1])
    copy($pos[0],$pos[1])
    EndFunc

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

    Func copy($x,$y)
    Local $i
    Local $nav = 10; Anzahl Spalten
    Local $k2 = 0 ; Offset

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

    For $i= 1 to $nav ; To = normalerweiße fester Wert, du zählst diesen allerdings runter?

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

    Send("{CTRLDOWN}")
    Sleep (200)
    MouseClick("left", $x, ($y+$k2), 1) ; Maus wandert nach unten(y Koordinate)-> sollte glaube ich eher auf der X Koordinate laufen?
    $k2 += 17
    Sleep (200)
    Send("{CTRLUP}")
    send("^c")

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

    ;$nav=$nav-1
    Next

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

    EndFunc

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

    Func close()
    Exit
    EndFunc

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Starten von Excel falls nicht schon geschehen

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

    ;~ run ("C:\Program Files\Microsoft Office\Office14\EXCEL.EXE")

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

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Einfügen des markierten in Excel via Koordinaten

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

    WinActivate("Microsoft Excel")
    MouseClick("left", 65, 192, 1)
    MouseClick("left", 70, 148, 1)
    Sleep(500)
    Send("A1")
    send("{ENTER}")
    Sleep(500)
    Send("^v")

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

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Aufrufen des Makromenüs

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

    WinActivate("Microsoft Excel")
    send("!{F8}")
    Sleep(1500)
    Send ("Formatieren")
    Send ("{ENTER}")
    Sleep(1000)
    Send ("^a")
    Send ("{DELETE}")

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Erstellen und Ausführen des Makros zum Formatieren der Spalte als Text

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

    WinWaitActive("Microsoft Visual Basic")
    Local $macro = "Sub Formatieren()" & @CRLF
    $macro &= 'Range("i1:i50").NumberFormat = "@"' & @CRLF
    $macro &= "End Sub" & @LF
    ClipPut($macro)
    Send("^v")
    Send("{F5}")
    controlclick("Makros", "&Ausführen", "Button1")
    Send("!q")

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

    ;WinActivate("BE WÜRZBURG - Microsoft Dynamics NAV Classic")

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

    ;~ ;;;;;;;;;;;;;;;;;Koordinatenschleife ------ $x = anzahl der durchläufe

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

    For $o= 1 to $x

    ;~ ;;;;;;;;;;;;;;;;;Aktivieren des NavFensters

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

    WinActivate("BE WÜRZBURG - Microsoft Dynamics NAV Classic")
    Sleep (200)
    MouseClick("left", 2158, (114+$k), 2)
    Sleep (200)
    MouseClick("left", 2158, (114+$k), 1)
    $k=$k+17
    Sleep (200)

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Markieren und Kopieren der NAV Tabelle "durchgeführte Arbeiten" via Koordinaten

    MouseClick("left", 1300, 95, 1)
    Send("^c")
    Sleep (200)
    Send ("{ESC}")
    Sleep (200)
    Send ("{ESC}")
    Sleep (200)

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Excel on top

    WinActivate("Microsoft Excel")

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Einfügen des markierten in Excel via Koordinaten

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

    MouseClick("left", 70, 148, 1)
    send("i"&$z)
    $z=$z+1
    Send ("{ENTER}")
    MouseClick("left", 260, 150, 1)
    send("^v")
    Sleep(200)
    Send ("{ENTER}")

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

    $x=$x-1
    Next

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Aufrufen des Makromenüs

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

    send("!{F8}")
    Sleep(1500)
    Send ("Bereinigen")
    Send ("{ENTER}")
    Sleep(1000)
    Send ("^a")
    Send ("{DELETE}")

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Erstellen und Ausführen des Makros zum löschen der unbenötigten Zeilen

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

    WinWaitActive("Microsoft Visual Basic")
    Local $macro = "Sub Bereinigen()" & @CRLF
    $macro &= "Dim Gesamtsring as String" & @CRLF
    $macro &= "Dim Suchstring as String" & @CRLF
    $macro &= "Dim IntSpalten as Integer" & @CRLF
    $macro &= 'Gesamtstring = "Aufgabe erldigt(DL);Erledigt;Ressourcennr.;Fakturierbar;Arbeitstypencode;Einheitencode;Privat-PKW;Preis (MW);Betrag (MW);Buchungsbelegart;Buchungsbelegnr.;Buchungsbelegzeilennr.;Buchungsdatum;Interne Bemerkung;Belegart;Belegnr.;Aufgabenzeilennr.;Verk. an Deb.-Nr.;Verk. an Name;Name;PLZ Code;Ort;Servicegebiet;Call ID;Callstatus;Artikelbeschreibung;Artikelseriennr."' & @CRLF
    $macro &= "intSpalten = Cells(1, Columns.Count).End(xlToLeft).Column" & @CRLF
    $macro &= "For I = intSpalten To 1 Step -1" & @CRLF
    $macro &= "Suchstring = Cells(1, I).Value" & @CRLF
    $macro &= "If InStr(1, Gesamtstring, Suchstring) <> 0 Then" & @CRLF
    $macro &= "Columns(I).Delete" & @CRLF
    $macro &= "End If" & @CRLF
    $macro &= "Next" & @CRLF
    $macro &= "End Sub" & @CRLF
    $macro &= "Private Sub Worksheet_Change(ByVal Target As Range)" & @CRLF
    $macro &= "Target.EntireRow.AutoFit" & @CRLF
    $macro &= "Target.EntireColumn.AutoFit" & @CRLF
    $macro &= "End Sub" & @LF
    ClipPut($macro)
    Send("^v")
    Send("{F5}")
    controlclick("Makros", "&Ausführen", "Button1")
    Send("!q")

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

    Einmal editiert, zuletzt von mario (3. Januar 2012 um 08:11)

  • da hast du natürlich recht, mir wäre es auch viel lieber das ganze anders als über koordinaten und klicks zu regeln aber navision, die anwendung aus der ich die zeilen exportieren will, ist da bemerkenswert benutzerUNfreundlich.
    in excel könnte ich die enstprechenden zeilen ja zb übers namensfeld/ name box ansprechen, in navision komm ich wirklich nur per klick in die gewünschte zeile/ zelle...
    der größte nachteil an klicks per koordinaten ist für mich die schlechte übertragbarkeit auf clients mit einer anderen bildschirmauflösung, dafür muss ich auf jeden fall noch eine lösung finden...

  • hallöchen, ich häng mal wieder fest: ich hab jetzt tagelang versucht mein script über einen button zu starten (und ich dachte das geht sicher ganz fix zu basteln :( ) und komm einfach nicht weiter...
    ziel ist es das ich starten drücke, das GUI schließt und das skript beginnt, ich übernehme per hotkey die aktuelle mausposition als startpunkt und das skript durchläuft x-mal (anzahl aus der inputbox) die schleife.
    Kann mir da noch mal jemand weiterhelfen? :rolleyes:

    GUI:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Navision2Excel = GUICreate("Navision2Excel", 601, 299, 192, 124)
    GUISetFont(10, 400, 0, "MS Sans Serif")
    GUISetBkColor(0x008080)
    $Label1 = GUICtrlCreateLabel("Bitte die Anzahl der zu exportierenden Zeilen eingeben:", 72, 24, 384, 26)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $Input1 = GUICtrlCreateInput("Export", 456, 24, 49, 24, BitOR($GUI_SS_DEFAULT_INPUT,$ES_RIGHT,$ES_NUMBER))
    $Button1 = GUICtrlCreateButton("Hier gehts zum Tutorial", 120, 104, 353, 41)
    $Button2 = GUICtrlCreateButton("Start", 120, 224, 353, 41)
    $Label2 = GUICtrlCreateLabel("Auf Start drücken, Mauszeiger auf dem Startpunkt platzieren und", 80, 168, 434, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $Label3 = GUICtrlCreateLabel("mit Tastendruck auf 'o' bestätigen.", 80, 192, 245, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    GUISetState(@SW_MINIMIZE)
    ShellExecute ("Tutorial.docx","","F:\mne\","","")
    Case $Button2
    GUISetState(@SW_HIDE)
    ;hier soll irgendwie das skript rein :(
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Skript:

    Spoiler anzeigen
    [autoit]

    HotKeySet("o","_start")
    HotKeySet("{f1}","close")

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

    While(1)
    Sleep(1)
    WEnd

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

    Func _start()
    $pos = MouseGetPos()
    Sleep(500)
    MsgBox(0, "Maus x,y:", $pos[0] & "," & $pos[1])
    copy($pos[0],$pos[1])
    EndFunc

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

    Func copy($x,$y)
    Local $i
    Local $nav = 4 ;später dann Local $nav = GUICtrlRead($input1)
    Local $k2 = 0 ;Offset

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

    For $i= 1 to $nav

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

    Send("{CTRLDOWN}")
    Sleep (1200)
    MouseClick("left", $x, ($y+$k2), 1)
    $k2 += 17
    Sleep (1200)
    Send("{CTRLUP}")
    send("^c")

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

    ;$nav=$nav-1
    Next

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

    EndFunc

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

    Func close()
    Exit
    EndFunc

    [/autoit]

    P.S.: Ich hab auch schon daran gedacht das ganze in 2 .exe zu verpacken und die .exe mit dem skript einfach über den button zu starten, bin dort aber auf das problem gestoßen das die 2. .exe zwar startet aber die hotkeys nicht zum gewünschten auslesen der mauskoords führten. (evtl läuft sie nur im hintergrund?)
    desweiteren wüßte ich bei dieser lösung nicht wie ich die angaben der inputbox aus dem GUI in die 2. .exe hole...
    fragen über fragen...

  • Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Navision2Excel = GUICreate("Navision2Excel", 601, 299, 192, 124)
    GUISetFont(10, 400, 0, "MS Sans Serif")
    GUISetBkColor(0x008080)
    $Label1 = GUICtrlCreateLabel("Bitte die Anzahl der zu exportierenden Zeilen eingeben:", 72, 24, 384, 26)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $Input1 = GUICtrlCreateInput("Export", 456, 24, 49, 24, BitOR($GUI_SS_DEFAULT_INPUT,$ES_RIGHT,$ES_NUMBER))
    $Button1 = GUICtrlCreateButton("Hier gehts zum Tutorial", 120, 104, 353, 41)
    $Button2 = GUICtrlCreateButton("Start", 120, 224, 353, 41)
    $Label2 = GUICtrlCreateLabel("Auf Start drücken, Mauszeiger auf dem Startpunkt platzieren und", 80, 168, 434, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $Label3 = GUICtrlCreateLabel("mit Tastendruck auf 'o' bestätigen.", 80, 192, 245, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    GUISetState(@SW_MINIMIZE)
    ShellExecute ("Tutorial.docx","","F:\mne\","","")
    Case $Button2
    GUISetState(@SW_HIDE)
    Losgehts()
    Exit
    EndSwitch
    WEnd

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

    Func Losgehts()
    HotKeySet("o","_start")
    HotKeySet("{f1}","close")

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

    While 1
    Sleep(10)
    WEnd
    EndFunc

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

    Func _start()
    $pos = MouseGetPos()
    Sleep(500)
    MsgBox(0, "Maus x,y:", $pos[0] & "," & $pos[1])
    copy($pos[0],$pos[1])
    EndFunc

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

    Func copy($x,$y)
    Local $i
    Local $nav = 4 ;später dann Local $nav = GUICtrlRead($input1)
    Local $k2 = 0 ;Offset

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

    For $i= 1 to $nav

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

    Send("{CTRLDOWN}")
    Sleep (1200)
    MouseClick("left", $x, ($y+$k2), 1)
    $k2 += 17
    Sleep (1200)
    Send("{CTRLUP}")
    send("^c")

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

    ;$nav=$nav-1
    Next

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

    EndFunc

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

    Func close()
    Exit
    EndFunc

    [/autoit]
  • oooh mann, einfach das ganze ding mitsamt hotkeys in eine funktion packen? :rofl: so weit war ich fast schon, wusste nur nicht wie ich die hotkeys mitnehmen kann...
    asche auf mein haupt!

    tausend dank für die schnelle hilfe!! und natürlich allen ein erfolgreiches neues jahr 2012 ;)

  • so weit so gut, jetzt dachte ich ich bin mal ganz schlau und pack den rest des skripts, wie in dem von dir verbesserten teil, auch einfach so ein (siehe unten) und ich wär mit dem gröbsten fertig...nix wars :P
    er macht schön alles bis zum zum strg+c und hört dann auf. warum? ?(
    wenn mir da jetzt nochmal jemand weiterhilft bin ich heute der glücklichste nicht-urlaub-haber würzburgs :D

    so siehts im moment aus:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Navision2Excel = GUICreate("Navision2Excel", 601, 299, 192, 124)
    GUISetFont(10, 400, 0, "MS Sans Serif")
    GUISetBkColor(0x008080)
    $Label1 = GUICtrlCreateLabel("Bitte die Anzahl der zu exportierenden Zeilen eingeben:", 72, 24, 384, 26)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $Input1 = GUICtrlCreateInput("Export", 456, 24, 49, 24, BitOR($GUI_SS_DEFAULT_INPUT,$ES_RIGHT,$ES_NUMBER))
    $Button1 = GUICtrlCreateButton("Hier gehts zum Tutorial", 120, 104, 353, 41)
    $Button2 = GUICtrlCreateButton("Start", 120, 224, 353, 41)
    $Label2 = GUICtrlCreateLabel("Auf Start drücken, Mauszeiger auf dem Startpunkt platzieren und", 80, 168, 434, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $Label3 = GUICtrlCreateLabel("mit Tastendruck auf 'o' bestätigen.", 80, 192, 245, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    GUISetState(@SW_MINIMIZE)
    ShellExecute ("Tutorial.docx","","F:\mne\","","")
    Case $Button2
    GUISetState(@SW_HIDE)
    Losgehts()
    Exit
    EndSwitch
    WEnd

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

    Func Losgehts()
    HotKeySet("o","_start")
    HotKeySet("{f1}","close")

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

    While 1
    Sleep(10)
    WEnd
    EndFunc

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

    Func _start()
    $pos = MouseGetPos()
    Sleep(500)
    MsgBox(0, "Maus x,y:", $pos[0] & "," & $pos[1])
    copy($pos[0],$pos[1])
    EndFunc

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

    Func copy($x,$y)
    Local $i
    Local $nav = GUICtrlRead($input1)
    Local $k2 = 0 ;Offset
    For $i= 1 to $nav
    Send("{CTRLDOWN}")
    Sleep (1200)
    MouseClick("left", $x, ($y+$k2), 1)
    $k2 += 17
    Sleep (1200)
    Send("{CTRLUP}")
    send("^c")
    Next
    EndFunc

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

    Func tabelle_nach_Excel()
    WinActivate("Microsoft Excel")
    MouseClick("left", 65, 192, 1)
    MouseClick("left", 70, 148, 1)
    Sleep(500)
    Send("A1")
    Send("{ENTER}")
    Sleep(500)
    Send("^v")
    EndFunc

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

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Aufrufen des Makromenüs

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

    Func macromenue_I()
    WinActivate("Microsoft Excel")
    send("!{F8}")
    Sleep(1500)
    Send ("Formatieren")
    Send ("{ENTER}")
    Sleep(1000)
    Send ("^a")
    Send ("{DELETE}")
    EndFunc

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Erstellen und Ausf¨¹hren des Makros zum Formatieren der Spalte als Text

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

    Func makro_I()
    WinWaitActive("Microsoft Visual Basic")
    Local $macro = "Sub Formatieren()" & @CRLF
    $macro &= 'Range("i1:i50").NumberFormat = "@"' & @CRLF
    $macro &= "End Sub" & @LF
    ClipPut($macro)
    Send("^v")
    Send("{F5}")
    controlclick("Makros", "&Ausführen", "Button1")
    Send("!q")
    EndFunc

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

    ;WinActivate("BE W¨¹RZBURG - Microsoft Dynamics NAV Classic")

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

    ;~ ;;;;;;;;;;;;;;;;;Koordinatenschleife ------ $x = anzahl der durchläufe

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

    Func zelleninhalt_DA()
    Local $k2 = 0
    Local $z = 0
    For $o= 1 to GUICtrlRead($input1)

    ;~ ;;;;;;;;;;;;;;;;;Aktivieren des NavFensters

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

    WinActivate("BE WÜRZBURG - Microsoft Dynamics NAV Classic")
    Sleep (200)
    MouseClick("left", 2158, (114+$k2), 2)
    Sleep (200)
    MouseClick("left", 2158, (114+$k2), 1)
    $k2=$k2+17
    Sleep (200)

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Markieren und Kopieren der NAV Tabelle "durchgeführte Arbeiten" via Koordinaten

    MouseClick("left", 1300, 95, 1)
    Send("^c")
    Sleep (200)
    Send ("{ESC}")
    Sleep (200)
    Send ("{ESC}")
    Sleep (200)

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Excel on top

    WinActivate("Microsoft Excel")

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Einf¨¹gen des markierten in Excel via Koordinaten

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

    MouseClick("left", 70, 148, 1)
    send("i"&$z)
    $z=$z+1
    Send ("{ENTER}")
    MouseClick("left", 260, 150, 1)
    send("^v")
    Sleep(200)
    Send ("{ENTER}")

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

    $k2=$k2-1
    Next
    EndFunc

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Aufrufen des Makromenues

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

    Func makromenue_II()
    send("!{F8}")
    Sleep(1500)
    Send ("Bereinigen")
    Send ("{ENTER}")
    Sleep(1000)
    Send ("^a")
    Send ("{DELETE}")
    EndFunc

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Erstellen und Ausf¨¹hren des Makros zum l?schen der unben?tigten Zeilen

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

    Func makro_II()
    WinWaitActive("Microsoft Visual Basic")
    Local $macro = "Sub Bereinigen()" & @CRLF
    $macro &= "Dim Gesamtsring as String" & @CRLF
    $macro &= "Dim Suchstring as String" & @CRLF
    $macro &= "Dim IntSpalten as Integer" & @CRLF
    $macro &= 'Gesamtstring = "Aufgabe erldigt(DL);Erledigt;Ressourcennr.;Fakturierbar;Arbeitstypencode;Einheitencode;Privat-PKW;Preis (MW);Betrag (MW);Buchungsbelegart;Buchungsbelegnr.;Buchungsbelegzeilennr.;Buchungsdatum;Interne Bemerkung;Belegart;Belegnr.;Aufgabenzeilennr.;Verk. an Deb.-Nr.;Verk. an Name;Name;PLZ Code;Ort;Servicegebiet;Call ID;Callstatus;Artikelbeschreibung;Artikelseriennr."' & @CRLF
    $macro &= "intSpalten = Cells(1, Columns.Count).End(xlToLeft).Column" & @CRLF
    $macro &= "For I = intSpalten To 1 Step -1" & @CRLF
    $macro &= "Suchstring = Cells(1, I).Value" & @CRLF
    $macro &= "If InStr(1, Gesamtstring, Suchstring) <> 0 Then" & @CRLF
    $macro &= "Columns(I).Delete" & @CRLF
    $macro &= "End If" & @CRLF
    $macro &= "Next" & @CRLF
    $macro &= "End Sub" & @CRLF
    $macro &= "Private Sub Worksheet_Change(ByVal Target As Range)" & @CRLF
    $macro &= "Target.EntireRow.AutoFit" & @CRLF
    $macro &= "Target.EntireColumn.AutoFit" & @CRLF
    $macro &= "End Sub" & @LF
    ClipPut($macro)
    Send("^v")
    Send("{F5}")
    controlclick("Makros", "&Ausf¨¹hren", "Button1")
    Send("!q")
    EndFunc

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

    Func close()
    Exit
    EndFunc

    [/autoit]
  • Naja, geh mal deine Funktionen durch ;)

    1. Gui kommt.
    2. Bei Klick auf Button kommt die Funktion Losgehts()
    Dadurch kann man 2 Funktionen starten:
    _start und _close

    bei start wieder dann copy aufgerufen, bei close nur Exit.

    Deine anderen Funktionen werden nie aufgerufen, es sind unnütze Funktionen (zumindest für den Compiler)

  • ahhh ok, jetzt verstehe ich das schon besser, ich müsste die anderen also irgendwie in die funktion losgehts() einbauen oder?
    sehe auch gerade das ich das alles in viel zu viele funktionen aufgeteilt habe, das kann ich sicher noch kräftig zusammenfassen...

    mal sehen ob ich es schaffe das in die erste funktion zu basteln bzw. sinnvoll zu verketten...ist auf jeden fall ein guter denkanstoß und ich bin mal
    wieder zu dank verpflichtet :D

  • am besten nicht alles jetzt in eine funktion packen, du kannst doch deine vorhanden funktionen am ende der copy funktion aufrufen

  • guten morgen die damen und herren :)
    ich habe meine funktionen jetzt halbwegs sinnvoll zusammengefasst und verkettet, funktioniert soweit, dank eurer kräftigen unterstützung (!), auch wunderbar bis auf eine (hoffentlich) letzte sache und zwar:
    etwas weiter unten im skript habe ich eine zweite schleife die aus den vorher schon kopierten zeilen noch den inhalt einer tabelle, die hinter einer zelle liegt, abgreift.
    ist es möglich hier die Y-koordinate, die ich anfangs in der funktion _start erfasst habe, noch einmal aufzugreifen?
    zur besseren übersicht hier nochmal die zweite schleife separat:

    Spoiler anzeigen
    [autoit]

    Func zelleninhalt_DA()
    Local $k2 = 0
    Local $z = 2
    For $o= 1 to GUICtrlRead($input1)

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

    ;~ ;;;;;;;;;;;;;;;;;Aktivieren des NavFensters und der Zelle DA

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

    WinActivate("BE WÜRZBURG - Microsoft Dynamics NAV Classic")
    Sleep (200)
    MouseClick("left", 2158, (131+$k2), 2) ;genau hier benötige ich die mausposition die ich anfangs per hotkey erfasse.
    Sleep (200)
    MouseClick("left", 2158, (131+$k2), 1) ;und hier dann auch.
    $k2=$k2+17
    Sleep (200)

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

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Markieren und Kopieren der NAV Tabelle "Durchgefuehrte Arbeiten" via Koordinaten

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

    MouseClick("left", 1300, 95, 1)
    Send("^c")
    Sleep (200)
    Send ("{ESC}")
    Sleep (200)
    Send ("{ESC}")
    Sleep (200)

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

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Excel on top

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

    WinActivate("Microsoft Excel")

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

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Einfuegen des markierten in Excel via Koordinaten

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

    MouseClick("left", 70, 148, 1)
    send("i"&$z)
    $z=$z+1
    Send ("{ENTER}")
    MouseClick("left", 260, 150, 1)
    send("^v")
    Sleep(200)
    Send ("{ENTER}")

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

    Next
    makromenue_II()
    EndFunc

    [/autoit]

    und der aktuelle stand des skripts:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Navision2Excel = GUICreate("Navision2Excel", 601, 299, 192, 124)
    GUISetCursor (0)
    GUISetIcon("F:\mne\Retro-Mario.ico", -1)
    GUISetFont(10, 400, 0, "MS Sans Serif")
    GUISetBkColor(0xFFFFFF)
    $Label1 = GUICtrlCreateLabel("Bitte die Anzahl der zu exportierenden Zeilen eingeben:", 72, 64, 384, 26)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUICtrlSetCursor (-1, 0)
    $Input1 = GUICtrlCreateInput("Export", 456, 64, 49, 24, BitOR($GUI_SS_DEFAULT_INPUT,$ES_RIGHT,$ES_NUMBER))
    GUICtrlSetCursor (-1, 0)
    $Button1 = GUICtrlCreateButton("Hier gehts zum Tutorial", 120, 104, 353, 41)
    GUICtrlSetCursor (-1, 0)
    $Button2 = GUICtrlCreateButton("Start", 120, 216, 353, 41)
    GUICtrlSetCursor (-1, 0)
    $Label2 = GUICtrlCreateLabel("Auf Start klicken, Mauszeiger auf dem Startpunkt platzieren und", 80, 160, 434, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUICtrlSetCursor (-1, 0)
    $Label3 = GUICtrlCreateLabel("mit Tastendruck auf Leertaste bestätigen.", 80, 184, 245, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUICtrlSetCursor (-1, 0)
    $Pic1 = GUICtrlCreatePic("F:\mne\Bechtle_NEU_rgb.jpg", 536, 8, 57, 49)
    GUISetState(@SW_SHOW)
    GUICtrlSetCursor (-1, 0)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    GUISetState(@SW_MINIMIZE)
    ShellExecute ("Tutorial.docx","","F:\mne\","","")
    Case $Button2
    GUISetState(@SW_HIDE)
    Losgehts()
    ;Exit
    EndSwitch
    WEnd

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

    Func Losgehts()
    HotKeySet("{SPACE}","_start")
    HotKeySet("{F1}","close")

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

    While 1
    Sleep(10)
    WEnd
    EndFunc

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

    Func _start()
    $pos = MouseGetPos()
    Sleep(500)
    ;MsgBox(0, "Maus x,y:", $pos[0] & "," & $pos[1])
    copy($pos[0],$pos[1])
    EndFunc

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

    Func copy($x,$y)
    Local $i
    Local $nav = GUICtrlRead($input1)
    Local $k2 = 0 ;Offset
    For $i= 1 to $nav
    Send("{CTRLDOWN}")
    Sleep (1200)
    MouseClick("left", $x, ($y+$k2), 1)
    $k2 += 17
    Sleep (1200)
    Send("{CTRLUP}")
    send("^c")
    Next
    tabelle_nach_Excel()
    EndFunc

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

    Func tabelle_nach_Excel()
    WinActivate("Microsoft Excel")
    MouseClick("left", 65, 192, 1)
    MouseClick("left", 70, 148, 1)
    Sleep(500)
    Send("A1")
    Send("{ENTER}")
    Sleep(500)
    Send("^v")
    macromenue_I()
    EndFunc

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

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Aufrufen des Makromenüs

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

    Func macromenue_I()
    WinActivate("Microsoft Excel")
    send("!{F8}")
    Sleep(1500)
    Send ("Formatieren")
    Send ("{ENTER}")
    Sleep(1000)
    Send ("^a")
    Send ("{DELETE}")
    WinWaitActive("Microsoft Visual Basic")
    Local $macro = "Sub Formatieren()" & @CRLF
    $macro &= 'Range("i1:i50").NumberFormat = "@"' & @CRLF
    $macro &= "End Sub" & @LF
    ClipPut($macro)
    Send("^v")
    Send("{F5}")
    controlclick("Makros", "&Ausführen", "Button1")
    Send("!q")
    zelleninhalt_DA()
    EndFunc

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

    ;WinActivate("BE WUERZBURG - Microsoft Dynamics NAV Classic")

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

    ;~ ;;;;;;;;;;;;;;;;;Koordinatenschleife ------ $x = anzahl der durchläufe

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

    Func zelleninhalt_DA()
    Local $k2 = 0
    Local $z = 2
    For $o= 1 to GUICtrlRead($input1)

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

    ;~ ;;;;;;;;;;;;;;;;;Aktivieren des NavFensters und der Zelle DA

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

    WinActivate("BE WÜRZBURG - Microsoft Dynamics NAV Classic")
    Sleep (200)
    MouseClick("left", 2158, (131+$k2), 2) ;genau hier benötige ich die mausposition die ich anfangs per hotkey erfasse.
    Sleep (200)
    MouseClick("left", 2158, (131+$k2), 1) ;und hier dann auch.
    $k2=$k2+17
    Sleep (200)

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

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Markieren und Kopieren der NAV Tabelle "Durchgefuehrte Arbeiten" via Koordinaten

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

    MouseClick("left", 1300, 95, 1)
    Send("^c")
    Sleep (200)
    Send ("{ESC}")
    Sleep (200)
    Send ("{ESC}")
    Sleep (200)

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

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Excel on top

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

    WinActivate("Microsoft Excel")

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

    ;~ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Einfuegen des markierten in Excel via Koordinaten

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

    MouseClick("left", 70, 148, 1)
    send("i"&$z)
    $z=$z+1
    Send ("{ENTER}")
    MouseClick("left", 260, 150, 1)
    send("^v")
    Sleep(200)
    Send ("{ENTER}")

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

    Next
    makromenue_II()
    EndFunc

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Aufrufen des Makromenues

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

    Func makromenue_II()
    send("!{F8}")
    Sleep(1500)
    Send ("Bereinigen")
    Send ("{ENTER}")
    Sleep(1000)
    Send ("^a")
    Send ("{DELETE}")
    WinWaitActive("Microsoft Visual Basic")
    Local $macro = "Sub Bereinigen()" & @CRLF
    $macro &= "Dim Gesamtsring as String" & @CRLF
    $macro &= "Dim Suchstring as String" & @CRLF
    $macro &= "Dim IntSpalten as Integer" & @CRLF
    $macro &= 'Gesamtstring = "Aufgabe erldigt(DL);Erledigt;Ressourcennr.;Fakturierbar;Arbeitstypencode;Einheitencode;Privat-PKW;Preis (MW);Betrag (MW);Buchungsbelegart;Buchungsbelegnr.;Buchungsbelegzeilennr.;Buchungsdatum;Interne Bemerkung;Belegart;Belegnr.;Aufgabenzeilennr.;Verk. an Deb.-Nr.;Verk. an Name;Name;PLZ Code;Ort;Servicegebiet;Call ID;Callstatus;Artikelbeschreibung;Artikelseriennr."' & @CRLF
    $macro &= "intSpalten = Cells(1, Columns.Count).End(xlToLeft).Column" & @CRLF
    $macro &= "For I = intSpalten To 1 Step -1" & @CRLF
    $macro &= "Suchstring = Cells(1, I).Value" & @CRLF
    $macro &= "If InStr(1, Gesamtstring, Suchstring) <> 0 Then" & @CRLF
    $macro &= "Columns(I).Delete" & @CRLF
    $macro &= "End If" & @CRLF
    $macro &= "Next" & @CRLF
    $macro &= "End Sub" & @CRLF
    $macro &= "Private Sub Worksheet_Change(ByVal Target As Range)" & @CRLF
    $macro &= "Target.EntireRow.AutoFit" & @CRLF
    $macro &= "Target.EntireColumn.AutoFit" & @CRLF
    $macro &= "End Sub" & @LF
    ClipPut($macro)
    Send("^v")
    Send("{F5}")
    controlclick("Makros", "&Ausführen", "Button1")
    Send("!q")
    close()
    EndFunc

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

    Func close()
    Exit
    EndFunc

    [/autoit]
  • Deklariere $pos als Global

    [autoit]

    Global $pos

    [/autoit]

    am Anfang des Scripts, dann kannst du die auch in den anderen Funktionen nutzen

  • und dann beim aufrufen der schleifenfunktion so wie oben schon mal mit ($pos[0],$pos[1]) die werte abfragen, alles klar :)
    manchmal steh ich echt auf dem schlauch...ein weiteres mal vielen vielen dank!!