Bildschirm nicht aktualisiert nach N Iterationen - Excel, VBA, Excel-VBA, While-Schleife, Absturz

Ich laufe ein sehr einfaches "Snake" -ähnliches Spiel auf meinemExcel, was bedeutet, dass ich den Bildschirm ständig aktualisieren muss, in meiner Main-While-Schleife. Die "Schlange" (im Prinzip eine farbige Zelle) bewegt sich zufällig innerhalb einer 20x20-Tabelle.

Es funktioniert gut für einige Sekunden, aber an irgendeinem Punkt stoppt der Bildschirm das Aktualisieren; Ein Excel reagiert nicht mehr, während der Code noch ausgeführt wird. Dies führt zu einem Absturz.

Ich ersetzte While-Schleife mit einer For-Schleife, dievermeidet Abstürze, aber der Bildschirm stoppt die Aktualisierung, bis die Schleife beendet ist. Wenn die Schleifen anhalten, wird der Bildschirm ein letztes Mal aktualisiert. Ich habe auch "Sleep" -Absätze nach jeder Funktion hinzugefügt, dies hilft jedoch nicht. Hier ist der Hauptcode:

    Sub main()
Dim table(20, 20) As Integer
Dim index_move As Integer
"Position class contains only X and Y parameters
Dim index_actual_head_pos As Position
Set index_actual_head_pos = New Position

Dim i As Long
index_actual_head_pos.x = 5
index_actual_head_pos.y = 15
Application.ScreenUpdating = True

For i = 1 To 50 "this remplaces the initial while loop
"next line generates a random movement, bounded by a 20x20 matrix
index_move = generer_movement(index_actual_head_pos)
"next line updates the "snake" position params
Call update_position(index_actual_head_pos, index_move)
"next line deletes previous snake and draws a new one
Call draw(index_actual_head_pos)
Sleep (200)
Next i
End Sub

Bitte beachten Sie, dass das Problem wirklich Bildschirmaktualisierung ist. Wie bereits erwähnt, weiß ich nicht, wie man Excel dazu bringt, den Bildschirm ständig zu aktualisieren

Danke vielmals,

Denis

Antworten:

1 für die Antwort № 1

Das solltest du wahrscheinlich aufgeben Sleep(200) und lassen Sie das Excel-Anwendungsobjekt stattdessen eine Verarbeitung für die 200 Millisekunden durchführen.

dim dTill as double   "should be at the top with the other var declarations

dtill = Timer + 0.200
do while timer < dTill and timer > 0.200: DoEvents: loop

Das timer > 0.200 Dies ist wichtig, weil der Timer um Mitternacht zurückgesetzt wird und Sie nicht möchten, dass er für 24 Stunden steht, wenn Sie während dieser ¼ Sekunde die Mitternacht überschreiten.


Speisekarte