Loop VBA中的Shapes.Visible True和False
我有这个代码,我想要显示和隐藏一些Shape对象一个接一个,为了做一个小animation。 但是,代码执行时没有任何反应,代码停止运行时所有图像都会显示一次。
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
),睡觉为您的animation延迟(500毫秒似乎是一个缓慢的IMO),然后closures能见度,让Excel再次重绘 ,即再次调用DoEvents
。
如果Game
工作表在ThisWorkbook
,那么我会热烈地build议你给它一个CodeName
– 在Project Explorer中select它,然后查看它的属性(F4)并将它的(Name)
改为GameSheet
。
这给你一个全局范围的对象variables,所以你不需要每次迭代两次取消引用相同的工作表 – 甚至可以解除引用它的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
通过在切换True
和False
之后设置DoEvents
修改代码,现在它可以工作:
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