中断宏来处理击键以获得流畅的用户体验
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
下面两个选项哪个好?
- 有一个 application_onkey 事件引发一个带有用户定义的错误代码的错误标志和一个错误处理程序在上面的子程序中退出这个特定的错误
- 测量自从上述子程序在代码中有趣的点开始所经过的时间,并在足够长的时间后退出以威胁用户体验?
不确定它是否有效,但可能是这样的
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
我正在开发一个宏,它在 excel 应用程序中的每个选择更改时在状态栏上显示单元格信息。
它在 class 模块中是这样的:
Private Sub Appl_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim InfoAboutTarget
InfoAboutTarget = GetInfoAbout(Target)
WriteInfoToStatusbar(InfoAboutTarget)
End Sub
下面两个选项哪个好?
- 有一个 application_onkey 事件引发一个带有用户定义的错误代码的错误标志和一个错误处理程序在上面的子程序中退出这个特定的错误
- 测量自从上述子程序在代码中有趣的点开始所经过的时间,并在足够长的时间后退出以威胁用户体验?
不确定它是否有效,但可能是这样的
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