循环 VBA 中的 Shapes.Visible True 和 False

问题描述 投票:0回答:3

我有这段代码,我想一一显示和隐藏一些 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
vba excel
3个回答
3
投票

DoEvents
允许其他代码(例如Excel自己的)运行和处理诸如用户单击另一个工作表(调用任何
Worksheet.Change
Workbook.WorksheetChange
处理程序)之类的事情...或者只是重新绘制自身。

通过每个循环调用一次

DoEvents
,Excel 没有机会在可见性切换之间重新绘制:它已经忙于运行循环了。

因此,您需要打开可见性,让 Excel 重新绘制 (

DoEvents
),休眠动画延迟(500 毫秒在我看来有点慢),然后关闭可见性 并让 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

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

0
投票

有可能在 Office 2021 中不起作用吗? 问候

© www.soinside.com 2019 - 2024. All rights reserved.