在open&amp ;;上显示访问表单运行其他代码时更新文本框*

时间:2018-03-06 11:02:31

标签: vba forms ms-access events access-vba

有时候尝试完成最多 次要 会变成 主要 头痛......我在尝试解决问题时,以某种方式损坏了数据库。现在我 真的 决心解决这个问题。 (我稍后会担心损坏的数据库!)

结束目标:

自动打开.accdb文件时:

  1. open form unbound)
  2. 运行代码:
    • 从表中获取Last Update Date
    • 在表单 的文本框中显示Last Update Date(必须对用户可见)
  3. 如果表数据已过时,请运行代码:
    • 更新表格中的数据
    • 在表单 的文本框中显示Update Progress Message(s)(必须对用户可见)
    • 完成后:
      • 在表单 的文本框中显示Last Update Date(必须对用户可见)
  4. 问题是 (must be visible to user) 的目标。

    无法在所有代码完成运行之前显示任何内容,无论我如何运行代码(包括:使用 File <将表单设置为自动打开) / kbd>→选项Display Form;添加AutoExec宏来调用代码以打开表单并运行更新;或者,手动运行。)

    我一直在尝试表格的开场活动,看看我是否错过了什么。

    根据 Order of Events 文档:

      

    使用表单上的数据

         

    当您在表单中的记录之间移动并更改数据时,会发生表单和控件事件。例如,首次打开表单时,会发生以下事件序列:

         

    Open(表单)→Load(表单)→Resize(表单)→Activate(表单)→Current(表单)→{{ 1}}(控制)→Enter(控制)

    表格在任何时候都不会明显更新。我尝试添加Me.Repaint,甚至尝试Echo=TrueDoEvents,但显然他们没有改变任何内容。

    我的测试代码:

    GotFocus

    打开表单的结果:

    (animated screenshot)

    (请注意,表单的Private Sub Form_Open(Cancel As Integer) txtTest = "Form_Open()": MsgBox "1. Form_Open" End Sub Private Sub Form_Load() txtTest = "Form_Load()": MsgBox "2. Form_Load" End Sub Private Sub Form_Current() txtTest = "Form_Current()": MsgBox "3. Form_Current" End Sub Private Sub txtTest_Enter() txtTest = "txtTest_Enter()": MsgBox "4. txtTest_Enter" End Sub Private Sub txtTest_GotFocus() Echo True : Repaint : DoEvents txtTest = "txtTest_GotFocus()": MsgBox "5. txtTest_GotFocus" End Sub Private Sub txtTest_Change() : MsgBox "This Does't Run!" : End Sub Private Sub Form_AfterUpdate() : MsgBox "This Does't Run!" : End Sub Private Sub txtTest_Change() : MsgBox "This Does't Run!" : End Sub Private Sub txtTest_BeforeUpdate(Cancel As Integer) : MsgBox "This Does't Run!" : End Sub Private Sub txtTest_AfterUpdate() : MsgBox "This Does't Run!" : End Sub Activate事件以及控件的AfterUpdateChangeBeforeEvent事件根本不会触发。 )

    理论上,表单应该显示在AfterEvent后面,但既不运行实际更新代码,也不运行“暂停”(使用MsgBox循环)不会t显示表格。

    我可以发誓我过去没有遇到任何问题,但无论我做什么,表单只会在所有代码完成后才会显示。< / p>

1 个答案:

答案 0 :(得分:3)

您可以使用Form_Timer事件来延迟执行,直到表单完全加载完毕。

Private Sub Form_Load()
    Me.TimerInterval = 1 'Trigger 1 millisecond, but asynchronously from other tasks
                         'Triggers after AutoExec macro has finished
End Sub

Private Sub Form_Timer()
   Me.TimerInterval = 0 'Trigger only once
   'Your other tasks here
End Sub