Ekran nie został zaktualizowany po N iteracjach - excel, vba, excel-vba, while-loop, crash

Prowadzę bardzo prostą grę w stylu "Węża" na moimexcel, co oznacza, że ​​ekran powinien być aktualizowany w sposób ciągły, wewnątrz pętli main-while. "Wąż" (w zasadzie kolorowa komórka) porusza się losowo w obrębie stołu 20x20.

Działa dobrze przez kilka sekund, jednak w pewnym momencie ekran przestaje się aktualizować; program Excel przestaje odpowiadać, a jednocześnie nadal wykonuje kod. To prowadzi do awarii.

Wymieniłem pętlę while na pętlę For, którazapobiega awariom, ale mimo to ekran przestaje się aktualizować, dopóki pętla nie zostanie zakończona. Kiedy pętle się zatrzymają, ekran jest aktualizowany po raz ostatni. Zawarłem także instrukcje "Sleep" po każdej funkcji, jednak to nie pomaga. Oto główny kod:

    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

Zauważ, że problem polega na naprawie ekranu. Jak wspomniano wcześniej, nie wiem, jak zmusić program Excel do ciągłego aktualizowania ekranu

Wielkie dzięki,

Denis

Odpowiedzi:

1 dla odpowiedzi № 1

Powinieneś chyba porzucić to Sleep(200) i pozwól obiektowi aplikacji Excel wykonać trochę przetwarzania na 200 milisekund.

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

The timer > 0.200 Jest to ważne, ponieważ Timer resetuje się o północy i nie chciałbyś, aby wszystko zatrzymywało się przez 24 godziny, jeśli przekroczysz północ w tym czasie.


Menu