08. oktober 2008 - 11:38Der er
11 kommentarer og 1 løsning
alternativ til goto
Er det muligt at springe ud af en loop til den samme sub (ligesom en goto) men når proces pointeren når til sin afslutning, skal den fortsætte tilbage til hvor den kom fra (loop'en)
altså
sub test() do while i < 100 goto something i=i+1 loop
something: MsgBox "i er blevet større"
end sub
dette vil aldrig tælle "i" op, for goto dræber min løkke, jeg ønsker at fortsætte løkken, men at kunne køre min sub til end sub.
Spørgsmålet er hvorfor du vil lave det inden for din sub. Det mest logiske ville være at lave et kald til en enden sub, med de relevante variable overført som parametre (selv om man selvfølgelig også kan declarere variablerne som public på modulniveau, sådan som sorenstrom viser). Det mest logiske (efter min mening :-) ville være at kode det som:
Private Sub test() Dim I As Integer Do While I < 100 I = I + 1 Something(I) Loop End Sub Private Sub Something(Parmværdi As Integer) MsgBox "I er blevet større: " & Parmværdi End Sub
Eksemplet var bare et tænkt eksempel, og ikke selve problemet, det er nødvendigt at jeg kører min sub færdig da det er en initialiserings sub (det er VBA) og jeg ønsker at lave en cyclic task (med doevents) inden initialiseringen er færdig, men initialiseringen skal også have lov til at blive færdig.
beklager at min problembeskrivelse var noget vag. håber det giver mere mening nu.
Du spørger: "Er det muligt at springe ud af en loop til den samme sub (ligesom en goto) men når proces pointeren når til sin afslutning, skal den fortsætte tilbage til hvor den kom fra (loop'en)"
Hvad var der i vejen med mit eksempel, det gør det du spørger om.
Men jeg ville også lave det som kjulius skriver, hvis jeg skulle bestemme.
Hvis du i din initieringskode indsætter en DoEvents, vil det midlertidigt tillade andre rutiner at eksekvere, f.eks. hvis du har en Timer event på en form (SplashScreen) du tidligere har loaded, som skal ændre lidt på hvad din SplashScreen viser (Rotere et billede, f.eks., for at indikere, at der altså sker noget i baggrunden). Når koden på formens Timer event så er færdig, vil kontrollen igen blive givet fri, hvilket vil betyde at din kode vil fortsætte fra din DoEvents igen.
Det er mig bekendt kun kode på en Event på en form (og vel også på en kørende rapport), som vil blive udført, når du angiver DoEvents. Du kan altså ikke "kalde" to forskellige rutiner, og køre dem parallelt. Du kan højst simulere det, ved at åbne en form og med mellemrum fyre en timer event af.
Kabbak: Efter end sub kører den noget low-level kode jeg har brug for den kører, problemet med dit eksempel er at du selv definerer hvornår den skal returnere - det er ikke brugbart. Den skal returnere efter den når slutningen af sub'en (end sub).
Har lavet det med en timer, selvom det ikke er optimalt.
Tja, jeg må give kabbak ret, ud fra den opgavebeskrivelse du gav, blev opgaven løst (i indtil flere versioner). ;-)
Selv efter dine uddybende forklaringer, er det svært at gennemskue, hvad du egentlig var på jagt efter. Ja, jeg vil nærmest påstå, at din forklaring til kabbak 10/10-2008 11:50:15 mere ligner vildledning end vejledning. Jeg fatter i hvert fald intet.
Der står altså i opgavebeskrivelsen at den skal køre til end sub. I den samme sub som goto kommer i.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.