【问题标题】:Shapes.Visible True and False within Loop VBAShapes.Visible 循环 VBA 中的真假
【发布时间】:2017-10-27 23:19:45
【问题描述】:

我有这段代码,我想一个一个地显示和隐藏一些 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

【问题讨论】:

  • Sleep 调用之前移动DoEvents 有什么帮助吗?
  • 你把这些形状藏在哪里了?你有没有在Visible = True之后尝试DoEvents,然后在Visible = False之后尝试DoEvents
  • Visible = True 之后设置DoEvents 然后在Visible = False 之后设置DoEvents 成功了!
  • 酷!我会在答案中解释原因。

标签: vba excel


【解决方案1】:

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

【讨论】:

  • 太棒了。我一定会按照你的提示给工作表一个CodeName
【解决方案2】:

在切换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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2018-07-31
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多