【问题标题】:Waiting in Excel Macros在 Excel 宏中等待
【发布时间】:2016-03-04 05:48:58
【问题描述】:

我正在录制一个 Excel 宏,我希望它在切换到下一个值之前等待半秒。我正在绘制对图表的更改,现在它只是通过值暴风雨,所以你真的看不到任何变化。因此,我希望它在继续之前等待半秒钟。

我使用的宏是这样的:

Sub Macro2()
' Macro2 Macro
    Range("C1").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("C1").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("C2").Select
End Sub

现在我很想做类似以下的事情,但它不起作用。

Sub Macro2()
' Macro2 Macro
    Range("C1").Select
ActiveCell.FormulaR1C1 = "1"
Range("C1").Select
Sleep (100)
ActiveCell.FormulaR1C1 = "2"
Range("C2").Select
Sleep (100)
End Sub

请帮忙?我使用的是 Mac Office Excel 2011。

【问题讨论】:

  • 你也可以只等几毫秒,看下面我的回答
  • Mac 上的“睡眠”是什么?我熟悉从 Windows 中的 Kernel32 导入 Sleep() API 调用,但我怀疑该代码是否可以在 Apple 星球上运行......所以这是你的问题之一,就在那里。涉及Application.Wait() 的答案将为您指明前进的方向,因为这是所有平台上的 Office 所固有的。
  • 仅供参考,等待使用简化:1 秒将从(非常接近)零等待到 1 秒。 2 将等待 1 到 2 秒 ETC。 IE。 1 秒的不精确度,因为忽略了秒内到目前为止经过的毫秒数。详情stackoverflow.com/questions/1544526/…

标签: vba excel excel-2011


【解决方案1】:

试试Application.Wait(time)。它暂停宏直到指定时间,然后返回True

等待 1 秒:

Application.Wait(Now + TimeValue("0:00:01"))

(在 Windows 上的 Excel 2010 中测试)

【讨论】:

  • 谢谢 - 完美运行!我知道这是一件很容易的事情,我想我是因为不知道如何提出问题而不是理解答案(如果这是有道理的话)更受抑制......
【解决方案2】:

附带说明 - 使用宏记录器时,检查之后生成的代码,看看是否可以删除 select 语句。

你的代码会变成

Sub Macro2()
' Macro2 Macro
    Range("C1").FormulaR1C1 = "1"
    ' Whichever method you want to use from the other two answers put here
    Range("C1").FormulaR1C1 = "2"
End Sub

这将提高效率。我没有添加你的问题的答案,因为它已经被回答了

【讨论】:

  • 感谢您的提示!干杯
【解决方案3】:

Application.Wait(Now + s / 86400) 是一种方式,其中s 是秒数。一天有86400秒。请注意,由于其内部工作方式,等待时间可能会更长。

如果这还不够可靠(似乎s 需要是一个整数),并且您的操作系统支持它,那么您总是可以求助于使用内核函数,这将为您提供亚秒级粒度:

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

将其包含在模块顶部,并以正常方式调用:Sleep(500) 将暂停(至少)1/2 秒。

【讨论】:

  • 这似乎不起作用。当我尝试使用以下功能计算时间时,我总是得到 0。我也没有感觉到延迟。 Dim c: c = Timer: Application.Wait (Now + 0.5 / 86400): MsgBox Timer - c
  • 也许 VBA 解释器正在做一些时髦的舍入。你试过 1.0 / 86400 吗?
  • 是的,它可以工作,尽管1.0 被转换为1#
  • 没关系。它必须是浮点文字,否则除法将四舍五入。像上面那样调用内核函数可能会更好。
  • 哼。我怀疑 VBA 在幕后做了一些时髦的事情。似乎 1 秒是您可以使用的最细粒度。我已经修改了答案。
【解决方案4】:
Application.Wait Now + TimeSerial(0, 0, 1)

这应该最多等待 1 秒。但是您永远无法确定使用 VBA。这会等待指定的时间,所以如果你有11:30:30,你会等到11:30:31,这样只会等待0.5秒。

【讨论】:

    【解决方案5】:

    就这么简单Application.Wait (Now + 0.000001) 1/10 秒:

    Sub Macro2()
    ' Macro2 Macro
    Range("C1").FormulaR1C1 = "1"
    Application.Wait (Now + TimeValue("0:00:01")) '1sec
    Range("C1").FormulaR1C1 = "2"
    Application.Wait (Now + 0.000001) '1/10sec
    Range("C2").Select
    End Sub
    

    【讨论】:

    • 你测试过吗?
    • @Nile : 是的,我在 Excel 2013 64bits 和 Win7 64bits 上测试过,没问题!
    • @R3iK ...它是等待十分之一秒,还是等待整数(或零)秒数?查看使用精确计时器 API 函数或 VBA.DateTime.Timer 属性进行测试,该属性返回单精度浮点数,精度为 ±0.01 秒,而不是通过 VBA“时间序列”变体的 ±1 秒精度函数.
    • @Nile :我只是重试,大多数时候,我有一个小数点,有时是 0... 对 0 有点惊讶...
    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 2016-02-22
    • 2012-02-14
    • 1970-01-01
    • 2012-10-13
    • 2013-02-06
    • 2017-08-28
    相关资源
    最近更新 更多