我有这段代码,我想一一显示和隐藏一些 Shape 对象,以便制作一些动画。然而,代码执行时什么也没有发生,当代码停止运行时,所有图像都会显示一次。
Sub test()
For i = 1 To 4
Sheets("Game").Shapes("North" & i).Visible = True
Sleep 500
'Sheets("Game").Shapes("North" & i).Visible = False
'by setting it to false i'd like to achieve the animation effect
Debug.Print i
DoEvents
Next i
End Sub
DoEvents
允许其他代码(例如Excel自己的)运行和处理诸如用户单击另一个工作表(调用任何Worksheet.Change
或Workbook.WorksheetChange
处理程序)之类的事情...或者只是重新绘制自身。
通过每个循环调用一次
DoEvents
,Excel 没有机会在可见性切换之间重新绘制:它已经忙于运行循环了。
因此,您需要打开可见性,让 Excel 重新绘制 (
DoEvents
),休眠动画延迟(500 毫秒在我看来有点慢),然后关闭可见性 并让 Excel 再次重新绘制,即调用 DoEvents
一个更多时间。
如果
Game
工作表位于 ThisWorkbook
中,那么我强烈建议您给它一个 CodeName
- 在 Project Explorer 中选择它,然后查看其属性 (F4) 并更改其 (Name)
比如说,GameSheet
。
这为您提供了一个全局范围的对象变量,这样您就不需要每次迭代两次取消引用同一个工作表 - 哎呀,您甚至可以仅取消引用其
Shapes
集合一次:
Private Const ANIMATION_DELAY As Long = 100
Sub test()
With GameSheet.Shapes
For i = 1 To 4
Dim currentShape As Shape
Set currentShape = .Item("North" & i)
currentShape.Visible = True
DoEvents
Sleep ANIMATION_DELAY
currentShape.Visible = False
DoEvents
Debug.Print i
Next
End With
End Sub
通过在切换
DoEvents
和 True
后设置 False
修改代码,现在它可以工作了:
Sub test()
For i = 1 To 4
Sheets("Game").Shapes("North" & i).Visible = True
DoEvents
Sleep 100
Sheets("Game").Shapes("North" & i).Visible = False
DoEvents
'by setting it to false i'd like to achieve the animation effect
Debug.Print i
Next i
End Sub
有可能在 Office 2021 中不起作用吗? 问候