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

我已经有下面的代码成功地将Sheet1上的一行复制并粘贴到Sheet2上的下一个打开的行上。 该行的数据从外部应用程序导入并不断更新,从而创build历史logging。 我已经尝试了几种方法来循环这个动作,并且失败了。

目标:使用button点击或按键退出循环的选项以.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事件来运行另一个过程,并使用模块级variables来标记用户是否请求停止过程。 您需要使用WinAPI Sleepfunction,延迟时间为250毫秒,因为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) Application. Wait(Now + TimeValue("0:00:01")/4) ,应该做的伎俩。 TimeValue按devise下降到1秒,所以除以4会让你达到0.25秒。 这是暂停一行代码的最简单的方法。

但计时后的function,它不会给你一致的时间延迟。 我喜欢@David Zemens在另一个答案中提到的睡眠,这是非常一致的。 以下是一些testing代码:

 '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 

然后,您可以使用该Sleepfunction循环调用您的function。 如果你不需要超精确的时间延迟,或者只是使用内置的Application.Wait 。 正如大卫指出,他们是不同的 – Sleep将冻结Excel运行http://analystcave.com/vba-sleep-vs-wait/而Application.Wait将允许您退出macros。