1

我有一些按钮控件可以触发冗长的处理。我是否必须担心用户在第一次执行处于活动状态时按下按钮并触发另一个执行?

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

我可以在点击例程中添加错误内容以捕获失败,但处理例程中的任何错误调用会取消这些吗?

4

4 回答 4

2

根据经验,我发现期望您可能会看到多个并行执行并计划避免它们更安全。尝试使用和不使用标记线并重复单击按钮:

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 指出的那样。

于 2012-08-16T22:06:10.810 回答
1

我决定在其单击处理程序中禁用该按钮,然后在调用处理例程后重新启用它。

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

我还发现这比删除默认嵌入公式 =EMBED("Forms.CommandButton.1","") 并附加宏更令人愉悦。

于 2012-08-16T23:12:37.477 回答
0

我是否必须担心用户在第一次执行处于活动状态时按下按钮并触发另一个执行?

不 - 只要您的处理过程中没有任何代码调用DoEvents.

尝试将以下代码分配给工作表中的按钮(您可能需要将迭代器调整得更高以获得足够的运行时间)并单击其他按钮 - 或在 Excel 中执行任何其他操作。

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

    Next i
End Sub

一个额外的好处是它有助于说明如何.select导致使用 Excel 时操作变慢......

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

包含某种错误处理可能是一个好主意,而不考虑简单地重新启用按钮以进行任何有意义的操作,除非您是唯一的用户。

我可以在点击例程中添加错误内容以捕获失败,但处理例程中的任何错误调用会取消这些吗?

您必须正确考虑错误和不同的地方。答案是“这取决于你的实现”。

于 2012-08-16T21:42:37.377 回答
0

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

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
于 2012-08-16T22:07:47.603 回答