Makro starten

  • Hallo Leute


    ich habe mit MouseGetPos am desktop einen X,Y oberen/unteren Bereich eingerichtet der mir Excel öffnet eine txt. Datei einliest

    und dann per Kurzbefehl ein Makro startet das nach bestimmten Werten sucht das funktioniert auch tadellos.

    Nun würde ich aber gerne einen 2 Bereich definieren der mir das gleiche macht aber ein anderes Makro

    startet.Nur wie kann ich das machen das er das andere Makro startet, d.h wenn im 2 Bereich 2.Makro starten.

    Hätte vielleicht jemand einen Tipp?

  • Was für Makros? Und vorallem wo ist dein derzeitiges Script? Wo soll die Schwierigkeit liegen in einem anderen Bereich ein anderes "Makro" auszuführen? Hast doch bereits alles implementiert und musst den Code mehr oder weniger nur noch kopieren und Werte technisch anpassen. Ohne Quellcode wird dir hier jedenfalls keiner helfen können, da wir keine Ahnung haben wie du das im Detail realisiert hast.

  • Oh sorry hier mein script

    Spoiler anzeigen

    #include <Array.au3>

    #include <MsgBoxConstants.au3>

    #include <Excel.au3>

    #Include <File.au3>

    #include <Misc.au3>


    Global $oExcel = _Excel_Open() ;Excel Teil ----- öffnet Excel

    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "_Excel_Open Error", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

    $sExcelfile = "C:\Users\mm\Desktop\" & "\Daten.xlsm"

    Global $oWorkbook = _Excel_BookOpen($oExcel, $sExcelfile) ; Exceldatei öffnen

    If @error Then

    MsgBox($MB_SYSTEMMODAL, "Reading of Excel File Failed", "Error opening workbook" & @CRLF & "@error = " & @error & ", @extended = " & @extended)

    _Excel_Close($oExcel)

    Exit

    EndIf


    sleep(1000) ;wartet 1 sec


    Local $aPos

    Local $bPos

    ; ___

    ; |___|

    Local $iXstart = 957 ;Horizontal

    Local $iXend = 1132 ;Horizontal

    Local $iYstart = 305 ;Vertikal

    Local $iYend = 349 ;Vertikal

    Local $iiXstart = 757 ;Horizontal

    Local $iiXend = 832 ;Horizontal

    Local $iiYstart = 305 ;Vertikal

    Local $iiYend = 349 ;Vertikal

    Do

    $aPos = MouseGetPos()

    $bPos = MouseGetPos()

    Until $aPos[0] > $iXstart And $aPos[0] < $iXend And $aPos[1] > $iYstart And $aPos[1] < $iYend Or $bPos[0] > $iiXstart And $bPos[0] < $iiXend And $bPos[1] > $iiYstart And $bPos[1] < $iiYend

    Sleep (1000) ;wartet 1 sec


    Local $aRecords ; Txt einlesen Teil -----

    $sSourcePath = "C:\ProgramData\R\Daten\"

    $aFilesInFolder = _FileListToArray($sSourcePath, "*.txt" )

    For $i = 1 To $aFilesInFolder[0]


    If Not _FileReadToArray($sSourcePath & $aFilesInFolder[$i],$aRecords) Then

    MsgBox(4096,"Fehler", "Fehler beim einlesen der Daten.")

    Exit

    EndIf

    For $x = 1 To $aRecords[0]

    ;MsgBox(0, "", "Array eingelesen")

    Next

    Next


    Local $iRow = 1

    For $i = $aRecords[0] To $aRecords[0] - 4 Step -1 ;

    _Excel_RangeWrite($oWorkbook, $oWorkbook.Sheets(1), $aRecords[$i], "A" & $iRow)

    $iRow +=

    Next

    sleep (3000) ;wartet 3 sec

    Send("^A") ;startet Makro per KurzBefehl in Excel

    sleep (15000)

    Mein Problem ist wie soll ich Makro2 auf Position $bPos ausführen

  • Und was soll deine Do Until SChleife denn machen, die kann nur folgendes Ergebnis liefern sie läuft oder beendet sich,

    und was dann??

    Du brauchst aber eine Reaktion für zwei oder mehrere verschiedene Zustände, denk erst mal selbst darüber nach.

    Eventuell kommst du ja selbst dahinter wenn nicht, kannst du ja nochmal nachfragen.

    Achja fast vergessen, wofür brauchst du zweimal dieselben Mauskoordinaten.

  • Hi

    Die Do Until Schleife macht nichts anders als sie wartet bis ich die Maus auf meine Kordinaten (z.b links oben) bewege dann wird eine tx Datei eingelesen und das Makro gestartet. Das funkt ja aber mein Problem ist wie kann ich ihm sagen wenn Maus z.b rechts oben dann txt Datei einlesen und MAKRO 2 starten, und es sind nicht zweimal die selben Mauskoordinaten.

    Genau ich brauch eine Reaktion wenn Position A dann Makro A wenn Position B dann Makro B !!!!

  • Do

    $aPos = MouseGetPos()

    Until $aPos[0] > $iXstart And $aPos[0] < $iXend And $aPos[1] > $iYstart And $aPos[1] < $iYend

    sleep (4000)
    If $aPos then Send("^A") ;startet Makro per KurzBefehl in Excel

    Else

    If $bPos then Send("^B") ;startet Makro2 per KurzBefehl in Excel

    Endif

    hab das jetzt so probiert aber es funkt irgenwie nicht

  • Do

    $aPos = MouseGetPos()

    $bPos = MouseGetPos()

    Until $aPos[0] > $iXstart And $aPos[0] < $iXend And $aPos[1] > $iYstart And $aPos[1] < $iYend Or $bPos[0] > $iiXstart And $bPos[0] < $iiXend And $bPos[1] > $iiYstart And $bPos[1] < $iiYend

    Do

    If $aPos then ;startet Makro per KurzBefehl in Excel

    MsgBox(0, "", "Array eingelesen")

    EndIf

    Until $aPos[0] > $iXstart And $aPos[0] < $iXend And $aPos[1] > $iYstart And $aPos[1] < $iYend Or $bPos[0] > $iiXstart And $bPos[0] < $iiXend And $bPos[1] > $iiYstart And $bPos[1] < $iiYend


    Hab das probiert aber es klappt nicht

  • Ich würde dir mal zu etwas mehr Struktur raten, dann wird das ganze viel klarer und übersichtlicher.

    Vorgehensweise:

    1. Überlegen was dein Script überhaupt tun muss

    - Permanent prüfen wo die Maus ist

    - Prüfen ob die aktuelle Mausposition innerhalb deiner beiden Bereiche ist

    - Je nach Mausposition drei Aktionen ausführen: Nix | TXT -> Excel -> Makro 1 | TXT -> Excel -> Makro 2

    2. Funktionen schreiben, die die Einzelaufgaben erledigen, bzw. Überlegen was man in Funktionen auslagern kann

    - Funktion mousePosAction($aActionAreas), welche dir als Ergebnis zurückgibt welche Aktion auszuführen ist, sprich ob die Maus innerhalb Bereich 1 / 2 oder außerhalb der Bereiche ist. Das Array $aActionAreas beinhaltet alle von dir definierten Bereiche und zugehörige Aktionsnummer. (siehe Tabelle)

    Aktionsnummer xStart xEnd yStart yEnd
    1 957 1132 305 349
    2 757 832 305 349

    Als Rückgabe erhältst du von deiner Funktion entweder 0 für NIX oder eben 1/2 für das betreffende Makro, welches du danach ausführen willst.

    - Funktion openTXT($filepath) welche die TXT in Excel öffnet

    - Funktion executeExcelMakro($iActionNumber) welche Makro 1 oder 2 in Excel ausführt, wobei $iActionNumber bestimmt welches Macro ausgeführt wird und dem Rückgabewert der Funktion mousePosAction() entspricht.

    3. Das ganze in ein Script verpacken und deine Funktion mousePosAction() in Intervallen aufrufen

    4. Fehlverhalten prüfen und beseitigen

    - Deine Funktion executeExcelMakro() könnte z.B. mehrfach ausgeführt werden wenn die Maus zu lange innerhalb der Aktionsbereiche verbleibt. Das kannst du z.B. verhindern wenn du die Maus mit mouseSetPos() weg bewegst oder mit Timern und Sperrvariablen arbeitest.


    PS: Ich vermute mal, dass die Excel UDF Makros auch direkt ansteuern kann und das Senden von Tastenkombinationen unnötig ist. Vielleicht kann jemand mit mehr Kenntnissen zur Excel UDF dazu was sagen.

    2 Mal editiert, zuletzt von misterspeed (19. November 2017 um 18:40)

  • Ja das mit mehr Struktur liest sich ja super aber ich bin bei weiten nicht soweit das so umzusetzten

    Mein Script wie man sehen kann ist ja auch nur so zusammengesucht und läuft mit einem Makro

    Ich werde das ganze wegen Erfolglosigkeit einstellen.

  • Wie kannst du sowas behaupten du kennst mich gar nicht

    Nein ich kenn dich nicht. Es kam aber so rüber als ob du schlichtweg keine Lust hast dich tiefer mit Autoit oder Programmieren im Allgemeinen auseinander zusetzen wenn du schon nach so kurzer Zeit aufgibst. Das ist wie gesagt auch in Ordnung und allein deine Entscheidung. Jeder muss für sich abwägen ob Kosten und Nutzen im Einklang stehen. Ich verwerfe auch immer mal wieder ein Vorhaben, weil sich die Zeit die ich investieren müsste einfach nicht rentiert.

    Eine Programmiersprache lernt man aber jedenfalls nicht vom Code Schnippsel "zusammensuchen" aka copy&paste und auch nicht in 5 Minuten.

    Wenn du ernsthaftes Interesse hast etwas zu lernen orientier dich an meinem recht ausführlichen Grundgerüst, versuche das zumindestens ansatzweise umzusetzen und stell dann konkrete Fragen zu den Dingen die dir nicht klar sind z.B. "Was ist ein Array?", "Wie definiere ich ein 2D Array und wie arbeite ich damit?" meinetwegen auch "Was ist eine Funktion?", "Wie erstelle ich meine eigene Funktion?" usw. je nach Kenntnisstand eben.

    Auf die meisten Fragen wirst du dann in der Regel Verweise auf weiterführende Tutorials, Beispiele oder die Autoit Hilfedatei erhalten, denn dadurch lernst du eher was als durch Kopieren von fertigen Lösungen. Anstatt einer theoretischen und ausführlichen Beschreibung wie dein Programm aufgebaut sein sollte / könnte hätte ich in nur minimal weniger Zeit auch ein fertiges und lauffähiges Script schreiben können, nur hättest du es vermutlich nicht verstanden und beim nächsten "Projekt" wieder nicht gewusst wie man ein Programm am besten plant und strukturiert umsetzt.

    So mehr gibts von meiner Seite hier nicht zu sagen, außer dich packt doch noch der Ehrgeiz das ganze umzusetzen, dann bin ich gerne dabei behilflich deine Fragen zu klären und ggf. Fehler zu beheben. ;)

    Einmal editiert, zuletzt von misterspeed (20. November 2017 um 21:22)

  • Sorry war nicht böse gemeint :) aber es ist ziemlich frustrierend und demotivierend wenn nichts klappt und ein fertige Script will ich selber nicht

    ich würde das gerne so wie du geschrieben hast umsetzten aber ich scheitere schon beim Array Punkt.

    Zitat


    Das Array $aActionAreas beinhaltet alle von dir definierten Bereiche und zugehörige Aktionsnummer

    hab das probiert

    Global $aActionAreas[2][4] = [[957, 1132, 305, 349],[757, 832, 305, 349]]

    k.a ob richtig aber selbst wenn wo oder wie definiere ich die zugehörige Aktionsnummer ins Array?

  • Ob das richtig ist sagt dir zum einen die Syntax Prüfung in Scite, zum anderen könntest du die Funktion _arrayDisplay()verwenden um dein Array visuell darzustellen und zu prüfen ob es so aufgebaut ist wie du gerne hättest. Für die Funktion _arrayDisplay() wird das #include array.au3 benötigt.

    Kurzes Beispiel bzgl. Array Deklaration:

    Vorteil der Überschriften im Array und der übersichtlicheren Quellcode Darstellung ist es, dass du auch nach Jahren noch schnell einen leichten Überblick darüber hast wozu das Array da war und was du darin speicherst. Verzichtet man auf eine klare Doku im Quelltext wird es sehr schwer später noch nachzuvollziehen was dort wie, warum und in welcher Reihenfolge gespeichert wurde. Das Array ist so auch leichter erweiterbar, wenn du später vielleicht noch 2 andere Bereiche hinzufügen möchtest.

    Umfassendes Array Tutorial von Bugfix: http://www.bug-fix.info/array_tut.htm

    2 Mal editiert, zuletzt von misterspeed (20. November 2017 um 22:10)

  • Super der Teil mit dem Array funktioniert schon mal wusste nicht das man die Actionsnummer/Makronummer so ins Array mit eingeben kann.

    Werde mich an Funktion mousePosAction($aActionAreas) versuchen

    Hast du vielleicht einen Tipp an was ich mich orientieren kann

    Einmal editiert, zuletzt von Vitaq (21. November 2017 um 19:46)