如何在Subforms中引用具有全局变量的Form并对其进行填充?

时间:2019-01-17 18:01:48

标签: vba ms-access access-vba

我从未使用过英语访问版本,因此,如果我对这个问题的解释不好,请原谅我。 我正在使用旧的Access VBA应用程序。它具有名为Form_GUI的主要形式。 Form_GUI有多个标签,每个标签都有自己的“主表单”和几个不同的子表单。这些建立了FrontEnd。它们都与来自不同数据库的各种后端表连接。

我如何在全局中声明变量p_FrmZuordnung并以某种方式引用,当我想以另一种形式{{1}对Form1Form2进行更改时,可以引用它}}?

我希望子表单根据此变量的值做出不同的反应。

下面是我想与Form3处理的事情的示例。

我尝试过的事情:

我尝试将其声明为String并将其简单地添加到代码中。

p_FrmZuordnung

我试图像这样将其作为表单提交:

Public p_FrmZuordnung As String 

然后按如下所示进行设置:

Public p_FrmZuordnung As Form

并在Set p_FrmZuordnung = Forms!Form1 这样的另一种形式中使用它:

Form3

我编写的用于识别主表单中页面的代码有效。 我编写的将变量引用到表单的代码没有。

p_FrmZuordnung!somecontrolelement.requery 

我的目标是在Option Compare Database Option Explicit Public p_FrmZuordnung As Form Public Sub p_ErmittleFrmZuordnung() p_FrmZuordnung = "keine Zuordnung" Select Case Form_Form_GUI.RegisterStr1.Pages(Form_Form_GUI.RegisterStr1.Value).Name Case "pgeVerbMassnahmen" Set p_FrmZuordnung = Forms("Form1") Case "pgeKVPMassnahmen" Set p_FrmZuordnung = Forms("Form2") End Select End Sub 之类的其他子表单中使用p_frmZuordnung

Form3

Private Sub btnCancel_Click()

Me.Undo
DoCmd.Close acForm, "Form3", acSaveYes
p_FrmZuordung.somecontrolelement.Requery

Exit Sub
End Sub

2 个答案:

答案 0 :(得分:0)

全局变量必须在模块中而不是在形式中定义。在哪个模块中定义它并不重要。声明全局变量后,它是静态的,可以用任何形式访问。

您在使用表单上的控件时遇到问题的原因是我们,因为z_FrmZuordnung只是通用表单,并且编译器无法按名称解析控件。您需要从Controls集合中获取控件。

Set z_FrmZuordnung = Forms!Form1
MsgBox z_FrmZuordnung.Name
'MsgBox z_FrmZuordnung.txtHilfstextFocus.Name '<--gives an error
MsgBox z_FrmZuordnung.Controls("txtHilfstextFokus").Name '<--This works
z_FrmZuordnung.Controls("txtHilfstextFokus").SetFocus

答案 1 :(得分:0)

正如您现在告诉我们的,Form1Form2格式位于寄存器控制页的子窗体控件中。

因此您无法通过Forms("Form2")来引用它们,因为它们不是“独立”形式。

相反,您必须知道包含此类子表单的每个子表单控件的名称。然后,存储在每个控件中的表单的名称就不再重要了。

所以我的建议是,为那些子窗体控件命名与包含页面的名称相同,但是添加一个静态后缀,例如SubFormControl(或您喜欢的任何其他后缀)。

例如,页面pgeVerbMassnahmen上的子窗体控件应命名为pgeVerbMassnahmenSubFormControl

然后,您可以通过页面名称和静态后缀来引用子窗体控件。

所以我认为这是您需要的:

Form_GUI中声明一个表单变量(只要您从Form_GUI内部的代码中引用该变量,它就可以是私有的):

Private p_FrmZuordnung As Form

我希望p_ErmittleFrmZuordnung也以Form_GUI的形式存在,因此您可以使用Me来引用Form_GUI

Private Sub p_ErmittleFrmZuordnung()
    Const SUFFIX As String = "SubFormControl"

    Dim currentPagename As String
    currentPagename = Me("RegisterStr1").Pages(Me("RegisterStr1").Value).Name

    Select Case currentPagename
        Case "pgeVerbMassnahmen"
            Set p_FrmZuordnung = Me(currentPagename & SUFFIX).Form
        Case "pgeKVPMassnahmen"
            Set p_FrmZuordnung = Me(currentPagename & SUFFIX).Form
        Case Else
            p_FrmZuordnung = Nothing
    End Select
End Sub

编辑:

如果所有页面都包含子窗体控件,则可以将其缩短:

Private Sub p_ErmittleFrmZuordnung()
    Const SUFFIX As String = "SubFormControl"

    Set p_FrmZuordnung = Me(Me("RegisterStr1").Pages(Me("RegisterStr1").Value).Name & SUFFIX).Form
End Sub