【发布时间】:2017-04-17 21:26:57
【问题描述】:
问题
我有一个宏(我称之为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 -
启用事件 :
Application.EnableEvents = False -
macroLaunched 变量:使用变量来检查宏是否已经启动(
macroLaunched = True在ListBox1_DblClick事件的开头和macroLaunched = False在结尾)。这不起作用,因为第二次执行是在第一个事件结束后启动的(因此变量被设置回False)。 (并且在 Dbl_Click 事件范围之外将变量设置回 False 是不可接受的,因为用户需要能够再次立即启动宏(但不是在第一次执行仍在运行时)。 - 添加延迟(仅用于测试目的):我在启动宏之后立即添加了 10 秒延迟 (Application.Wait)。然后我在 1 秒内双击了两次。第二次执行仍然启动。我通过记录进行了检查:第二个 ListBox1.Dbl_Click 事件在第一个事件之后被 Excel 12 秒“记录”。
注意:我使用的是 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 似乎不太喜欢(就性能而言)在宏运行时排队事件。
【问题讨论】:
-
@YowE3K。刚刚测试过
EnableEvents;那也行不通。 :-( -
是的 - 我意识到这是在一个实际的表格上,所以决定可能 不是 会是正确的答案,所以删除了评论。
-
我刚试过这个并在宏运行时再次双击列表框没有再次触发代码,除非我包含
DoEvents(因为用户活动被锁定),并且在代码中使用DoEvents,第二次执行与第一次执行同时运行 - 即它没有等待第一次执行完成。 -
在launch_macro之前,检查macroLaunched是否为真。如果是,请不要启动宏。如果不是,请在launch_macro 之前将其设置为true。当可以再次启动宏时,在 doubleClick 事件之外设置 macroLaunched。
-
@Tibo 也许我的想法不够清楚。请尝试下面我的答案中的方法。
标签: vba excel listbox ms-office