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

时间:2017-06-06 18:18:41

标签: excel vba excel-vba loops delay

我已经有下面的代码成功地将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

2 个答案:

答案 0 :(得分:1)

使用Start_Click事件运行另一个过程,其中包含一个模块级变量,用于标记用户是否已请求停止该过程。您需要使用WinAPI Sleep函数,延迟时间为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

答案 1 :(得分:0)

使用Application. Wait(Now + TimeValue("0:00:01")/4)应该做的伎俩。 TimeValue仅按设计降至1秒,因此除以4会使您达到0.25秒。这是将代码暂停一行的最简单方法。

但是在对功能进行计时之后,它并没有为您提供一致的时间延迟。我喜欢@David Zemens在另一个答案中提出的Sleep,这是非常一致的。这是一些测试代码:

'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将在运行http://analystcave.com/vba-sleep-vs-wait/时冻结Excel,而Application.Wait将允许您从宏中退出Esc。