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

Excel VBA延迟循环连续复制/粘贴,vba,excel,loops,delay,Vba,Excel,Loops,Delay,下面已经有代码,可以成功地将Sheet1上的一行复制并粘贴到Sheet2上打开的下一行。此行上的数据从外部应用程序导入并不断更新,从而创建历史记录编写器。我尝试了几种方法来延迟循环此操作,但都失败了 目标:以0.25秒的延迟循环此代码,并选择通过单击按钮或按键退出循环。延迟比退出条件更重要,因为如果需要,我可以直接Esc Private Sub START_Click() Application.ScreenUpdating = False Dim copySheet As W

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

目标:以0.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
使用应用程序。WaitNow+TimeValue0:00:01/4应该可以。时间值按设计只下降到1秒,所以除以4得到0.25秒。这是将代码暂停在一行中的最简单方法

但是在对函数计时之后,它看起来不会给您一致的时间延迟。我喜欢@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函数在循环中调用您的函数。或者只使用内置应用程序。如果不需要超精确的时间延迟,请稍候。正如David向我指出的那样,它们是不同的-Sleep将在应用程序运行时冻结Excel。Wait将允许您退出宏。

使用Start\u Click事件运行另一个过程,并使用模块级变量标记用户是否已请求停止该过程。您需要使用延迟为250ms的WinAPI睡眠函数,因为通常用于计划在将来运行的过程的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

我认为您的思路是正确的,但OP可能希望Application.OnTime方法安排程序一次又一次地运行,直到某些条件打破循环,而不是Application.Wait。虽然我不确定OnTime是否允许分数秒,快速测试表明它不允许。是的,睡眠工作完美,然而,应该注意的是,即使我使用Sleep 250,有时每秒也只能读取3个读数。我使用的是Excel RTD,因此我只能假设数据馈送、Excel、宏或所有三个延迟非常小,即最多几毫秒。有时我每秒读取3个读数,有时读取4个读数,尽管这已经足够我使用的数据了。和往常一样,感谢各位先生及时、翔实的回复。解决了。谢谢你的睡眠功能,我正在把它添加到我的工具箱中@Matt注意到它与应用程序不同。等等-查看两者的dox,看看它们有什么不同:非常好,谢谢!!!我不得不从原始代码中恢复到.Pastespecial xlPasteValues,并将声明更改为Private和64位,但这是我的错,因为我没有首先声明它。一如既往,来自伟大社区的巨大支持,谢谢各位!好吧,也许我说得太早了。单元格值不再更新。我假设,因为等待时间包含所有其他excel函数。我应该补充一点,我正在使用Excel RTD函数来计算这些值。循环复制,但它只是不断复制相同的值,excel rtd不再更新这些值。无需担心,使用excel.Application.rtd.RefreshData解决