MS Excel Makro Pausieren ohne Excel komplett zu pausieren?

... komplette Frage anzeigen

4 Antworten

Ich hab mir mal deine Prozedur genommen und sie ein bisschen umgebaut. (Achtung, du musst die Zellbezüge wieder richtig einstellen). Die While-Schleife ist jetzt weg, dafür ist die Methode "Application.OnTime" jetzt drin. Die sorgt dafür, dass die Funktion jede Sekunde einmal aufgerufen wird, wodurch der Zähler runtergezählt wird. Es kann sein, dass ab und zu eine Sekunde übersprungen wird, deshalb sollte man vielleicht anstatt mit den Variablen "SE" und "MN" mit einer Date-Variable arbeiten, die beim ersten Start gefüllt wird und die echte Zeitdifferenz seit dem Programmstart anzeigt.

Sub Schaltfläche1_Klicken()
Dim SE As Integer
Dim MN As Integer

SE = Sheets(1).Range("B1").Value
MN = Sheets(1).Range("A1").Value

If SE > 0 Then
SE = SE - 1
Sheets(1).Range("B1").Value = SE
Application.OnTime DateAdd("s", 1, Now), "Schaltfläche1_Klicken"
Else
If MN > 0 Then
MN = MN - 1
SE = 59
Sheets(1).Range("B1").Value = SE
Sheets(1).Range("A1").Value = MN
Application.OnTime DateAdd("s", 1, Now), "Schaltfläche1_Klicken"
Else
Range("A1:L30").Value = ""
End If
End If

End Sub
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von daCypher
29.09.2016, 11:57

Andere Variante, die für dich aber wahrscheinlich eher uninteressant sein wird:

Ich hab mir irgendwann mal den Spaß gemacht, und Snake in Excel programmiert. Leider finde ich die xls nicht mehr. Jedenfalls hab ich da soweit ich weiß diese beiden Libs verwendet:

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

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal nVirtKey As Integer) As Integer

Mit Sleep kannst du angeben, wieviele Millisekunden die Anwendung pausieren soll. Mit GetAsyncKeyState kannst du einzelne Tasten abfragen, ob sie grade gedrückt sind. Bei meinem Snake-Programm hab ich damit halt die Cursor-Tasten und die ESC-Taste abgefragt. Alles andere war zur Laufzeit nicht bedienbar.

1

Das einfachste wäre es, beim Start des Spiels die Uhrzeit festzuhalten und nach jeder (relevanten) Aktion zu prüfen, ob die neue, aktuelle Uhrzeit über dem Limit liegt.

Der Vorteil ist, dass kein paralleler Thread laufen muss (Ich bin mir nicht einmal sicher, ob VBA das überhaupt kann).
Eventuell kommt doch das OnTimer-Ereignis, welches IamIam vorgeschlagen hat, für dich infrage. Wenn Spielzeit rum, wird der Timer ausgelöst.

Der Nachteil meines Vorschlags ist, dass eben nicht automatisch eine Meldung kommt, wenn die Zeit rum ist, sondern erst, wenn man probiert, die nächste Aktion durchzuführen.

Antwort bewerten Vielen Dank für Deine Bewertung

Es gibt zwar den Befehl

NeuZeit = Now + Frequenz
Application.OnTime NeuZeit, "xBlinkmakro"

Wobei Frequenz die Wartezeit ist und xBlinkmakro der Ort, in dem der Befehl steht, so dass es sich im Abstand von Frequenz selber immer wieder aufruft, aber das blockiert xl -wenn auch nicht völlig, so doch-unverschämt stark.

Besser ist es wohl, Du schreibst den aktuellen Wert Now immer wieder neben die Aktionszelle, wo Du auch die Auswahl für die Ziele tätigst (vermutlich ja als fortlaufende Liste, zur Vereinfachung Spieler A und B in der gleichen Zeile. Du kannst dann in einer weiteren Spalte immer wieder die Differenz zur Eingabe von Mitspieler (also Deine verbrauchte Bedenkzeit) bilden und die von einer Zwischensummenzelle sofort abziehen - soviel als allgemeine Anweisung, ich mag jetzt Deine speziellen Gegebenheiten nicht nachvollziehen.

Sowas kannst Du sowohl auf Deinem wie auch auf dem Blatt des Mitspielers anlegen oder auf einem gemeinsamen dritten Blattl, so dass keiner die Schiffe des anderen sieht.

Frag ggf zurück!

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von AntwortHunter
28.09.2016, 14:55

Sorry, ich kapier nicht ganz, wie du das meinst. Ich habe ein Spielfeld mit den Schiffen von Zelle A1 bis L30. Dort platziert man seine eigenen Schiffe indem man die zugehörige Nummer einträgt. Danach Wechselt der erste Spieler auf ein anderes Arbeitsblatt, in dem er einträgt, ob in der Zelle, auf die er feuert ein Schiff war oder nicht. Wenn ein Schiff getroffen wurde, muss der Gegenüber das entsprechende Schiff gegen ein x austauschen. Der Timer soll dafür sorgen, dass das Komplette Spiel z.B. 10 Minuten dauern soll. Danach soll er die eigene Flotte löschen und auf das Blatt der Feindlichen Flotte wechseln, wo man schauen kann, ob man mehr Schiffe als der Gegner versenkt hat. Die Zeit stellt man über die beiden Zellen ein, die vom makro ausgelesen werden.

0

auf was soll das Makro warten? Wenn es nach einer Eingabe erst weitergehen soll, dann kannst Du das Makro nach dem SE=59 beenden und den restlichen Ablauf mit einem worksheet_change o.ä. starten.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von AntwortHunter
27.09.2016, 14:45

Danke für die schnelle antwort. Das makro soll einfach herunterzählen im Sekundentakt und nachdem MN und SE beide 0 erreicht haben einfach das Spielfeld der Eigenen Flotte leeren, weil es zählt, wie viele teile von Schiffen versenkt wurden. Das trägt man auf nem anderen Arbeitsblatt ein.

0

Was möchtest Du wissen?