13.11.2020, 19:00 (Dieser Beitrag wurde zuletzt bearbeitet: 13.11.2020, 19:00 von Andrek.)
Hallo,
ich habe eine Animation Makro - die einen Element/Bild bewegen tut. Sowas habe ich für mein kleines Projekt gesucht/gebraucht.
Code:
Sub animation() Randomize
For j = 1 To [F3].Value ActiveSheet.Shapes("Bild").Select m = 200 For i = 1 To 190 Selection.ShapeRange.Top = m m = m - 1 DoEvents Next i
For i = 1 To 190 Selection.ShapeRange.Top = m m = m + 1 DoEvents Next i Next j [F3].Select
End Sub
Ich brauche eure Hilfe zum optimieren: :23:
1) wie kann ich die Bewegungsgeschwindigkeit einstellen => in meinem Fall möchte ich das mein Objekt langsamer bewegt wird.
2) mit START ist klar, aber mit welcher Funktion kann ich die Bewegung(Makro) vorzeitig beenden. Wenn beim start 10 Runden eingestellt waren, aber dann doch nach 5 Runden möchte ich das Bild stoppen.
13.11.2020, 19:51 (Dieser Beitrag wurde zuletzt bearbeitet: 13.11.2020, 19:51 von volti.)
Und hier der zweite Teil...
Code:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Const cbAbbruch = 5 Const ciCancelKey As Long = 27 Public gbAbbruch As Integer
Sub animation() gbAbbruch = 0 Randomize
For j = 1 To [F3].Value ActiveSheet.Shapes("Bild").Select m = 200 For i = 1 To 190 Sleep 20 Selection.ShapeRange.Top = m m = m - 1 DoEvents If AskForCancel() = cbAbbruch Then GoTo Schluss Next i
For i = 1 To 190 Selection.ShapeRange.Top = m Sleep 20 m = m + 1 DoEvents If AskForCancel() = cbAbbruch Then GoTo Schluss Next i Next j Schluss: [F3].Select
End Sub
Function AskForCancel() 'Funktion fragt nach Betätigung der Abbruchtaste noch mal nach If GetAsyncKeyState(ciCancelKey) <> 0 Then AskForCancel = cbAbbruch: gbAbbruch = cbAbbruch End If End Function
______________________ viele Grüße aus Freigericht Karl-Heinz
Folgende(r) 1 Nutzer sagt Danke an volti für diesen Beitrag:1 Nutzer sagt Danke an volti für diesen Beitrag 28 • Andrek
jetzt stolpere jetzt einbißchen: wie führe ich jetzt die Funktion AskForCancel() aus das meine Bewegung ohne Alarm und am besten ohne vorige Abfrage unterbrochen wird?
Noch besser wäre, wenn ich über ein Button z.B. Sub stop() die Animation sofort stoppen kann..
Hallo, Du führst die Funktion gar nicht aus, sie wird ja aus Deinem Makro aufgerufen. Dort wird die ESC-Taste abgefragt und wenn Du die gedrückt hast, wird Dein Makro beendet. Wenn eine Sub läuft, kannst Du keine andere z.B. Sub Stop ausführen. VG KH
Ok, über "ESC" funktioniert das, aber das ist nicht genau wie ich es wollte.
Ich versuch nochmal zu erklären(bißchen genauer) ich werde 3-4 verschiedene(gleiche von Aufbau) Animationen haben wo ich jede Animationen per Start starte - so weit ist alles OK, 3 x START Makro(Nr1, Nr.2, Nr.3) .. Aber jetzt möchte ich z.B. die Animation Nr.2 stoppen, so das die andere 2 weiterlaufen! Dafür brauche bei jede Animation einem STOP-Button.
es werden in Wirklichkeit 3 Filter die ich jeden einzeln per Button EIN- und AUS-schalten kann und eine Animation wird mir dann die Filtrierung optisch darstellen.
Hoffentlich ist jetzt mein Vorhaben bißchen deutlicher geworden!
wenn es bei den Buttons bleiben soll könntest Du z.B. 3 Public-Variablen deklarieren und bei Betätigung eines Buttons die jeweils zugehörige auf true setzen oder ins Gegenteil verkehren. Im Makro fragst Du den Status ab und brichst bei true ab. Das wäre dann oben drüber
Public bolBtn1 as Boolean, bolBtn2 as Boolean, bolBtn3 as Boolean
Im Button-Click-Makro z.B. des ersten Buttons
'... bolBtn1 = not bolBtn1 'verkehrt ins Gegenteil '...
Im Makro dann z.B. beim ersten Bild
'... If bolBtn1 = False Then 'Animation 1 End If '...
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:1 Nutzer sagt Danke an schauan für diesen Beitrag 28 • Andrek
ordne einem Stop-Button das Stoppen-Makro zu. Dann sollte es gehen.
Code:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Const cbAbbruch = 5 Public gbAbbruch As Integer
Sub Stoppen() gbAbbruch = cbAbbruch End Sub
Sub animation() gbAbbruch = 0 Randomize
For j = 1 To [F3].Value ActiveSheet.Shapes("Bild").Select m = 200 For i = 1 To 190 Sleep 20 Selection.ShapeRange.Top = m m = m - 1 DoEvents If gbAbbruch = cbAbbruch Then GoTo Schluss Next i
For i = 1 To 190 Selection.ShapeRange.Top = m Sleep 20 m = m + 1 DoEvents If gbAbbruch = cbAbbruch Then GoTo Schluss Next i Next j Schluss: [F3].Select
End Sub
______________________ viele Grüße aus Freigericht Karl-Heinz
Folgende(r) 1 Nutzer sagt Danke an volti für diesen Beitrag:1 Nutzer sagt Danke an volti für diesen Beitrag 28 • Andrek