在处理过程中禁用button或其他控件

我有一些button控件,它引发冗长的处理。 我是否需要担心用户按下button并在第一次执行时激活另一个执行?

我发现我可以使用点击事件来禁用button,调用处理例程,然后启用button。 但是,如果处理程序失败,这似乎充满了危险。

我可以添加错误的东西在点击例程捕捉失败,但任何错误调用在处理例程中取消这些呢?

我是否需要担心用户按下button并在第一次执行时激活另一个执行?

没有 – 只要没有机会在处理中调用DoEvents的任何代码。

尝试将以下代码分配给工作表中的button(您可能需要调整更高的迭代器以获得足够的运行时间),然后单击一个附加button – 或者在Excel中执行其他任何操作。

 Sub test() For i = 1 To 100 For j = 1 To 100 Range("A1").Select Next j Next i End Sub 

额外的好处是它有助于说明.select如何导致在使用Excel中的较慢的操作…

我发现我可以使用点击事件来禁用button,调用处理例程,然后启用button。 但是,如果处理程序失败,这似乎充满了危险。

包括某种error handling可能是一个好主意,不pipe简单地为任何有意义的操作重新启用button,除非你是唯一的用户。

我可以添加错误的东西在点击例程捕捉失败,但任何错误调用在处理例程中取消这些呢?

你将不得不妥善考虑错误和不同的地方。 答案是“这取决于你的实施”。

根据经验,我发现期待可能会看到多个并行执行,并计划避免它们,这是更安全的。 尝试使用和不使用标记线并重复点击button:

 Sub CommandButton1_Click() Static InProgress As Boolean If InProgress Then Exit Sub 'try commenting out... InProgress = True Debug.Print "starting...." DoProcessing Debug.Print "....Done" InProgress = False End Sub Sub DoProcessing() Dim x As Long, v For x = 1 To 1000 ActiveSheet.Cells(x, 1).Copy ActiveSheet.Cells(x, 2) DoEvents Next x End Sub 

这种特定行为是由DoEvents调用引起的 – 没有这个,你不应该看到并行运行,正如enderland所指出的那样。

我决定禁用它的点击处理程序中的button,然后在调用处理程序后重新启用它。

 Private Sub CommandButton2_Click() Dim s As Integer s = CommandButton2.Enabled If s Then On Error GoTo Fail CommandButton2.Enabled = False GetData Fail: CommandButton2.Enabled = True End If End Sub 

我也发现这比删除默认embedded公式= EMBED(“Forms.CommandButton.1”,“”)并附加一个macros更愉快。

我得到了与enderland相反的结果,在表单上或表单上的button(从“表单”菜单中的button)。 我设置了一个静态variables,每次按下button时都会增加,如果在代码运行时按下它,它将运行并再次递增。 所以我会说是的,你需要设置一个全局variables来处理这个:

 Sub CommandButton1_Click() Static Incrementer As Long Dim i As Long Incrementer = Incrementer + 1 For i = 1 To 1000 Debug.Print Incrementer Next i End Sub