Excel VBA延迟循环连续复制/粘贴
下面已经有代码,可以成功地将Sheet1上的一行复制并粘贴到Sheet2上打开的下一行。此行上的数据从外部应用程序导入并不断更新,从而创建历史记录编写器。我尝试了几种方法来延迟循环此操作,但都失败了 目标:以0.25秒的延迟循环此代码,并选择通过单击按钮或按键退出循环。延迟比退出条件更重要,因为如果需要,我可以直接EscExcel 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
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解决