Excel VBA 循环连续复制/粘贴延迟



我已经在下面有代码,可以成功地将 Sheet1 上的一行复制并粘贴到 Sheet2 上的下一个打开行。 此行上的数据是从外部应用程序导入的,并不断更新,从而创建历史记录编写器。 我尝试了几种方法来延迟循环此操作,但都失败了。

目标: 以 .25 秒的延迟循环此代码,并可选择通过单击按钮或按键退出循环。 延迟比退出条件更重要,因为如果需要,我可以 Esc 键。

Private Sub START_Click()
Application.ScreenUpdating = False
Dim copySheet As Worksheet
Dim pasteSheet As Worksheet
Set copySheet = Worksheets("Sheet1")
Set pasteSheet = Worksheets("Sheet2")
copySheet.Range("A23:L23").Copy
pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
Application.CutCopyMode = False
Application.ScreenUpdating = True

End Sub

使用Start_Click事件运行另一个过程,其中包含一个模块级变量,该变量标记用户是否已请求停止该过程。你需要使用延迟为 250 毫秒的 WinAPISleep函数,因为Application.OnTime(通常用于计划过程在将来运行)不会在几分之一秒内工作。在此过程运行时,您将无法真正与 Excel "交互":

Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim bRunContinuously As Boolean
Private Sub START_Click()
bRunContinuously = True
While bRunContinuously
Call Do_Stuff
Sleep 250
DoEvents
Wend
End Sub
Private Sub STOP_Click()
bRunContinuously = False
Debug.Print "Stopped!"
End Sub
Sub Do_Stuff()
Dim dest As Range
Application.ScreenUpdating = False
Dim copySheet As Worksheet
Dim pasteSheet As Worksheet
Set copySheet = Worksheets("Sheet1")
Set pasteSheet = Worksheets("Sheet2")
Set dest =  pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
With copySheet.Range("A23:L23")
dest.Resize(.Rows.Count, .Columns.Count).Value = .Value
End With
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

使用应该可以解决问题的Application. Wait(Now + TimeValue("0:00:01")/4)。 根据设计,TimeValue 仅下降到 1 秒,因此除以 4 会得到 0.25 秒。 这是将代码暂停在 1 行中的最简单方法。

但是在对功能进行计时后,它看起来不会给你一致的时间延迟。 我喜欢@David Zemens在另一个答案中提出的睡眠,这是非常一致的。 下面是一些测试代码:

'These go ABOVE your function
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetTickCount Lib "kernel32" () As Long
Sub testwait()
StartTime = GetTickCount
Sleep 250
EndTime = GetTickCount
MsgBox ((EndTime - StartTime) & " milliseconds")
End Sub

然后,您可以使用该Sleep函数在循环中调用您的函数。 或者,如果您不需要超精确的时间延迟,只需使用内置Application.Wait。 正如 David 向我指出的那样,它们是不同的 -Sleep运行时会冻结 Excel http://analystcave.com/vba-sleep-vs-wait/而Application.Wait会允许您从宏中 Esc 出来。