Wait, Warten, kurzes Anhalten einer Prozedur

Guten Abend,

ich möchte ein Objekt (Steuerelement) in einer Userform von einem Punkt zu einem anderen in mehreren Schritten gleiten lassen. Alle Versuche, eine kurze Pause von, sagen wir 10 oder 100 msec zu machen gelingen nicht.

  1. „Wait“ geht nur im Sekundentakt, auch macht das Objekt keine Zwischenschritte.
  2. Schleifen mit For i1 = 1 to 30000 gehen nicht.
    In allen Fällen springt es zum Schluss von A nach B.

Wer weiss, was zu tun ist?

Danke
Laika

Alle Versuche, eine kurze Pause von, sagen wir 10 oder
100 msec zu machen gelingen nicht.

  1. „Wait“ geht nur im Sekundentakt, auch macht das Objekt
    keine Zwischenschritte.

Hallo Laika

Vielleicht hilft Dir folgendes - als Anregung - weiter. Grüsse Niclaus

Option Explicit
Private Declare Sub Sleep Lib "kernel32.dll" ( \_
 ByVal dwMilliseconds As Long)

Sub Makro2()
Dim i
Range("B9").Select

For i = 1 To 10

 With Selection.Interior
 .Pattern = xlSolid
 .PatternColorIndex = xlAutomatic
 .Color = 65535
 .TintAndShade = 0
 .PatternTintAndShade = 0
 End With

Sleep 100
 With Selection.Interior
 .Pattern = xlNone
 .TintAndShade = 0
 .PatternTintAndShade = 0
 End With

Sleep 100
Next i
End Sub

Danke Niclaus, aber funktioniert nicht. Habe die Prozedur etwas erweitert und damit experimentiert:

Const ZEIT% = 300
Const SCHRITTE% = 10
Dim i
Range("a1:f1").Select
'ActiveSheet.Shapes("Text Box 11").Select
For i = 1 To SCHRITTE

' Selection.ShapeRange.IncrementLeft 20#
' Selection.ShapeRange.IncrementTop 10

 With Selection.Interior
 .Pattern = xlSolid
 .PatternColorIndex = xlAutomatic
 .Color = 65535
 End With

Sleep ZEIT
 With Selection.Interior
 .Pattern = xlNone
 End With

Sleep ZEIT
Next i

Bei bis zu ca. 10 Schritten läuft es normal durch, bei mehr beibt es stehen, die Einfärbung wechselt nicht mehr für den Rest der Zeit. Nach diesen ca. 10 Schritten erscheint in der Taskleiste ein neues Fenster „Microsoft Excel“, hinter dem bei Anklicken aber nichts anderes als meine ursprüngliche Mappe steckt. Nach Ablauf der Gesamtzeit, d.h. aller Schritte verschwindet es wieder.
Das gleiche Verhalten mit dem Verschieben einer Textbox: Sie verschiebt sich ca. 10 mal, bleibt dann stehen und springt zum Schluss in die Endposition.
Jetzt wird es interessant: Wenn ich eine Zeile

Range("f1").Value = i

in die Schleife einbaue, also lediglich das Schreiben der Variablen i in eine Zelle: Dann läuft es durch! Auch dann, wenn ich eine sehr kurze Zeit = 50 und viele Schritte = 100 einbaue.

Die Methoden

TintAndShade

wird bei mir (Office 2003) mit Fehler abgewiesen.

Gruss
Laika

Ergänzung
Es funktioniert, wenn ich ein Textfeld in der Tabelle bewege. Wende ich das Gleiche auf ein Objekt in einer Userform an, geht es nicht.
Rätsel … irgendwas läuft da intern in der VBA-Steuerung, das das Ganze blockiert.

Hallo laika,

schreib mal unter jedes Sleep noch ein DoEvents.

Gruß, Andreas

1 Like

schreib mal unter jedes Sleep noch ein DoEvents.

Hallo Andreas

Ich hatte das gleiche Problem wie Laika, wenn ich i = 1 To 100 setzte. Mit Deinem Hinweis auf DoEvents ist bei meinem Test-Makro das Problem gelöst. Vielen Dank!

Grüsse Niclaus

Hallo laika,

Rätsel … irgendwas läuft da intern in der VBA-Steuerung, das
das Ganze blockiert.

Es fehlt das DoEvents.

Das Problem liegt im Aufbau eine Windows-Programmes.
Grundsätzlich werden alle Aktionen als Meldung an ein Programm abgesetzt, also z.B. auch die Anweisung ein Element neu zu zeichnen.

Das, normalerweise versteckte, Hauptprogramm einer Anwendung besteht aus einer Schlaufe, welche eine Meldung aus der Queue nimmt, diese dekodiert und dann die entsprechende Funktion aufruft.

Dein eigentliches Programm ist nur einer dieser Aufrufe.

Besteht nun dein Programm nur aus einer Endloschleife, werden die aufgetretenen Meldungen nicht mehr abgearbeitet du deshalb dein Befehl zum neu Zeichen des Elements nicht ausgeführt.

Mit DoEvents wird die Hauptschleife einzeln aufgerufen und jedesmal eine Meldungen abgearbeitet.

Das Problem dabei ist, dass deine Zeitschleife dadurch nur eine Minimalvorgab ist. ei jedem Aufruf von DoEvens kommt noch die Verarbeitungszeit für die Meldungen hinzu.

Da DoEvents immer nur ein Meldung abarbeitet sollte man so etwas bevorzugen:

 For I = 1 To 10
 Sleep 10
 DoEvents 
 Next I

oder

 For I1 = 1 To 30000
 DoEvents
 Next I1

MfG Peter(TOO)

1 Like

Danke an Euch …
… mit DoEvents klappt es !

Schönen Tag und Sternchen
Laika