Excel-VBA und 'Wait'

Hallo,
ich möchte in Excel eine Zeitschleife einbauen (es geht um kleine Spiele und deren Animation). Dazu habe ich das in der Hilfe gebrachte Beispiel genommen

newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 1
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime

ich möchte aber einen Wert kleiner als 1 Sekunde haben - sonst siehts blöd aus und dauert zu lange. Wenn ich 0.7 eingebe rundet er auf (?) und wenn ich 0.5 eingebe scheint er stehen zu bleiben.
Wie kann man das Ganze auf z. B. 0.1 Sek zu reduzieren?

Danke im Voraus
Tobi@s

Hallo Tobi@s,

welches Excel? Kennt das ‚Timer‘?

Wenn das Programm in der Wartezeit dann noch reagieren soll, dann funktionier damit das hier:

Private Sub warte(ByVal Zeit As Double)
 Dim tm As Double
 tm = Timer + Zeit
 While tm \> Timer
 DoEvents
 Wend
End Sub

Aufruf mit:

warte 0.1

Nachteil: die Warteschleife verbraucht Rechenzeit, die Prozessorauslastung ist bei 100%.

Oder das Programm einfrieren, dann verbraucht es keine Rechenzeit, der Prozessor wird vom Programm nicht belastet, aber das Programm tut in der Wartezeit gar nichts. Das geht über die API:

In die Deklaration:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

und der Aufruf ganz einfach mit:

Sleep 100

für eine Wartezeit von 100 Millisekunden, also einer Zehntel Sekunde.

Gruß Rainer

Hallo Rainer,

ich danke dir. Hab das mit Sleep ausprobiert - bei meinem 4Gewinnt klappt es ganz prima. Als ich es jedoch gleich in meinen „Würfel“ einbauen wollte scheint es nicht zu klappen.
Hier der Gedanke:
ich habe einen Würfel (UserForm mit 7 „Farbfeldern“) die bei jedem Wurf eben die entsprechenden Felder sichtbar und unsichtbar macht um die gewürfelte Zahl grafisch darzustellen. Soweit alles iO.
Jetzt wollte ich aber auch ihn animieren und dass er sozusagen „rollt“ (ok, sowas kann ich nicht programmieren aber ich wollte dass er den Würfelvorgang eben 5 oder 10 mal durchführt - so dass in dem Sinne eine Animation passiert).

Hier der (wichtigste) Code:

For I = 1 To 5 'Anzahl der Durchläufe
Call Ausblenden 'Alle Felder ausblenden
Call Würfeln 'Würfeln und richtige Felder einblenden
Sleep 50 'Pause
Next

Wenn ich ihn starte zeigt er mir erst die tatsächlich letzte Zahl an, alles andere nicht - auch nicht wenn ich den Sleep auf 800 setze. Normalerweise müsste er ja eine Zahl anzeigen (Pause), neu würfeln, Zahl anzeigen (Pause) - je nach Durchläufen.

LG

Hallo,

Hier der (wichtigste) Code:

For I = 1 To 5 'Anzahl der Durchläufe
Call Ausblenden 'Alle Felder ausblenden
Call Würfeln 'Würfeln und richtige Felder einblenden
Sleep 50 'Pause
Next

die Prozedur ‚Würfeln‘ wäre auch noch interessant gewesen. Wozu ‚Ausblenden‘ verstehe ich nicht, würde ich nicht brauchen.

Schreib mal dazwischen noch ein

Picture.Refresh

Dann wird es wohl funktionieren.

Gruß Rainer

Hallo Rainer,

die „Felder“ für den Würfel sind einfache Labels (soll erst mal einfacher Code sein - bring gerade meinem Sohn das proggen bei).

Jetzt ist der Ablauf ganz einfach:
mit „Ausblenden“ setzt er alle Labels auf Visible = False
mit „Würfeln“ erstellt er eine Zufallszahl und setzt die Labels (mittels Select Case) mit Visible auf True die tatsächlich bei der Zahl vorkommen.

LG

PS. Picture.Refresh klappt nicht. Zum einen weil der Befehl nicht existiert (Excel 2003 hab ich glaub ich *g*) und zum anderen weil ich kein Picture verwende.

Hi,

die „Felder“ für den Würfel sind einfache Labels (soll erst
mal einfacher Code sein - bring gerade meinem Sohn das proggen
bei).

Ach so, keine Grafik. OK, das hatte ich nur falsch verstanden.

Jetzt ist der Ablauf ganz einfach:
mit „Ausblenden“ setzt er alle Labels auf Visible = False
mit „Würfeln“ erstellt er eine Zufallszahl und setzt die
Labels (mittels Select Case) mit Visible auf True die
tatsächlich bei der Zahl vorkommen.

OK.

PS. Picture.Refresh klappt nicht. Zum einen weil der Befehl
nicht existiert (Excel 2003 hab ich glaub ich *g*) und zum
anderen weil ich kein Picture verwende.

Ja, klar. :smile: Dann entweder NameDerForm.Refresh, oder ganz einfach ein DoEvents.

Gruß Rainer

UserForm1.Repaint

hat geholfen. Danke für den Gedankenanstoß. Jetzt „würfelt“ er richtig gut *g*.

LG