标签:VBA
在执行下一段代码之前,如果需要暂停Excel VBA代码运行,该如何做呢?本文探索在Excel VBA中添加暂停的最佳方法。
虽然Excel VBA没有用于暂停代码运行的内置功能,但可以使用Application.Wait或Windows API的Sleep函数等方法来引入延迟。
下面是需要使用VBA暂停策略的情况:
1.暂停代码运行可以让复杂的计算或数据操作有时间完成,从而确保结果准确可靠。
2.延迟代码运行使得能够与外部事件(如数据库更新或web服务响应)进行协调,从而确保无缝集成和实时数据处理。
3.VBA中的暂停使得有时间在继续操作之前查看信息或做出决定。
4.在批处理操作之间延迟代码运行可以有效地处理大型数据集或对多个对象执行操作,同时控制资源消耗
5.在VBA代码中引入延迟有助于创建一个更可控的操作序列,允许脚本逐步执行或以特定的间隔执行,从而增强整个脚本代码的逻辑和精确度。
6.当要执行复杂而长的VBA代码列表时,暂停代码一段时间可以帮助避免笔记本电脑、台式机或服务器过热。
7.延迟VBA脚本允许按预定的时间或间隔安排特定的操作或事件,从而自动化任务并提高生产效率。
使用Application.Wait让VBA暂停
假设,当Excel执行一批VBA代码,暂停几分钟并重复时,不需要在Excel中执行任何操作。例如,任务是自动化从单元格区域A2:A7到C2:C7复制值的过程,并暂停代码脚本10秒。然后,Excel将C2:C7中的值与D2:D7中的数值相乘,并将结果放入单元格区域E2:E7中。在这两组任务之间,将使用Application.wait函数让VBA等待10秒钟。
下面是VBA代码:
代码语言:javascript复制Sub CopyAndMultiplyDataWithPause()
Dim sourceRange As Range
Dim destinationRange As Range
Dim multiplyRange As Range
Dim resultRange As Range
Dim i As Integer
Set sourceRange = Range("A2:A7")
Set destinationRange = Range("C2:C7")
Set multiplyRange = Range("D2:D7")
Set resultRange = Range("E2:E7")
' 将数据从源区域复制到目标区域
destinationRange.Value = sourceRange.Value
' 暂停10秒
Application.Wait Now TimeValue("00:00:10")
' 两个区域相对应的值相乘
For i = 1 To destinationRange.Cells.Count
resultRange.Cells(i).Value = destinationRange.Cells(i).Value * multiplyRange.Cells(i).Value
Next i
MsgBox "成功复制、暂停、相乘数据."
End Sub
现在,Excel将立即执行复制任务,并等待10秒钟,然后再执行乘法任务并将结果放在E列下。在这10秒钟的暂停期间,将无法访问Excel应用程序。
在上面的代码脚本中,在两段VBA脚本之间放置了暂停代码,即Application.Wait Now TimeValue(“00:00:10”)。你可以按原样复制这句代码,并将其粘贴到两个任务之间的VBA代码中,如果需要多次暂停,可根据需要多次插入这句代码。
使用Sleep语句让VBA暂停
VBA的Sleep(毫秒)函数允许在执行下段代码之前暂停VBA一个特定的时间。实现上文示例的代码如下:
代码语言:javascript复制Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Sub CopyAndMultiplyDataWithPause2()
Dim sourceRange As Range
Dim destinationRange As Range
Dim multiplyRange As Range
Dim resultRange As Range
Dim i As Integer
Set sourceRange = Range("A2:A7")
Set destinationRange = Range("C2:C7")
Set multiplyRange = Range("D2:D7")
Set resultRange = Range("E2:E7")
' 将数据从源区域复制到目标区域
destinationRange.Value = sourceRange.Value
' 暂停10秒
Sleep (10000)
' 两个区域相对应的值相乘
For i = 1 To destinationRange.Cells.Count
resultRange.Cells(i).Value = destinationRange.Cells(i).Value * multiplyRange.Cells(i).Value
Next i
MsgBox "成功复制、暂停、相乘数据."
End Sub
使用循环来暂停
如果需要在暂停时间修改工作表或在Excel数据集中输入数据,则上述两种方法不适用。此时,可以使用循环来暂停Excel VBA。实现上文示例的代码如下:
代码语言:javascript复制Sub CopyMultiplyWithPause()
Dim sourceRange As Range
Dim destinationRange As Range
Dim multiplyRange As Range
Dim resultRange As Range
Dim duration As Long
Dim startTime As Double
Dim currentTime As Double
Dim i As Long
' 以秒为单位设置所需的暂停持续时间
duration = 10
Set sourceRange = Range("A2:A7")
Set destinationRange = Range("C2:C7")
Set multiplyRange = Range("D2:D7")
Set resultRange = Range("E2:E7")
' 将数据从源区域复制到目标区域
destinationRange.Value = sourceRange.Value
' 获取开始时间
startTime = Now
' 暂停脚本,直到指定的持续时间过去
Do
' 获取当前时间
currentTime = Now
' 如果指定的持续时间已过去则退出循环
If currentTime >= startTime (duration / 24 / 60 / 60) Then Exit Do
' 暂停期间允许执行其它处理
DoEvents
Loop
' 两个区域相对应的值相乘
For i = 1 To destinationRange.Cells.Count
resultRange.Cells(i).Value = destinationRange.Cells(i).Value * multiplyRange.Cells(i).Value
Next i
' 继续执行代码的其余部分或执行后续操作
MsgBox "成功复制、暂停、相乘数据."
End Sub
小结
上述3种方法都是暂停或延迟Excel VBA代码脚本的常用方法。
如果VBA代码延迟时不需要与Excel交互,则可以使用基于Application.Wait和Sleep函数的方法。这些方法主要帮助在运行大型VBA脚本时高效地分配PC资源。
如果在VBA代码脚本暂停时需要在Excel工作表中输入数据,则应尝试基于循环的方法。它可以暂停代码的执行,直到在Excel中重组或输入数据,然后继续完成代码。当需要在Excel中自动执行许多其他任务时,该方法更适合。
注:本文学习整理自www.howtoexcel.org,供有兴趣的朋友参考。