我从未使用过英语访问版本,因此,如果我对这个问题的解释不好,请原谅我。
我正在使用旧的Access VBA应用程序。它具有名为Form_GUI
的主要形式。 Form_GUI
有多个标签,每个标签都有自己的“主表单”和几个不同的子表单。这些建立了FrontEnd。它们都与来自不同数据库的各种后端表连接。
我如何在全局中声明变量p_FrmZuordnung
并以某种方式引用,当我想以另一种形式{{1}对Form1
或Form2
进行更改时,可以引用它}}?
我希望子表单根据此变量的值做出不同的反应。
下面是我想与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
答案 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)
正如您现在告诉我们的,Form1
和Form2
格式位于寄存器控制页的子窗体控件中。
因此您无法通过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