【问题标题】:Excel VBA: Screen doesn't refresh during loopExcel VBA:循环期间屏幕不刷新
【发布时间】:2017-02-22 06:43:34
【问题描述】:

我正在尝试让图像在循环发生时消失并重新出现。当我单步执行代码时,代码按预期工作,但是当我运行它时,屏幕不会更新,直到循环完成。

我已尝试添加诸如 DoEvents 和 ActiveWindow.SmallScroll 之类的东西,如发现 here 但似乎没有任何效果。我感觉这个问题可能与我的 PC/设置/Excel 版本有关,并且循环可能在某些人的机器上工作。如果你想试试,我已经上传了sample file here

我的代码是:

Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub ToggleImage()

For i = 1 To 20

Application.ScreenUpdating = True

ActiveSheet.Shapes("Picture 1").Visible = False
ActiveSheet.Shapes("Picture 2").Visible = True

ActiveSheet.Shapes("Picture 1").Visible = True
ActiveSheet.Shapes("Picture 2").Visible = False

Sleep 50


Next


End Sub

附上示例工作簿。

【问题讨论】:

  • 您为什么不尝试使用 >Application.Wait (Now + TimeValue("0:00:50"))
  • 嘿Vityata。不幸的是,我在使用 Wait 而不是 Sleep 时遇到了同样的问题。此外,您的时间不能短于 1 秒,因此循环 20 次需要的时间太长(20 秒)。不过还是谢谢。
  • 我有一个想法——你可以简单地放置一个 debug.print,它在循环中打印从 1 到 5000 的数字,它会使代码变慢,足以看到图片。 :) 没有任何睡眠和等待。它肯定会起作用。
  • 试过但没有运气:(它对你有用吗?
  • 嗯,我的意思是用户窗体,来自 VBEditor(模块和类所在的位置)。在表单中,作为一个元素,您可以添加一些图像(任意数量)。然后,一旦宏启动,您就可以使用它们的“可见”属性来决定显示哪个,不显示哪个。每个循环结束时都需要“FormName.Repaint”,以更新应该显示和不应该显示的图像。我希望我已经解释清楚了。

标签: excel vba loops refresh


【解决方案1】:

DoEvents 必须有时间进行活动 ;-)。因此,如果您在睡眠后调用一次,它是完全没用的。它必须在暂停期间工作。

以下应该有效:

Sub ToggleImage()

 Dim dTime As Double

 For i = 1 To 20

  'ActiveSheet.Range("a1").Value = i

  ActiveSheet.Shapes("Picture 1").Visible = False
  ActiveSheet.Shapes("Picture 2").Visible = True

  dTime = Time
  Do While Time < dTime + 1 / 24 / 60 / 60 / 2
   DoEvents
  Loop

  ActiveSheet.Shapes("Picture 1").Visible = True
  ActiveSheet.Shapes("Picture 2").Visible = False

  dTime = Time
  Do While Time < dTime + 1 / 24 / 60 / 60 / 2
   DoEvents
  Loop

 Next


End Sub

但您无法将暂停时间缩短到 50 毫秒。即使刷新工作表也需要更多时间。

【讨论】:

  • 这行得通!谢谢你的建议。那么有没有办法将暂停减少到
  • 问题不在于“将暂停减少到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2016-05-19
  • 2015-11-05
相关资源
最近更新 更多