我想要显示这段代码并逐个隐藏一些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
答案 0 :(得分:3)
DoEvents
允许其他代码(例如Excel自己的代码)运行和处理用户点击另一个工作表(调用任何Worksheet.Change
或Workbook.WorksheetChange
处理程序)...或者只是重新绘制的内容本身。
通过每个循环调用一次DoEvents
,Excel无法在可见性切换之间重新绘制:它已经忙于运行循环。
所以你需要切换可见性,让Excel重新绘制(DoEvents
),为你的动画延迟睡觉(500毫秒似乎有点慢IMO),然后切换的可见性并让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
答案 1 :(得分:0)
在切换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