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.
„Wait“ geht nur im Sekundentakt, auch macht das Objekt keine Zwischenschritte.
Schleifen mit For i1 = 1 to 30000 gehen nicht.
In allen Fällen springt es zum Schluss von A nach B.
Alle Versuche, eine kurze Pause von, sagen wir 10 oder
100 msec zu machen gelingen nicht.
„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.
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.
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!
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: