中断macros来处理按键以获得stream畅的用户体验

我正在处理一个macros,它显示excel应用程序中每个select更改状态栏上的单元格信息。 随着新function的增加,得益于这里成员的帮助,它已经成长。 所以现在有时候焦点会粘在一个单元格上,而且在计算出要显示的单元格信息之前,我不能用箭头键移动到附近的单元格。 但是我确实希望这个select能够顺利地进行用户体验。 我应该如何中断计算?

它在类模块中是这样的:

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

以下两种select中的任何一种都可以吗?

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

正如Dirk所说,您应该使用DoEvents来允许excel处理用户input, 检测您的长时间运行的代码是否被中断,如果是,则取消中断的执行,同时允许最近的呼叫完成。

下面是一个演示示例(在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 

不知道它是否会工作,但也许这样的事情

 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 
Interesting Posts