中断宏来处理击键以获得流畅的用户体验

Interrupt macro to process keystrokes for smooth user experience

我正在开发一个宏,它在 excel 应用程序中的每个选择更改时在状态栏上显示单元格信息。 所以现在有时焦点会停留在一个单元格上,在计算要显示的单元格信息之前,我无法使用箭头键继续移动到附近的单元格。但我确实希望继续选择以获得流畅的用户体验。我该如何中断计算?

它在 class 模块中是这样的:

Private Sub Appl_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Dim InfoAboutTarget 
    InfoAboutTarget = GetInfoAbout(Target)
    WriteInfoToStatusbar(InfoAboutTarget)
End Sub

下面两个选项哪个好?

  1. 有一个 application_onkey 事件引发一个带有用户定义的错误代码的错误标志和一个错误处理程序在上面的子程序中退出这个特定的错误
  2. 测量自从上述子程序在代码中有趣的点开始所经过的时间,并在足够长的时间后退出以威胁用户体验?

不确定它是否有效,但可能是这样的

Dim globalCounter As Long ' 0 by defaul

Private Sub Appl_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    globalCounter = globalCounter + 1
    WriteInfoToStatusbar GetInfoAbout(Target)
End Sub

Function GetInfoAbout(Target As Range)
    Dim localCounter As Long 
    localCounter = globalCounter 
    ' .. some code
    DoEvents
    If localCounter <> globalCounter Then Exit Function
    ' .. some code
End Function 

正如德克所说,你应该使用 DoEvents 来允许 excel 处理用户输入, 检测你是否长 运行 代码被中断,如果是,则取消中断的执行,同时允许完成最近的调用。

这里有一个例子来演示(在ThisWorkbook中编码)

Option Explicit

Dim abort As Boolean
Dim CallCount As Long

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    test Target
End Sub


Sub test(r As Range)
    Dim i As Long, n As Long, b As Long

    CallCount = CallCount + 1
    n = 100
    ' simulate long running code
    For i = 1 To n
        DoEvents
        If abort Then
            GoTo AbortSub
        End If
        Application.StatusBar = CallCount & " " & r.Address & " " & i
    Next
AbortSub:
    ' Abort all interrupted calls
    If CallCount > 1 Then
        abort = True
    Else
        abort = False
    End If
    CallCount = CallCount - 1
End Sub