【问题标题】:Is there an equivalent to Thread.Sleep() in VBAVBA中是否有等效于 Thread.Sleep()
【发布时间】:2010-10-02 22:21:18
【问题描述】:

Access VBA 中是否有与Thread.Sleep() 等效的名称?

【问题讨论】:

  • 这是一个 Access 常见问题解答,您会发现 mvps.org/Access 是常见问题解答的重要来源。

标签: vba ms-access sleep


【解决方案1】:
Declare Sub Sleep Lib "kernel32" Alias "Sleep" _
(ByVal dwMilliseconds As Long)

使用以下语法调用睡眠函数:

Sub Sleep()
Sleep 1000 'Implements a 1 second delay
End Sub 

【讨论】:

  • 啊刚刚发现我自己。谢谢!
  • 我应该注意到,在 Excel 2007 中,我可以在没有包装 VBA 子的情况下直接调用 Sleep。
  • Declare 语句应该在模块中以避免“Declare statements are not allowed as Public members of object”错误。
【解决方案2】:

另一种不使用kernel32的方法:

Dim started As Single: started = Timer

Do: DoEvents: Loop Until Timer - started >= 1

【讨论】:

    【解决方案3】:

    需要进行一些修改才能使代码正常工作。 下面的代码是修正后的版本。

    Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
    
    Sub SleepVBA() 
    Sleep 1000 'Implements a 1 second delay 
    End Sub 
    

    【讨论】:

      【解决方案4】:

      使 Excel 等待的所有其他方法都会导致 Excel 完全无响应。在确保响应式 UI 的同时让 Excel 等待的解决方案是调用此 wait Sub 并指定等待的秒数。

          Sub Wait(seconds As Integer)
            Dim now As Long
            now = Timer()
            Do
                DoEvents
            Loop While (Timer < now + seconds)
          End Sub
      

      【讨论】:

      • 使用这种方法的问题是 DoEvents 最终会占用几乎所有的 CPU 时间。
      【解决方案5】:

      我在 Excel 中使用它,效果很好:

      Application.Wait DateAdd("s", 1, Now())
      

      DateAdd() 是一个设置时间的函数,相对于Now()(在这种情况下 - 您可以使用其他值作为参数),"s" 是时间度量(在这种情况下是秒),而增量为 1。所以这里的函数调用告诉应用程序等待 1 秒。

      See also for more detail about the use of the DateAdd function.

      【讨论】:

      • @MAW74656 很公平;我确实在Excel中说过,我还没有在Access中测试过。您说“原样”,您知道解决方法吗?
      【解决方案6】:

      如果您使用Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long),您可能会在对象模块中收到此错误。

      如果是这样,您可以将其声明为私有:

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

      【讨论】:

        【解决方案7】:

        可以使用 Access VBA 中的 Excel Wait() 过程。

        第一步是确保您的项目引用了 Excel 库。

        完成后,以下代码将等待十秒钟:

        Call Excel.Application.Wait(Time:=DateAdd("s",10,Now()))
        

        【讨论】:

          【解决方案8】:

          添加

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

          不知何故在我的代码中的其他地方产生了额外的问题。 我最终使用了我在其他论坛上找到的这个功能并稍微调整了一下:

          Function WaitTime(n As Double)
          'Function that wait an amount of time n in seconds
          TWait = Time
          TWait = DateAdd("s", n, TWait)
          Do Until TNow >= TWait
               TNow = Time
          Loop
          End Function
          

          希望这会有所帮助:)

          【讨论】:

          • 我能想到添加函数头会导致“问题”的唯一原因是,如果您已经在当前进程的模块或类中使用了函数名称“Sleep”。
          猜你喜欢
          • 1970-01-01
          • 2016-05-12
          • 2010-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-12
          相关资源
          最近更新 更多