czardas Posted September 14, 2006 Share Posted September 14, 2006 As an amatuer I have only used 'Do Until' and 'While WEnd' loops in my scripts. These seem quite similar to me. I seem to have had difficulty going more than two levels in. I have not been able to create a loop within a loop within a loop. I have only been able to create a loop within a loop. This is likely to be because of bad arguments. I would like to know if there is a preffered syntax for this type of looping, and how many levels in can you go. I would expect that loops could created within loops indefinately so I must be doing something wrong. operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
theguy0000 Posted September 15, 2006 Share Posted September 15, 2006 oops - left my crystal ball in the tent. Mind giving us some code you have previously tried, and maybe we can tell you why it isn't working. The cake is a lie.www.theguy0000.com is currentlyUP images.theguy0000.com is currentlyUP all other *.theguy0000.com sites are DOWN Link to comment Share on other sites More sharing options...
czardas Posted September 15, 2006 Author Share Posted September 15, 2006 I'm not sure if I have this specific instance, because I have circumvented these problems by other less convenient means. Give me a moment and I'll try to find something. operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
cppman Posted September 15, 2006 Share Posted September 15, 2006 ?? for $i = 1 to 10 msgbox(0, "", "Inside First Loop!") for $j = 1 to 10 Msgbox(0, "", "Inside Second Loop!") For $k = 1 to 10 MsgBox(0, "", "Inside Third Loop") Next Next Next Miva OS Project Link to comment Share on other sites More sharing options...
Locodarwin Posted September 15, 2006 Share Posted September 15, 2006 (edited) As an amatuer I have only used 'Do Until' and 'While WEnd' loops in my scripts. These seem quite similar to me. I seem to have had difficulty going more than two levels in. I have not been able to create a loop within a loop within a loop. I have only been able to create a loop within a loop. This is likely to be because of bad arguments. I would like to know if there is a preffered syntax for this type of looping, and how many levels in can you go. I would expect that loops could created within loops indefinately so I must be doing something wrong. You'll be able to nest loops deeper than you'll ever need to go. Here's a quick example of a 3-layer loop setup with While: ; 3 degrees of nesting Global $x = 0, $y = 0, $z = 0 While 1 $x = $x + 1 If $x > 5 Then ExitLoop ConsoleWrite("We're on 1st iteration " & $x & " of 5" & @CRLF) While 1 $y = $y + 1 If $y > 5 Then ExitLoop ConsoleWrite("We're on 2nd iteration " & $y & " of 5" & @CRLF) While 1 $z = $z + 1 If $z > 5 Then ExitLoop ConsoleWrite("We're on 3rd iteration " & $z & " of 5" & @CRLF) WEnd $z = 0 WEnd $y = 0 WEnd Can you post an example of what you're trying to accomplish? -S Edit: whoops, someone else already asked while I was posting. Edited September 15, 2006 by Locodarwin (Yet Another) ExcelCOM UDF"A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly...[indent]...specialization is for insects." - R. A. Heinlein[/indent] Link to comment Share on other sites More sharing options...
czardas Posted September 15, 2006 Author Share Posted September 15, 2006 I only have one rather untidy loop within a loop, but it's a biggy. Needs some tidying. operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
czardas Posted September 15, 2006 Author Share Posted September 15, 2006 (edited) You'll be able to nest loops deeper than you'll ever need to go. Here's a quick example of a 3-layer loop setup with While: ; 3 degrees of nesting Global $x = 0, $y = 0, $z = 0 While 1 $x = $x + 1 If $x > 5 Then ExitLoop ConsoleWrite("We're on 1st iteration " & $x & " of 5" & @CRLF) While 1 $y = $y + 1 If $y > 5 Then ExitLoop ConsoleWrite("We're on 2nd iteration " & $y & " of 5" & @CRLF) While 1 $z = $z + 1 If $z > 5 Then ExitLoop ConsoleWrite("We're on 3rd iteration " & $z & " of 5" & @CRLF) WEnd $z = 0 WEnd $y = 0 WEnd Can you post an example of what you're trying to accomplish? -S Edit: whoops, someone else already asked while I was posting. This is just what I'm after, a clear example. Thanks. Edited September 15, 2006 by czardas operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
Paulie Posted September 15, 2006 Share Posted September 15, 2006 oops - left my crystal ball in the tent. Mind giving us some code you have previously tried, and maybe we can tell you why it isn't working.Ya, when you go get it, mind brining me my chest full of assumptions? Link to comment Share on other sites More sharing options...
Richard Robertson Posted September 15, 2006 Share Posted September 15, 2006 Super nested loops are fun. Just wait til you try to triple nest loops in a recursive function and keep 5 arrays matched up. That may just be me though. Link to comment Share on other sites More sharing options...
czardas Posted September 15, 2006 Author Share Posted September 15, 2006 How do I post a large script? I'm not sure if it will appear correctly. CODE: AutoIt Opt("SendKeyDelay", 10) $Year = InputBox ("START DATE", "Enter the year (4 figures)", "") $Month = InputBox ("START DATE", "Enter the month 01 - 12", "") Run("notepad.exe") WinWaitActive("Untitled - Notepad") Send ($Month) Send ("/") Send ($Year) $MMYYYY = WinGetText("Untitled - Notepad") WinClose("Untitled - Notepad") WinWaitActive("Notepad", "The text in the Untitled file has changed") Send("!n") Send ("{LWINDOWN}r{LWINUP}") WinWaitActive("Run","") Send (@MyDocumentsDir&"\New Ledger.xls") Send ("{ENTER}") WinWaitActive ("Microsoft Excel - New Ledger.xls") ; Group Students (Add New Student) $date = InputBox ("GROUP LESSONS", "Enter Date 01 - 31", "") While $date > 0 $price = InputBox ("GROUP LESSONS", "Enter the lesson price.", "") $answer = MsgBox (4, "ADD STUDENTS", "Do you want to add a new student to the group?") If $answer = 7 Then Else Send ("{CTRLDOWN}{PGDN 4}{CTRLUP}") Sleep (300) $text = InputBox ("ADD STUDENTS", "Enter the student's name", "") Do ;Added start Sleep (300) Send ("{CTRLDOWN}f{CTRLUP}") WinWaitActive ("Find", "") Send ($text) Send ("{ENTER}") Sleep (300) If WinExists ("Microsoft Excel", "Microsoft Excel cannot find the data you're searching for.",) Then Send ("{ENTER}") Send ("{ALTDOWN}{F4}{ALTUP}") Sleep (100) Send ("{CTRLDOWN}{PGDN}{CTRLUP}") Sleep (100) Send ("{CTRLDOWN}f{CTRLUP}") WinWaitActive ("Find", "") Send ($text) Send ("{ENTER}") Sleep (300) If WinExists ("Microsoft Excel", "Microsoft Excel cannot find the data you're searching for.",) Then Send ("{ENTER}") Send ("{ALTDOWN}{F4}{ALTUP}") Sleep (100) Send ("{CTRLDOWN}{PGUP}{CTRLUP}") Sleep (100) Send ("{CTRLDOWN}{HOME}{CTRLUP}{DOWN}") Sleep (300) Send("{ALTDOWN}ir{ALTUP}") Sleep (500) Send ($text) Sleep (300) $missed = InputBox ("ADD STUDENTS", "How many lessons has "&($text)&" missed?", "") Send ("{RIGHT}") Send ($missed*$price) Sleep (300) Send ("{RIGHT}0") Sleep (300) Send ("{CTRLDOWN}{HOME}{CTRLUP}") Else Send ("{ALTDOWN}{F4}{ALTUP}") Sleep (100) $answer = MsgBox (4,"WARNING",$text&" already exists. Do you to move "&$text&"?") Sleep (100) If $answer = 6 Then ;delete totals before removing student Send ("{CTRLDOWN}{END}{CTRLUP}{DEL}") Sleep (300) Send ("{LEFT}{DEL}") Sleep (300) Send ("{CTRLDOWN}f{CTRLUP}") WinWaitActive ("Find", "") Send ($text) Sleep (300) Send ("{ENTER}") Send ("{ALTDOWN}{F4}{ALTUP}") Sleep (100) ;totals deleted Send ("{RIGHT}") Sleep (300) Send ("{CTRLDOWN}c{CTRLUP}") Sleep (300) $bak1 = ClipGet() Sleep (300) If $bak1 + 0 = 0 Then Send ("{RIGHT}") Sleep (300) Send ("{CTRLDOWN}c{CTRLUP}") Sleep (300) $bak2 = ClipGet() Sleep (300) ; delete the sudent before the argument Send ("{ALTDOWN}edr{ALTUP}{ENTER}") Sleep (300) Send ("{CTRLDOWN}{END}{CTRLUP}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{LEFT}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{CTRLDOWN}{HOME}{CTRLUP}") Sleep (100) Send ("{CTRLDOWN}{PGUP}{CTRLUP}") Sleep (100) ; Now add the student Send ("{CTRLDOWN}{HOME}{CTRLUP}{DOWN}") Sleep (300) Send("{ALTDOWN}ir{ALTUP}") Sleep (500) Send ($text) Sleep (300) ; student added $missed = InputBox ("ADD STUDENTS", "How many lessons has "&($text)&" missed?", "") Sleep (100) If $bak2 + 0 = 0 Then Send ("{RIGHT}") Send ($missed*$price) Sleep (300) Send ("{RIGHT}0") Sleep (300) Else If $bak2 + 0 > $missed*$price then Send ("{RIGHT}0{RIGHT}") Sleep (300) Send ($bak2 - $missed*$price) Else Send ("{RIGHT}") Send ($missed*$price - $bak2 ) Sleep (300) Send ("{RIGHT}0") Sleep (300) EndIf EndIf ; calculate totals Send ("{CTRLDOWN}{END}{CTRLUP}{DEL}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{LEFT}{DEL}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{CTRLDOWN}{HOME}{CTRLUP}") Else ; delete the sudent Send ("{ALTDOWN}edr{ALTUP}{ENTER}") Sleep (300) Send ("{CTRLDOWN}{END}{CTRLUP}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{LEFT}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{CTRLDOWN}{HOME}{CTRLUP}") Sleep (100) Send ("{CTRLDOWN}{PGUP}{CTRLUP}") Sleep (100) ; Now add the student Send ("{CTRLDOWN}{HOME}{CTRLUP}{DOWN}") Sleep (300) Send("{ALTDOWN}ir{ALTUP}") Sleep (500) Send ($text) Sleep (300) ; student added $missed = InputBox ("ADD STUDENTS", "How many lessons has "&($text)&" missed?", "") Sleep (100) Send ("{RIGHT}") Sleep (300) Send ($bak1 + $missed*$price) Sleep (300) Send ("{RIGHT}0") Sleep (300) ; calculate totals Send ("{CTRLDOWN}{END}{CTRLUP}{DEL}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{LEFT}{DEL}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{CTRLDOWN}{HOME}{CTRLUP}") Sleep (100) EndIf Else Send ("{CTRLDOWN}{HOME}{CTRLUP}") Sleep (100) Send ("{CTRLDOWN}{PGUP}{CTRLUP}") Sleep (100) $missed = 0 EndIf EndIf Else Send ("{ALTDOWN}{F4}{ALTUP}") Sleep (100) MsgBox (0, "ERROR", ($text)&" is already a member of the group.") Sleep (100) Send ("{CTRLDOWN}{HOME}{CTRLUP}") Sleep (100) $missed = 0 EndIf ; END OF INSERTION If $missed > 0 Then Send ("{CTRLDOWN}{PGUP 3}{CTRLUP}") Sleep (100) Send("{CTRLDOWN}{END}{CTRLUP}") Send ("{DOWN}{HOME}") Send ($date&"/"&$MMYYYY) Sleep (100) Send ("{RIGHT}") Send ($text) Send (" - Late Enrolment.") Send ("{RIGHT 3}") Send ($missed*$price) Sleep (100) Send ("{RIGHT 3}") Send ($missed*$price) Sleep (100) Send ("{HOME}") Sleep (100) Send ("{CTRLDOWN}{PGDN 3}{CTRLUP}") Else EndIf Sleep (100) $text = InputBox ("ADD STUDENTS", "Enter the student's name", "") $len = StringLen($text) Until $len = 0 Send ("{CTRLDOWN}{END}{CTRLUP}{DEL}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Send ("{LEFT}{DEL}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Send ("{CTRLDOWN}{HOME}{CTRLUP}") Sleep (100) Send ("{CTRLDOWN}{PGUP 4}{CTRLUP}") EndIf ; Group Students (Delete Existing Student) $answer = MsgBox (4, "DELETE STUDENTS", "Do you want to delete a student from the group?") If $answer = 7 Then Else Send ("{CTRLDOWN}{PGDN 4}{CTRLUP}") Sleep (300) $text = InputBox ("DELETE STUDENTS", "Enter the student's name", "") Do Send ("{CTRLDOWN}{END}{CTRLUP}{DEL}") Sleep (300) Send ("{LEFT}{DEL}") Sleep (300) Send ("{CTRLDOWN}f{CTRLUP}") WinWaitActive ("Find", "") Send ($text) Send ("{ENTER}") Sleep (300) If WinExists ("Microsoft Excel", "Microsoft Excel cannot find the data you're searching for.",) Then Send ("{ENTER}") Send ("{ALTDOWN}{F4}{ALTUP}") Sleep (300) MsgBox (0,"ERROR", "The name does not appear to be in the list.") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{RIGHT}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Send ("{CTRLDOWN}{HOME}{CTRLUP}") Else Send ("{ENTER}{TAB}{ENTER}") Sleep (300) Send ("{RIGHT}") Sleep (300) Send ("{CTRLDOWN}c{CTRLUP}") Sleep (300) $bak = ClipGet() If $bak = 0 Then Send ("{RIGHT}") Sleep (300) Send ("{CTRLDOWN}c{CTRLUP}") Sleep (300) $bak = ClipGet() If $bak = 0 Then Else Send ("{CTRLDOWN}{PGDN}{CTRLUP}") Sleep (300) Send ("{CTRLDOWN}{HOME}{CTRLUP}{DOWN}") Sleep (300) Send("{ALTDOWN}ir{ALTUP}") Sleep (500) Send ($text) Sleep (300) Send ("{RIGHT}0{RIGHT}") Sleep (300) Send ($bak) Sleep (300) Send ("{CTRLDOWN}{END}{CTRLUP}{DEL}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Send ("{LEFT}{DEL}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Send ("{CTRLDOWN}{HOME}{CTRLUP}") Send ("{CTRLDOWN}{PGUP}{CTRLUP}") EndIf Else Send ("{CTRLDOWN}{PGDN}{CTRLUP}") Sleep (300) Send ("{CTRLDOWN}{HOME}{CTRLUP}{DOWN}") Sleep (300) Send("{ALTDOWN}ir{ALTUP}") Sleep (500) Send ($text) Sleep (300) Send ("{RIGHT}") Sleep (300) Send ($bak) Sleep (300) Send ("{CTRLDOWN}{HOME}{CTRLUP}{DOWN}{RIGHT 2}") Sleep (300) Send ("0") Sleep (300) Send ("{CTRLDOWN}{END}{CTRLUP}{DEL}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{LEFT}{DEL}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{CTRLDOWN}{HOME}{CTRLUP}") Send ("{CTRLDOWN}{PGUP}{CTRLUP}") EndIf Sleep (300) Send ("{ALTDOWN}edr{ALTUP}{ENTER}") Sleep (300) Send ("{CTRLDOWN}{END}{CTRLUP}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Sleep (300) Send ("{LEFT}") Sleep (300) Send ("{CTRLDOWN}{SPACE}{CTRLUP}") Send("{ALTDOWN}={ALTUP}") Send ("{CTRLDOWN}{HOME}{CTRLUP}") EndIf Sleep (300) $text = InputBox ("DELETE STUDENTS", "Enter the student's name", "") $len = StringLen($text) Until $len = 0 Sleep (300) Send("{CTRLDOWN}{HOME}{CTRLUP}") Send ("{CTRLDOWN}{PGUP 4}{CTRLUP}") EndIf Sleep (300) Send ("{CTRLDOWN}{PGDN 4}{CTRLUP}") $count = -1 Do Sleep (100) Send ("{DOWN}") Send ("{CTRLDOWN}c{CTRLUP}") $bak = ClipGet() $len = StringLen($bak) $count = $count + 1 Until $len = 2 ; Adjust groups debit/credit Send("{CTRLDOWN}{HOME}{CTRLUP}") $number = 0 Do Send ("{RIGHT 2}{DOWN}") Sleep (300) Send ("{CTRLDOWN}c{CTRLUP}") Sleep (300) $bak1 = ClipGet() Sleep (300) If $bak1 - $price < 0 Then Send ("{DEL}0{LEFT}") Sleep (300) Send ("{CTRLDOWN}c{CTRLUP}") Sleep (300) $bak2 = ClipGet() Sleep (300) Send ($price + $bak2 - $bak1) Else Send ($bak1 - $price) Sleep (300) EndIf Send ("{HOME}") $number = $number + 1 Until $number = $count ;inserted Send ("{CTRLDOWN}{HOME}{CTRLUP}") Sleep (100) ; Adjust Sales Day Book. Send ("{CTRLDOWN}{PGUP 3}{CTRLUP}") Sleep (300) Send("{CTRLDOWN}{END}{CTRLUP}") Send ("{DOWN}{HOME}") Send ($date&"/"&$MMYYYY) Sleep (100) Send ("{RIGHT}") $text = InputBox ("GROUP DETAILS", "Enter details", "2 Hours @ Casa Tapas") Sleep (300) Send ($text) Sleep (100) Send ("{RIGHT 3}") Send ($count*$price) Sleep (100) Send ("{RIGHT 3}") Send ($count*$price) Sleep (100) Send ("{HOME}") Sleep (100) Send ("{CTRLDOWN}{PGUP}{CTRLUP}") $date = InputBox ("GROUP LESSONS", "Enter Date 01 - 31", "") WEnd operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
Paulie Posted September 15, 2006 Share Posted September 15, 2006 How do I post a large script? I'm not sure if it will appear correctly.[ autoit] Code here [/ autoit] w/o spaces Link to comment Share on other sites More sharing options...
czardas Posted September 15, 2006 Author Share Posted September 15, 2006 (edited) At the start of the do loop I could possibly have also looped the find student's name section instead of repeating myself. There's lots of sleep time to ensure that certain entries are made correctly before the script continues. I think that I might have tried a While WEnd within Do Until within While WEnd. I don't know why it didn't work. There must be simpler ways of writing this. Skipping sections of script so as not to have to repeat similar actions at different stages. I must upgrade my AutoIt3 to the newest version. This script works fine however, providing you have the correct Excel template which has to be created first. Edited September 15, 2006 by czardas operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
Achilles Posted September 15, 2006 Share Posted September 15, 2006 How do I post a large script? I'm not sure if it will appear correctly. CODE: AutoIt Opt("SendKeyDelay", 10) $Year = InputBox ("START DATE", "Enter the year (4 figures)", "") $Month = InputBox ("START DATE", "Enter the month 01 - 12", "") Run("notepad.exe") WinWaitActive("Untitled - Notepad") Send ($Month) ......... ...... ... . My Programs[list][*]Knight Media Player[*]Multiple Desktops[*]Daily Comics[*]Journal[/list] Link to comment Share on other sites More sharing options...
czardas Posted September 15, 2006 Author Share Posted September 15, 2006 Will do that next time. I plan on rewriting this module later because I think that it's a bit clumsy in places. I have first to get the whole system functioning so that I can use it. It will save me hours of trying to balance my books. operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
czardas Posted September 15, 2006 Author Share Posted September 15, 2006 Here's the file if anyone wants to see it. operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
Locodarwin Posted September 15, 2006 Share Posted September 15, 2006 Here's the file if anyone wants to see it.My suggestion, for the future, is to re-write this thing from scratch. I can see how it would become unwieldy for you considering you've got a ton of keystroke sends to organize. I can sympathize, believe me.First and foremost, you should consider using AutoIt's COM capabilities to automate Excel. There is a great ExcelCOM include file written by Randallc which may be of some help (search the forums for "ExcelCOM") - or, if you're willing to wait a little while, I'm in the process of cleaning up one I've written that might be easier to use.If you're already familiar with using COM in AutoIt, then you're just a skip away.The problem with sending keystrokes is that, as I'm sure you've noticed, it's too easy to lose control of your script once it gets to automatin'. Click the mouse on a wrong window while it's running and you've got a mess. There's a way to shut off user input during the run, but that's not always a good solution, either.It's worth investing the time in COM.-S (Yet Another) ExcelCOM UDF"A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly...[indent]...specialization is for insects." - R. A. Heinlein[/indent] Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now