gpt4 book ai didi

excel - 闪烁动画被 DoEvents 中断

转载 作者:行者123 更新时间:2023-12-02 11:33:17 25 4
gpt4 key购买 nike

我在 Excel VBA 中编写了一些简单的代码,使某个范围“闪烁”某种颜色 - 这是通过在相关范围上仔细绘制一个矩形对象并改变其透明度以使该框逐渐淡出来实现的。

以下是 Worksheet_Change 事件的代码(在 Sheet1 中):

Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub flashBox(ByVal area As Range, Optional ByVal fillColour As MsoRGBType = vbGreen)

Const animationSeconds As Single = 0.5
Const animationSteps As Long = 20

With area.Worksheet.Shapes.AddShape(msoShapeRectangle, area.Left, area.Top, _
Application.WorksheetFunction.Min(area.Width, 1000), _
Application.WorksheetFunction.Min(area.Height, 1000)) 'stop infinite boxes, could use view area to define this
.Line.Visible = msoFalse
.Fill.ForeColor.RGB = fillColour
Dim i As Long
For i = 1 To animationSteps
Sleep animationSeconds * 1000 / animationSteps
.Fill.Transparency = i / animationSteps
DoEvents 'screen repaint
Next i
.Delete
End With
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
flashBox Target, ColorConstants.vbMagenta
End Sub

我使用 With block 来包含没有父变量的临时对象(我认为它非常简洁,并希望保持这种方式)。该问题是由 DoEvents 调用引起的(需要强制重新绘制动画屏幕)。

动画是从某些工作表更改事件中调用的,如果调用子的第二个实例(或者实际上,如果发生任何事件,似乎),第一个实例将终止一半,并且永远不会完成 - 这意味着临时形状永远不会被删除。

这是一个显示我正在谈论的内容的插图: Demo Gif

我该如何解决这个问题?

最佳答案

这更像是一次锻炼,而不是一个解决方案,但从技术上讲,它完成了工作

如果您在 flashbox 过程运行时禁用用户输入,它将等待动画完成,然后才重新启用它,您可以避免动画保持卡住状态

Private Sub Worksheet_Change(ByVal Target As Range)
Application.Interactive = False
flashBox Target, ColorConstants.vbMagenta
Application.Interactive = True
End Sub

enter image description here

我会看看是否可以“正确”解决这个问题,但现在这是一个很好的解决方法:)

关于excel - 闪烁动画被 DoEvents 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56093001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com