【问题标题】:How to get instance of actual form from MS Access in a Module (VBA)如何在模块(VBA)中从 MS Access 获取实际表单的实例
【发布时间】:2014-04-04 05:17:38
【问题描述】:

我在 MS Access 2010 中有一堆表单。它们都是绑定的表单,但我欺骗了它们,只在单击 btnSave 时才保存。

主要问题是我有很多代码对于某些事件中的每个表单都是相同的,例如form_beforeUpdate()form_afterUpdate()form_Load()。一个例子:

Private Sub btnSave_Click()
 'Check first that all fields have been filled
 If CheckAllFields = True Then
     Exit Sub
 End If
 TempSaveRecord = True
 Me.Dirty = False 'this will make an attempt of form_Update()
 Form_Load 'After Saving we restart the data
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
 If TempSaveRecord = False Then
   Me.Undo
   Exit Sub
 End If
End Sub

CheckAllFields只是一个例程,检查所有必填字段是否不是null

Private Function CheckAllFields() As Boolean
  Dim Ctrl As Control
  CheckAllFields = False

  'Check for unfilled fields
  For Each Ctrl In Me.Controls
     If Ctrl.Tag = "required" And IsNull(Ctrl) Then
                MsgBox "The field " & Ctrl.Name & " has not been filled."
        CheckAllFields = True
        Exit For
     End If
  Next Ctrl
End Function

我想在一个模块中完成所有这些工作,但当时我找不到获取表单实际实例的方法。任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: vba ms-access


    【解决方案1】:

    我一直这样做。

    这是一个例子:

    'in a main module
    Public Sub mFormLoad(p_form As Form)
        'do stuff with p_form
    end sub
    

    然后,以实际形式本身:

    Private Sub Form_Load()
        mFormLoad Me
    End Sub
    

    对于您的示例,将您的函数更改为公开的并为表单添加参数:

    public Function CheckAllFields(p_form as form) As Boolean
      Dim Ctrl As Control
      CheckAllFields = False
    
      'Check for unfilled fields
      For Each Ctrl In p_form.Controls
         If Ctrl.Tag = "required" And IsNull(Ctrl) Then
                    MsgBox "The field " & Ctrl.Name & " has not been filled."
            CheckAllFields = True
            Exit For
         End If
      Next Ctrl
    End Function
    

    然后将你称之为的行更改为:

    If CheckAllFields(me) = True Then
    

    【讨论】:

    • 太棒了!谢谢@enderland,它工作得很好,我之前应该问过这个问题,现在我有 20 个表格要更新。
    • @EricPb 我知道你的意思,我遇到了类似的问题,有一天刚刚崩溃并花了......同时更新所有这些问题以获得类似的东西。相信我,你会很感激的(特别是因为我对大多数打开/关闭/当前事件都有回调,这些事件在许多表单上都是相同的)。
    【解决方案2】:

    要获取活动表单,您可以使用以下代码。

    Screen.ActiveForm.Name
    

    然后您可以创建一个新对象并将其设置为 ActiveForm。

    Public obj_Form As Access.Form
    Set obj_Form = Forms!MyActiveForm
    

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多