Excel 禁用时,UserForm按钮仍在运行

Excel 禁用时,UserForm按钮仍在运行,excel,vba,button,userform,Excel,Vba,Button,Userform,我正在禁用一个按钮onclick,但它仍然允许单击 代码如下所示: UsrForm.Field1.Value = "" UsrForm.Field2.Value = "" UsrForm.btn.Enabled = False UsrForm.Repaint /*Processing Occurs*/ UsrForm.Field1.Value = val1 UsrForm.Field2.Value = val2 UsrForm.btn.Enabled = True 但是,如果我双击或单击禁

我正在禁用一个按钮onclick,但它仍然允许单击

代码如下所示:

UsrForm.Field1.Value = ""
UsrForm.Field2.Value = ""
UsrForm.btn.Enabled = False
UsrForm.Repaint

/*Processing Occurs*/

UsrForm.Field1.Value = val1
UsrForm.Field2.Value = val2
UsrForm.btn.Enabled = True

但是,如果我双击或单击禁用按钮所在的位置几次,它仍然会运行该方法数次,尽管被禁用。

这很有趣。我同意你的代码应该有效,我对此感到困惑。然而,我是那种会四处编码的人,所以这里有一些使用模块级变量来记录过程是否已经在运行的人

Option Explicit

Private mbAlreadyProcessing As Boolean

Private Sub btn_Click()
    On Error GoTo ErrHandler
    If Not mbAlreadyProcessing Then
        mbAlreadyProcessing = True
        'do some work
        mbAlreadyProcessing = False
    End If
    Exit Sub
ErrHandler:
    'here we remember to "re-enable"
    mbAlreadyProcessing = False
    'do some error handling

End Sub

我想我们这里有一个适当的错误。S Meaden发布的解决方案不起作用(至少在我的测试中不起作用)。以下是我一起测试的内容:

Private Sub CommandButton1_Click()
Dim w As Date

Me.CommandButton1.Enabled = False

w = Now + TimeSerial(0, 0, 2)

Debug.Print "point 1: " & Now

Application.Wait w

Debug.Print "point 2: " & Now

Me.CommandButton1.Enabled = True

End Sub
单击它会使其变灰(禁用时应该如此),然后运行例程。但是,单击两次将运行例程两次。因为它会打印时间,很明显例程是按顺序运行的,所以excel(在我的例子中是excel,没有用其他应用程序测试过)会记住单击,当例程完成时(再次启用按钮),调用例程。它也会连续运行3到4次

因此,实施S Meaden的答案如下:

Dim clicked as Boolean
Private Sub CommandButton1_Click()
Dim w As Date

If Not clicked Then
    clicked = True
    Me.CommandButton1.Enabled = False
    w = Now + TimeSerial(0, 0, 2)
    Debug.Print Now
    Application.Wait w
    Debug.Print "punt 2 (" & Now & ")"

    Me.CommandButton1.Enabled = True
    clicked = False
End If

End Sub
也不行

如果在例程完成后启用该按钮,则在例程执行期间单击的按钮将被丢弃。因此,作为解决方法,您可以使用:

Private Sub CommandButton1_Click()
Dim w As Date

Me.CommandButton1.Enabled = False

w = Now + TimeSerial(0, 0, 2)

Debug.Print "point 1: " & Now

Application.Wait w

Debug.Print "point 2: " & Now
Me.Button1_clicked = False

Application.OnTime (Now + 0.000001), "enable_commandbutton"

End Sub
“启用命令按钮”为:

在普通代码模块中

它不漂亮,但很管用

Public Sub enable_commandbutton()
Dim uf As Object
Debug.Print "check"
For Each uf In VBA.UserForms
    If uf.Name = "UserForm1" Then
        uf.CommandButton1.Enabled = True
    End If 
Next uf


End Sub