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.ChangeWorkbook.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 

通过在切换TrueFalse之后设置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