Function in einer Schleife laufen lassen, wobei bei jeder Wiederholung die jeweilige Variable sich um einen Wert erhöht

  • Hallo Leute,
    ich habe folgendes Anliegen und hoffe das man mir helfen kann. Ich habs vorher selbst versucht, ich kamm bisher aber nicht wirklich weit.
    Ich möchte ein programm Schreiben, welches Designs auf einer Print on Demand Seite hochläd. ( in meinem fall: Spredshirt.de). Meines Wissens nach wird dieses nicht explicit in den AGB´s von Spreadshirt verboten. Die Forum "Verantwortlichen" können aber auch gerne selbst schauen.

    Ich möchte, das das Programm ( AutoIt) eine Schleife 50 Mal ausführt und bei jeder Ausführung bestimmte Variablen um einen bestimmten Wert erhöht. Vorher ließt AutoIt eine Excel tabelle aus, um aus diesem Text zu verwenden.
    Ich hatte etwas gelesen wie von For-Variablen, konnte es bsiher aber nicht anwenden.

    Ich habe mal meine aktuelle Function stark verkürzt und vereinfacht. Meine aktuelle Function klappt zwar, habe sie aber bisher nur für 10 "Schleifen" manuell geschrieben, wobei ich jede "Variable" manuell ändern musste:

    "
    ;Liest Exel aus ( unwichtig)

    #include <Excel.au3>

    Local $oExcel_1 = _Excel_Open()

    Local $var = "C:\Users\xxxxxx\Desktop\Tester.xlsx"; Excel Tabelle

    Local $oWorkbook = _Excel_BookOpen($oExcel_1,$var)

    WinActivate("Test - Microsoft Excel")

    Local $_read1 = _Excel_RangeRead($oWorkbook, Default , "D5")

    ...

    Local $_read570 = _Excel_RangeRead($oWorkbook, Default , "E29")


    ;der eigentlische Prozess den ich x-mal wiederholen will

    Func T-Shirt Design hochladen, für 50 x Wiederholen ( 50 Designs) ( Design 1)

    ShellExecute("https://partner.spreadshirt.com/designs")

    sleep(500)

    WinWaitActive("Spreadshirt - Mozilla Firefox")

    sleep(2500)

    ...

    send("{RIGHT}") ; Variable 1, soll nach jeder Wiederholung 1 x mehr gedrückt werden´; bspw. bei der 6 Wiederholung soll an dieser Stelle 6 x nach "rechts" gedrückt werden

    send($_read41) ; Variable 2, soll bei der Wiederholung um 1 erhöht werden ( read41 ;read42 ; read43 ;...) ; bspw. bei der 5 Wiederholung sollte an dieser Stelle "send($_read45)" stehen

    sleep(2000)

    ...

    send($_read281) ;Variable 3, soll bei jeder Wiederholung um 10 erhöht werden ( read281; read291; read301;....)....

    sleep(2000)

    ...

    send($_read171) ; Variable 60; soll bei der Wiederholung um 5 erhöht werden....

    sleep(10500)

    WinClose("Spreadshirt - Mozilla Firefox", "")

    sleep(3000)

    EndFunc

    Func ( Design 2)

    Function für Design 1 soll wiederholt werden mit den Werten für die Variable in diesem Fall...., also jeweils um 1, um 10 , 3.... erhöht

    EndFunc

    "
    Kann mir hier jemand vielleicht weiterhelfen. Ich wüsste gerne, wie ich die ($_read171)s als Variablen in eine Schleife packen kann.

    Ich danke euch im vorraus. Im Screenshot ist das ganze übersichtlicher.

    Gruß Bernd

  • So in etwa...

    2 Mal editiert, zuletzt von Bitnugger (17. Juni 2020 um 14:04)

  • Danke Bitnugger für deine Antwort.
    1.

    ist das $aSleep hierbei wichtig. Ich verstehe darunter das bei jeder neuen Schleife 1 Sekunde länger gewartet wird... Ich bräuchte dieses eigentlich nicht, wenn dem so wäre; außer es hat einen anderen eigentlichen zweck.

    2.

    Send("{RIGHT" & $iCount & "}")

    Bei meinem Test drückt AutoIT immer an dieser Stelle R, und nicht wie gewünscht jeweils x-mal nach rechts ( am iCount orientiert). Ist hierbei ein Zeichen vielleicht falsch gesetzt?

    Gruß Bernd

    Einmal editiert, zuletzt von Bernd Albrecht (17. Juni 2020 um 13:10)

  • Muss ich deinem Beipielskriptt nach erst AutoIt die komplette Excel Datei auslesen lassen und dann die Ranges ( Array) formulieren)? Oder kann ich

    Das kann ich dir nicht sagen, weil ich deine Excel-Datei nicht kenne und auch nicht weiß, was du daraus senden willst. Wenn ich Daten habe, mit denen ich arbeiten kann, dann kann ich auch etwas sinnvolles sagen.

    Allgemein aber, macht es mehr Sinn mit einem Array zu hantieren, wenn es sich nicht nur um eine handvoll Werte handelt, die du von Excel holen willst. Mit Array ist meistens die bessere Lösung.

    ist das $aSleep hierbei wichtig. Ich verstehe darunter das bei jeder neuen Schleife 1 Sekunde länger gewartet wird...

    Bei Send kann es gut sein, dass du vor dem nächsten Send etwas warten musst, damit das Programm auch genügend Zeit hat, um auf die Nachrichten zu reagieren. Dafür sind die Sleep's gedacht und ohne wird es sicher ab und an oder öfters nicht funktionieren. Wie lange man nach einem Send warten sollte, dass muss man austesten. Deshalb habe ich drei Werte in ein Array gepackt, so dass sie an einer Stelle geändert werden können. $aSleep[0] wartet 1000 ms... $aSleep[1] 2000 ms, $aSleep[2] 3000 ms... solange du den Wert im Arrray nicht änderst. Da es an manchen Stellen auch etwas schneller gehen darf, an anderen aber länger gewartet werden muss, solltest du mit den Werten ein wenig spielen, um die optimale Zeit für jeden Send herauszukitzeln.

    Das könntest du in in dieser Zeile: Local $_readA, $_readB, $_readC, $aSleep = [1000, 2000, 3000], $iCount

  • Bitnugger , danke für deine vorherige ANtwort, jetzte verstehe ich das mit dem $aSleep...

    1.
    Send("{RIGHT" & $iCount & "}")

    Bei meinem Test drückt AutoIT immer an dieser Stelle R, und nicht wie gewünscht jeweils x-mal nach rechts ( am iCount orientiert). Ist hierbei ein Zeichen vielleicht falsch gesetzt?
    Ich möchte das AutoIt bspw. bei der 12 Schleife nach 12 mal an der jeweiligen Stelle auf "Rechts" drückt und bei der 13 Schleife dann 13 mal. Bei Notepad bringt das rechtsdrücken nix, aber wieso wird da R reingeschrieben?

    2. Wie kann ich einstellen das AutoIt bspw. nach der 12 Schleife aufhört?

    Gruß Bernd

  • Send("{RIGHT" & $iCount & "}")

    Hier hatte ich ein Leerzeichen nach RIGHT vergessen. So ist es richtig: Send("{RIGHT " & $iCount & "}")

    Habe es im Script in Post #2 bereits korrigiert.

    Ich möchte das AutoIt bspw. bei der 12 Schleife nach 12 mal an der jeweiligen Stelle auf "Rechts" drückt und bei der 13 Schleife dann 13 mal.

    Ja, und genau das sollte jetzt auch passieren...


    Wie kann ich einstellen das AutoIt bspw. nach der 12 Schleife aufhört?

    Code
    ; For $i = 0 To UBound($aRanges) -1 Step 1
    For $i = 0 To 11 Step 1 ; 0 bis 11 = 12, Schleife nach 12 Durchläufen verlassen.
        $_readA = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][0]) ; A10, D10, G10, A11, D11, G11, A12, D12, ...
        $_readB = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][1]) ; B10, E10, H10, B11, E11, H11, B12, E12, ...
        $_readC = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][2]) ; C10, F10, I10, C11, F11, I11, C12, F12, ...
        T_Shirt_Design_hochladen($_readA, $_readB, $_readC, $aSleep, $i + 1) ; ($i + 1 = $iCount)
    Next

    Oder du machst es so:

    Code
    SendToExcel(12) ; 12 Datensätze an Excel senden.
    
    Func SendToExcel($iCount)
        For $i = 0 To $iCount -1 Step 1
            $_readA = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][0]) ; A10, D10, G10, A11, D11, G11, A12, D12, ...
            $_readB = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][1]) ; B10, E10, H10, B11, E11, H11, B12, E12, ...
            $_readC = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][2]) ; C10, F10, I10, C11, F11, I11, C12, F12, ...
            T_Shirt_Design_hochladen($_readA, $_readB, $_readC, $aSleep, $i + 1) ; ($i + 1 = $iCount)
        Next
    EndFunc

    Wenn $iCount (weiter oben) nicht im globalen Scope (außerhalb einer Funktion) deklariert wurde, wird $iCount so allerdings wieder auf 0 gesetzt, wenn du die Funktion wiederholt aufrufst.

    Durch Local Static bleibt der Inhalt in $iCounter auch nach Verlassen der Funktion erhalten, bis die Funktion für $i den Wert -1 bekommt, dann wird $iCount wieder auf 0 gesetzt.

    2 Mal editiert, zuletzt von Bitnugger (17. Juni 2020 um 14:31)

  • Ich möchte ein programm Schreiben, welches Designs auf einer Print on Demand Seite hochläd. ( in meinem fall: Spredshirt.de).

    Ich bekomme in FireFox (mit NoScript) nur einen Tip zu sehen: "Diese Seite steht zum Verkauf ...". Lasse ich alle Skripte zu, werde ich zu Bild+ umgeleitet, mit dubiosen Artikeln (eigentlich Werbung für BitCoin-Spekultionsgeschäfte).

    Im Falle eines Tippfehlers solltest du deinen Eingangspost korrigieren.

  • Ich hab nun eine etwas größere Range geschrieben und versuche das ganze laufen zu lassen, klappt aber irgendwie nicht. Darf eine Range nur eine bestimmte Görße haben? Oder habe ich irgendwas falsch geschrieben?
    Ich brauche die Range für 25 Hashtags und dann nochmal 25 Hashtags in Englisch, plus Name Beschreibung, Eigenschaften... insgesamt ca. 60 Elemente in einer Range. Diese Range muss ich dann nochmal 50 ( 50 Designs) mal schreiben, also 60x50 soll die Größe von der Range sein. Vielleicht ist das zu überdimensional?


    Gruß Bernd

  • Update: Ich konnte die roten Fehlermeledungen beseitigen, weil ich dieses: ( , _ ) in den Arrays eingefügt hatte, wie Bitnugger es vorgemacht hatte. Mit meinem aktuellen Array wird das Notepad nicht ausgeführt und drauf geschrieben. Vorher, mit dem Array von Bitnugger hatte dies geklappt. Muss ich zwangsläufig mein gesamtes Array deklarieren? Ihc wollte zunächst einmal testen wie es klappt bevor ich meine Range vergößere und die feinarbeiten vorneme.

    2.
    Sind die Grünen Felder im Bild q wichtig für die Ordnung der Range? ( Bei Range stelle ich mir einen Bauerhof vor, mit vielen Tieren ( Huhn, Kuh,..etc)).Ich dachte immer das Grüne würde nie gelesen werden.

    Gruß Bernd

  • Sind die Grünen Felder im Bild q wichtig für die Ordnung der Range?

    Wichtig schon, im Sinne des Verständnisses, nicht für den Programmablauf. Es handelt sich um Kommentare, mit denen Bitnugger Dir die Zuordnung verdeutlichen wollte.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Update: Alle Fragen die ich in meinen letzten Beiträgen aufgeworfen hatte, konnte ich doch selber klären. Ich hatte beispielsweise ausversehen das Next gelöscht...ich hab noch einiges korrigiert sodass es nun läuft. So werde ich glaube ich mein Vorhaben umsetzten könnnen.
    Ich danke euch für eure Hilfe bisher. :*:*

  • Trotzdem nochmal eine Anmerkung:

    Du definierst deine Variablen "Local", sind jedoch "Global" (alle Deaklarationen außerhalb von Funktionen sind immer Global) und verwendest diese zusätzlich wieder mit dem gleichen Namen in einer Funktion (bei deren Definition und bei der Übergabe/Verwendung). Damit hast du theoretisch eine Globale und eine Lokale Variable mit dem gleichen Namen. Das KANN zu Problemen führen.

    Ich empfehle dir das richtig zu definieren und Global und Lokal strikt voneinander zu trennen. Nur um das mal zu veranschaulichen:

  • Moombas danke für deine Hilfe, muss ich diesen Part von dir vor meinem eigentlischen Skript einbauen oder muss ich an meinem aktuellen Skript änderungen Vornehmen?

    2.
    Kann ich nicht anstatt $_readA : $_read1 oder $_name_deutsch oder $_Eigenschaft_für_Vorlage verwenden? Gibt es da regeln? Darf man keine ü-ä-ö verwenden? Darf man nicht zweimal den Unterschrisch verwenden _ _ ? Hat jemand eine Idee was die Fehlermeldung in meinem Skript zu bedeuten hat?

    3.
    Frage: Muss man dieses Zeichen: , _ ( komma-Unterstrich) , verwenden, wenn der Code in der nächsten Spalte weitergeht? Müsste ich dies ( wenn den so) auch bei meiner langen $aSleep-Reihe verwenden?


    Mein Skript verkürzt:

    Opt('MustDeclareVars', 1)

    #include <Excel.au3>

    Local $oExcel_1 = _Excel_Open()

    Local $var = "C:\Users\\Desktop\Read ideal.xlsx"

    Local $oWorkbook = _Excel_BookOpen($oExcel_1,$var)

    WinActivate("Read ideal - Microsoft Excel")

    Local $_nameenglisch, $_eigenschaftfurvorlage, $_beschreibungdeutsch, $_beschreibungenglisch, $_nichts1, ... , $_hashtag24englisch, $_hashtag25englisch, ; Insgesamt 60 "$_read´s"

    $aSleep = [1000, 2000, 3000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000

    , 1000, 1000, 1000, 1000, 1000 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000

    , 1000, 1000, 1000, 1000, 1000 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000

    , 1000, 1000, 1000, 1000, 1000 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000

    , 1000, 1000, 1000, 1000, 1000 1000, 1000, 1000], ; ( $aSleep für 60 "$_read´s" )
    $iCount

    Local $aRanges = [ ['B2', 'B3', 'B4', 'B5'........´B61´],_
    [ ['C2', 'C3', 'C4', 'C5'........´C61´]
    ....
    ['AY2', 'AY3', 'AY4', 'AY5'........´AY61´] _
    ]

    For $i = 0 To UBound($aRanges) -1 Step 1

    $_name_deutsch = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][0])

    $_name_englisch = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][1])

    $_eigenschaft_für_vorlage = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][2])

    $_beschreibung_deutsch = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][3])

    $_beschreibung_englisch = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][4])

    $_nichts_1 = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][5])

    $_nichts_2 = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][6])

    $_nichts_3 = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][7])

    $_nichts_4 = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][8])

    $_hashtag_1_deutsch = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][9])

    .....

    $_hashtag_25_englisch = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][59])

    T_Shirt_Design_hochladen($_name_deutsch, $_name_englisch, $_eigenschaft_für_vorlage, $_beschreibung_deutsch, $_beschreibung_englisch, $_nichts_1, $_nichts_2,$_nichts_3, $_nichts_4, $_hashtag_1_deutsch, $_hashtag_2_deutsch,

    $_hashtag_3_deutsch, $_hashtag_4_deutsch, $_hashtag_5_deutsch, $_hashtag_6_deutsch, $_hashtag_7_deutsch, $_hashtag_8_deutsch, $_hashtag_9_deutsch, $_hashtag_10_deutsch, $_hashtag_11_deutsch, $_hashtag_12_deutsch,

    $_hashtag_13_deutsch, $_hashtag_14_deutsch, $_hashtag_15_deutsch, $_hashtag_16_deutsch, $_hashtag_17_deutsch, $_hashtag_18_deutsch, $_hashtag_19_deutsch, $_hashtag_20_deutsch, $_hashtag_21_deutsch,

    $_hashtag_22_deutsch, $_hashtag_23_deutsch, $_hashtag_24_deutsch, $_hashtag_25_deutsch, $_nichts_5, $_hashtag_1_englisch, $_hashtag_2_englisch, $_hashtag_3_englisch, $_hashtag_4_englisch, $_hashtag_5_englisch,

    $_hashtag_6_englisch, $_hashtag_7_englisch, $_hashtag_8_englisch, $_hashtag_9_englisch, $_hashtag_10_englisch, $_hashtag_11_englisch, $_hashtag_12_englisch,

    $_hashtag_13_englisch, $_hashtag_14_englisch, $_hashtag_15_englisch, $_hashtag_16_englisch, $_hashtag_17_englisch, $_hashtag_18_englisch, $_hashtag_19_englisch, $_hashtag_20_englisch,

    $_hashtag_21_englisch, $_hashtag_22_englisch, $_hashtag_23_englisch, $_hashtag_24_englisch, $_hashtag_25_englisch, $aSleep , $i + 1) ; ($i + 1 = $iCount)

    Next

    Func T_Shirt_Design_hochladen($_readA, $_readB, $_readC, $aSleep, $iCount)

    If $iCount = 1 Then

    ....
    .....
    ....

    EndFunc




    Ich danke euch im vorraus

    PS: IM Skript ist nicht alles einheitlich: ich hatte am Anfang des Skirptes die Unterstriche entfernt und veräderungen vorgenommen, um zu schauen ob die Fehlermeldung verschwindet; ich hatte nicht das gesamte Skript dementsprechend verändert.

    Gruß Bernd

  • Schau mal drüber:

    Und wenn du es ganz korrekt machen möchtest bau mal als Zeile "#AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7" ein und kompiliere dann.

    Einmal editiert, zuletzt von Moombas (18. Juni 2020 um 14:23)

  • @moobas Danke für deine Hilfe, ich hab jetzt überall global antsatt lokal eingebaut... das mit dem ""#AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7" muss ich mir noch anschauen, ich bin schon zufrieden wenn das Programm dann einigermaßen läuft, mein Kopf tut mir jetzt schon weh ....||

    2. Update: Ich bin von meinem Experiment zurückgetretten, in welchem ich mir die Arbeit leichter machen wollte und die $_readA ´s mit $_hashtag_3_deutsch ersetzen wollte. Nun habe ich wieder die Reads strickt nach Buchstaben sortiert und es läuft . :)

    Moombas wie schafst du es die Skripte von Autoit hier so einzufügen, sodass die farbe und etc nicht verloren geht...?

    Gruß Bernd


  • wie schaffst du es die Skripte von Autoit hier so einzufügen, dass die farbe und etc nicht verloren geht...?

    Verwende das Code-Icon </> aus der blauen Headerleiste des Beitragsfeld. Als Syntax-Hervorhebung AutoIt wählen.

    Gruß Musashi

    Bilder

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."