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