我在VBA上创建自己的Conway's Game of Life,其中当前状态显示在工作表上。
因为我不熟练,实现可能效率不高(我使用2个布尔矩阵来模拟当前状态和下一个状态)。
为了在每一步显示结果,我sub display()
取了matrix_current
并将每个单元格用黑色或白色着色。为了使整个过程更顺畅,我已经包裹了Application.ScreenUpdating = False
和Application.ScreenUpdating = True
。短篇小说,看起来像是:
Private Sub display()
Application.ScreenUpdating = False
For i = 0 To sizeGrid
For j = 0 To sizeGrid
If matrix_curr(i, j) Then
Cells(i + xmin, j + ymin).Interior.ColorIndex = 1
Else
Cells(i + xmin, j + ymin).Interior.ColorIndex = 2
End If
Next
Next
Application.ScreenUpdating = True
End Sub
在每个Call display()
之前,我调用方法Sleep()
让我们有时间观察每一步。
所以,这是我的问题: 工作表上的显示通常在经过多个步骤后停止。但是,程序仍在运行,最后显示最后一个状态。基本上,我可以监控开头,然后在显示的最后一步之前没有任何变化。 一切都好像工作表突然停止刷新一样。
你有任何想法来解决这个问题。
我事先感谢你的帮助(希望我能让自己理解 尽管我的英语很差)
答案 0 :(得分:2)
我的问题是,经过多个步骤后,屏幕上不再发生任何事情(就好像它已冻结一样)。
那是因为Excel基本上没有气息 - 它基本上无法跟上所有ScreenUpdating
切换。
当您将Application.ScreenUpdating
切换回一次时,Excel会通过重新绘制来自行回应。
当您运行繁忙的循环时,它优先执行VBA代码并且Excel用户界面会:
(not responding)
这很正常:需要处理很多事情,所以要处理它们 - 更新用户界面,提升工作表事件,响应用户操作,计算单元格,所有这些事情"删除优先级",直到VBA代码完成。
重新尝试切换DoEvents
后立即尝试添加Application.ScreenUpdating
指令;这明确告诉Excel"好吧,继续,处理你已经得到的任何其他东西,然后在你准备好时回到这里"。我热烈建议您关闭Application.EnableEvents
并将Application.Calculation
设置为xlCalculationManual
,直到代码完全执行。