【问题标题】:VBA EventHandler firing twice?VBA EventHandler 触发两次?
【发布时间】:2020-02-28 03:17:24
【问题描述】:

我有 MS Access 2003 数据库。

表单上的按钮的事件处理程序是否可以触发两次??

我似乎有证据表明这种情况正在发生,因为我有一个工资核算流程 记录整个过程并且过程在日志中重复。

我认为这在 VBA 中是不可能的???

编辑: 我发现它确实触发了两次,因为用户单击了两次并将事件排队两次。 这是我对代码所做的修复,它显示使用标志 m_locked 作为测试示例:

[代码]

Private m_locked As Boolean
Private m_count As Integer

Private Sub Command0_Click()
On Error GoTo Err_Command0_Click

' wait

If Not m_locked Then
    m_locked = True
    Dim startTime As Date
startTime = Now()

While DateDiff("s", startTime, Now()) < 3
    DoEvents
Wend

' increment counter

    m_count = m_count + 1
    Command0.Caption = m_count

     m_locked = False
End If

Exit_Command0_Click:
    Exit Sub

Err_Command0_Click:
    MsgBox Err.Description
    Resume Exit_Command0_Click

End Sub

[/代码]

马尔科姆

【问题讨论】:

  • 哪个事件?请张贴代码。你可能想在问号上放轻松,有些人读过普拉切特。
  • “我似乎有证据证明这件事发生了” 你愿意与我们分享这些证据并向我们展示你的代码吗?这不是通灵者论坛。
  • 我认为很明显它是 CLick 事件。不值得发布与问题无关的整个代码的代码。我问的事件 Public Sub cmdCalculatePay_Click() 可以一键触发两次还是明显一键触发?

标签: vba ms-access-2003


【解决方案1】:

看到您的“解决方案”,我建议您也指定双击事件。这将允许您通过“debug.print”轻松区分用户是单击一次还是两次。

为了防止用户执行额外的点击,请在表单模块级别声明一个私有布尔变量,在事件过程中将其设置为 TRUE,在计时器事件中将其设置为 FALSE,并将表单的计时器配置为 1000,例如(毫秒)。

Option Explicit
Option Compare Database

Private oneClick As Boolean

Private Sub cmdMyButton_Click()

    If not oneClick Then 
        ' Perform your actions here
    End If

    oneClick = True

End Sub

Private Sub Form_Timer()

    oneClick = False

End Sub

哦,请使用能说明其含义的变量和控件名称 :-)

【讨论】:

    【解决方案2】:

    如果您不希望您的用户点击按钮两次,只需以下简单代码:

    Private Sub Command0_Click()
       Command0.Enabled = False
       ' Continue with your code here ...
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2019-03-19
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多