VBA : Disabling Listbox while macro is running

标签 vba excel listbox ms-office

问题

我有一个宏(我将其称为 launch_macro),它是通过双击用户窗体列表框 (ListBox1_DblClick) 启动的。

我的问题是,如果用户在宏仍在运行时再次双击,则在第一次执行完成后,宏将再次启动,无论我在宏运行时禁用 ListBox正在运行。

代码和测试

Private sub ListBox1_DblClick(Byval Cancel as MSForms.ReturnBoolean)

   (....Logging...)

    If Not Cancel Then
        Me.ListBox1.Enabled = False
        (...DisplayStatusBar / ScreenUpdating / ListBox1.BackColor...)
        launch_macro
        (...DisplayStatusBar / ScreenUpdating / ListBox1.BackColor...)
        Me.ListBox1.Enabled = True

    End If

End sub

看起来 Excel 会记录/排队 ListBox1_DblClick 事件(以供将来执行),而关联的 ListBox 已禁用。为什么 ?我怎样才能防止这种情况发生?

我也尝试过,但没有成功:

  • 锁定:Me.ListBox1.Locked = True
  • Doevents :在 Me.ListBox1.Enabled = False 之后添加 DoEvents
  • EnableEvents :Application.EnableEvents = False
  • ma​​croLaunched 变量:使用变量检查宏是否已启动(macroLaunched = True 位于 ListBox1_DblClick 事件开头,并且最后的 macroLaunched = False)。这不起作用,因为第二次执行是在第一个事件结束之后启动的(因此变量被设置回False)。 (在 Dbl_Click 事件范围之外将变量设置回 False 是 Not Acceptable ,因为用户需要能够立即再次启动宏(但不能在第一次执行仍在运行时启动)。
  • 添加延迟(仅用于测试目的):我在 launch_macro 之后添加了 10 秒的延迟 (Application.Wait)。然后我在 1 秒内双击了两次。第二次处决仍在启动。我通过日志记录进行了检查:第二个 ListBox1.Dbl_Click 事件是在第一个事件发生后 12 秒由 Excel“记录”的。

注意:我使用的是 Office Standard 2013

当前“解决方案”

此技巧改编自 A.S.H 答案(以减少延迟):

Private sub ListBox1_DblClick(Byval Cancel as MSForms.ReturnBoolean)
   Static nextTime As Single

   If Timer < nextTime then
        Log_macro "Event canceled because Timer < nextTime : " & Timer
        Exit Sub
   End if

   (....Logging...)

    If Not Cancel Then
        (...DisplayStatusBar / ScreenUpdating / ListBox1.BackColor...)
        launch_macro
        (...DisplayStatusBar / ScreenUpdating / ListBox1.BackColor...)

    End If

    nextTime = Timer + 0.5
    Log_macro "nextTime = " & nextTime

End sub

它“有效”,但我仍然不喜欢 ListBox1 仍然启用并且 Excel 仍在排队事件,因此我需要估计用户可能 Dbl_Click 的次数(取决于宏需要多长时间)估计我需要多少延迟(目前需要 0.5 秒才能处理(并记录)至少 10 个已取消的事件)。另外,Excel 似乎并不真正喜欢(就性能而言)在宏运行时对事件进行排队。

最佳答案

好吧,我会发布我的建议,我希望你尝试一下,因为可能它被误解了。这个想法是,一旦宏完成,我们在再次处理双击事件之前设置 n 秒(比如 2 秒)的延迟。这样,在宏执行期间排队的 dbl-clicks 在这两秒内不会产生任何效果。

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Static NextTime As Variant ' Will set a barrier for launching again the macro 
    If Not IsEmpty(NextTime) Then If Now < NextTime Then Exit Sub

    ListBox1.Enabled = False
    ' Any event code
    launch_macro
    ' ...
    ListBox1.Enabled = True

    NextTime = Now + TimeSerial(0, 0, 2) ' dbl-click events will have no effects during next 2 seconds
End Sub

关于VBA : Disabling Listbox while macro is running,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43459916/

相关文章:

html - VBA 获取用于更改 ID 的 HTML 元素信息

Excel Range 不太笨拙

vba - 在VBA中对选定单元格执行修剪功能

vba - MSXML2.ServerXMLHTTP 客户端证书

excel - 如何将基于列 A 重复名称的整行复制到 VBA 中的相应工作表中?

excel - 如何将用户表单带入excel工作表?

delphi - 只显示一次消息

c# - 如何在列表框中显示替代对象的表示?

wpf - 在 XAML 中设置相对列宽。 '0.5*' 字符串无法转换为长度

excel - 希望创建一个 excel 用户表单以根据参数从工作表中提取信息