Excel 如何在睡觉前更新图像?

Excel 如何在睡觉前更新图像?,excel,vba,Excel,Vba,我正在尝试移动一张图片,然后让代码休眠一段时间。问题是,图片的位置在“睡眠”之前不会更新。代码如下: Worksheets("Sheet1").Shapes("Picture1").IncrementLeft 100 Sleep 500 当我执行此代码时(通过按钮调用sub),直到“sleep 500”结束,图片的位置才改变 如何在睡觉前更新图片?如果您也能向我解释这一点,我将不胜感激 使用DoEvents更新: 我创建了一个新的excel文件,其中只有图片和按钮,以及以下代码(完整代码):

我正在尝试移动一张图片,然后让代码休眠一段时间。问题是,图片的位置在“睡眠”之前不会更新。代码如下:

Worksheets("Sheet1").Shapes("Picture1").IncrementLeft 100
Sleep 500
当我执行此代码时(通过按钮调用sub),直到“sleep 500”结束,图片的位置才改变

如何在睡觉前更新图片?如果您也能向我解释这一点,我将不胜感激


使用DoEvents更新: 我创建了一个新的excel文件,其中只有图片和按钮,以及以下代码(完整代码):

但它仍然不起作用。还是我误解了“DoEvents”的用法?如果我是愚蠢的,我道歉


使用GetTickCount进行更新并从braX得到建议:我正在使用另一个WinAPI GetTickCount作为DoEvent循环的计时器。现在它似乎工作的时间间隔较小

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub Button1_Click()
Move_Right_With_Time "Sheet1", "Picture1", 50, 100
Move_Right_With_Time "Sheet1", "Picture1", 80, 200
Move_Right_With_Time "Sheet1", "Picture1", 300, 300
Move_Right_With_Time "Sheet1", "Picture1", 20, 400
End Sub

'time_gap represent the time slept after moving
Sub Move_Right_With_Time(worksheet As String, shape As String, time_gap As Long, distance As Double)
Dim start_timer As Long

Worksheets(worksheet).Shapes(shape).IncrementLeft distance

start_timer = GetTickCount
While GetTickCount < start_timer + time_gap
DoEvents
Wend

Sleep time_gap

End Sub

Public声明PtrSafe子睡眠库“kernel32”(ByVal毫秒为LongPtr)
私有声明函数GetTickCount Lib“kernel32”()的长度为
子按钮1\u单击()
用时间“Sheet1”、“Picture1”、50、100向右移动
用时间“Sheet1”,“Picture1”,80200向右移动
用时间“Sheet1”、“Picture1”、300、300向右移动
用时间“Sheet1”,“Picture1”,20400向右移动
端接头
“时间间隔”表示移动后的睡眠时间
随时间向右移动(工作表为字符串,形状为字符串,时间间隔为长,距离为双)
变暗启动计时器,时间尽可能长
工作表(工作表).形状(形状).增加左距离
启动计时器=GetTickCount
当GetTickCount<开始计时器+时间间隔
多芬特
温德
睡眠时间间隔
端接头

改为这样做:

Sub Button1_Click()
  Dim dt as Date

  dt = DateAdd("s", 2, Now) ' 2 seconds
  Worksheets("Sheet1").Shapes("Picture 2").IncrementLeft 1000

  Do Until Now > dt
    DoEvents
  Loop

  ' more stuff here after the waiting is done
  Worksheets("Sheet1").Shapes("Picture 2").IncrementLeft 2000

End Sub

在这些行之间放置一个
DoEvents
。@braX感谢您的快速回复。在看到您的评论后,我尝试了此操作,但似乎不起作用。然后,您的其他代码中一定存在其他问题,但您没有包含这些问题。@braX我刚刚尝试创建一个新文件,但不知怎的,它仍然不起作用。这个新文件中的所有代码都在上面的更新中。哦,你在使用WinAPI吗?没有这个必要。。。你只需要一个循环,里面有一个doevents。非常感谢,这非常好用。然而,当我尝试用一个小的间隔来测试它时(例如,用0.25替换2),它运行时的最小实际间隔似乎是0.5秒左右。是否有任何方法可以进一步缩短此间隔,或者这只是一个硬件问题?可能,但有点复杂-链接似乎是格式化字符串并将其转换为数字,而不是处理日期(或者我是否误解了?)……当我使用WinAPI GetTickCount进行另一次更新以处理DoEvent循环时,现在感觉像是用更小的时间间隔工作。
Sub Button1_Click()
  Dim dt as Date

  dt = DateAdd("s", 2, Now) ' 2 seconds
  Worksheets("Sheet1").Shapes("Picture 2").IncrementLeft 1000

  Do Until Now > dt
    DoEvents
  Loop

  ' more stuff here after the waiting is done
  Worksheets("Sheet1").Shapes("Picture 2").IncrementLeft 2000

End Sub