有没有一种方法后,才设定的时间量运行Worksheet_SelectionChange()分?

时间:2019-01-31 10:27:09

标签: excel vba

我开发一个VBA代码,将在工作表中的单元格范围的运行。每次选择该单元格中的一个单元格时,我都希望代码执行。我正在使用以下方法:

Sub Worksheet_SelectionChange(ByVal Target As Range)

但是,代码是相当缓慢并且有次我想使用箭头键在该范围内进行导航。要做到这一点,我想使用定时器功能,如果我上了0.5秒以上的小区,将只运行代码。

我尝试过的代码如下:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'set timer
Dim PauseTime, Start, Finish, TotalTime
PauseTime = 0.6    ' Set duration.
Start = Timer    ' Set start time.
Do While Timer < Start + PauseTime
        DoEvents    ' Yield to other processes.
    Loop
Finish = Timer    ' Set end time.
TotalTime = Finish - Start    ' Calculate total time.
If Abs(TotalTime) < 0.1 Then GoTo ws_exit

'continuation of code......

ws_exit:
  Application.EnableEvents = True
End Sub

该代码的主要问题是它是递归的,并返回到我按的第一个单元格上设置的第一个计时器。我想知道是否有一种方法可以延迟SelectionChange代码的运行,直到将用户设置在单元格上X的时间。

谢谢

1 个答案:

答案 0 :(得分:0)

一个类模块解决这个问题。添加一个类模块,将其称为cTimer。粘贴此代码:

Option Explicit

Public Target As Range
Private StartTime As Double
Public WaitTime As Double

Public Sub HandlePrevious()
    If Timer - StartTime > WaitTime Then
        'Handle things now using Target
        Debug.Print Target.Address, "Taking action"
    Else
        Debug.Print Target.Address, "Moving on"
    End If
End Sub

Private Sub Class_Initialize()
    StartTime = Timer
End Sub

在工作表模块中使用它:

Option Explicit

Dim mcTimer As cTimer

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not mcTimer Is Nothing Then
        mcTimer.HandlePrevious
    End If
    Set mcTimer = Nothing
    Set mcTimer = New cTimer
    mcTimer.WaitTime = 0.5
    Set mcTimer.Target = Target
End Sub