在Loop VBA中Shapes.Visible真和假

时间:2017-10-27 14:40:57

标签: excel vba excel-vba

我想要显示这段代码并逐个隐藏一些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

2 个答案:

答案 0 :(得分:3)

DoEvents允许其他代码(例如Excel自己的代码)运行和处理用户点击另一个工作表(调用任何Worksheet.ChangeWorkbook.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)

在切换DoEventsTrue之后设置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