UserFormbutton仍然正常运行时禁用

我正在禁用buttononclick,但它仍然允许点击。

代码如下所示:

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 

但是,如果我双击或点击几次禁用button,它仍然运行该方法几次,尽pipe被禁用。

我认为我们在这里有一个适当的错误。 S Meaden发布的解决scheme不起作用(至less在我的testing中)。 以下是我一起testing的内容:

 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中,没有与其他应用程序testing)记住的点击,当程序完成(和button启用再次)例程被调用。 它连续运行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 

也不起作用。

看来,如果在例程结束后启用button,则在例程执行期间放置的点击将被丢弃。 所以作为一个解决方法,你可以使用:

 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 

与“enable_commandbutton”是:

 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 

在一个正常的代码模块。

这不是漂亮,但它的作品。

那很有意思。 我同意你的代码应该工作,我感到困惑。 但是,我是那种会编码的人,所以这里有一些使用模块级variables来logging过程是否已经在运行。

 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