Ms access MSAccess 2003-用于将值从一个窗体传递到另一个窗体的VBA

Ms access MSAccess 2003-用于将值从一个窗体传递到另一个窗体的VBA,ms-access,vba,parameters,parameter-passing,Ms Access,Vba,Parameters,Parameter Passing,那么如何将值从一种形式传递到另一种形式呢?例如:用户从列表中选择一个组织,这将打开一个旅行表单,允许用户输入有关旅行的各种信息。在一个地方,我想添加另一个小弹出表单,在那里他们可以输入他们正在访问的组织的联系信息(只是POC的名称和电话) 因此,当从选择屏幕打开初始表单时,它有两个ID,它们简单地隐藏在文本框中(一个是tripID,另一个是OrgID),那么我如何将它们传递给第二个小弹出表单,以便联系人信息具有相对ID 谢谢。通常的方法是从弹出表单中引用初始表单中的文本框,如下所示: Forms

那么如何将值从一种形式传递到另一种形式呢?例如:用户从列表中选择一个组织,这将打开一个旅行表单,允许用户输入有关旅行的各种信息。在一个地方,我想添加另一个小弹出表单,在那里他们可以输入他们正在访问的组织的联系信息(只是POC的名称和电话)

因此,当从选择屏幕打开初始表单时,它有两个ID,它们简单地隐藏在文本框中(一个是tripID,另一个是OrgID),那么我如何将它们传递给第二个小弹出表单,以便联系人信息具有相对ID


谢谢。

通常的方法是从弹出表单中引用初始表单中的文本框,如下所示:

Forms!frmInitialForm!tripID
Forms!frmInitialForm!OrgID
但是,这会将弹出窗体与初始窗体紧密绑定,因此它不能在应用程序中的任何其他地方使用

更好的方法是使用OpenArgs:

DoCmd.OpenForm "frmPopup", OpenArgs:=Me.tripID & ", " & me.OrgID
这会将两个值放入一个字符串中,并将其传递到弹出窗体。然后可以使用Split函数从OpenArgs中解析这两个值

有关使用OpenArgs传递参数的更多信息,请参阅:

这个可能会有帮助


在这些情况下,最好的方法是不要试图传递一组变量。它的代码太多,而且缺乏灵活性。例如,如果需要传递两个值,那么当需求增长到5个值时,这些年会发生什么?试图维护和传递一整套值是太多的编码工作了

请记住,ms access中的每个表单实际上都是可以在代码中操作的类对象。因此,在这里使用对象方法,您不仅可以编写更少的代码,而且您的代码将更干净、更模块化,不需要全局变量,并且您编写的代码通常可以在不同的形式之间重复使用

以下是如何:

通常,当一个窗体在“打开窗体”事件中的第二个窗体中启动另一个窗体时(实际上,您甚至可以在加载事件之后使用),您可以获取对前一个窗体对象的引用。换句话说,您可以在这里使用对象方法

在表单模块级别,对于表单,我将表单对象声明为:

Option Compare Database
Option Explicit 
dim frmPrevious       as form 
然后,在加载表单事件中,我们执行以下操作:

Set frmPrevious = Screen.ActiveForm
现在,我们表单中的任何代码都可以自由使用代码、事件,甚至可以使用以前表单中声明为公共的变量

因此,如果您想强制磁盘写入以前的表单,并重新加载数据

frmPrevious.Refresh
如果要设置ID值,请执行以下操作:

frmPrevious!ID = some value
请注意,您甚至可以将form previous声明为该表单的公共变量,因此,如果您使用两个forms deep,您可以:

frmPrevious.frmPrevious!ID = some value
因此,只需在每个表单代码模块中声明一个表单对象(或者至少在需要在代码中使用值的模块中声明)。上面的意思是任何代码都有一个对前面表单对象的现成引用。在表单中声明为公共的函数将成为表单的一种方法,可以像以下方式运行:

frmPrevious.MyCustomRefresh
或者甚至可以使用一些选项强制上一个表单生成和设置发票号:

frmPrevous.SetInvoice

因此,不仅可以来回洗牌值和数据,还可以轻松地执行为上一个表单在代码中构建的特性和函数

事实上,作为一种编码标准,我的大多数表单都有一个名为
MyRefresh
的公共函数

请注意,这种方法的优点在于,您可以从前面的表单中读取+使用+设置值。这使得您的代码不仅可以接收值,还可以在前面的表单中设置值。因此,这种方法是双向的。您可以在表单之间来回移动数据和值。这里的另一个优点是您不仅限于变量,还可以使用字段、控制值(事件、属性)等

这种方法意味着以前的表单现在可以随时使用


所以不要试图传递一大堆变量。传递对表单的引用,您就有了一个很好的现成对象,这使得这种类型的编码问题变得轻而易举。

我已经有一段时间没有使用Access了,但是您能调用另一个表单,设置模块级/表单级变量,然后关闭另一个表单吗?非常感谢!我特别感谢你的解释;帮助我学习!谢谢你,艾伯特!这种方法非常有趣。我个人使用一些非常类似的东西(至少在精神上)与一个特定的对象,该对象包含所有打开的窗口的集合,其中窗口被声明为表单的实例。除了标准的表单方法和属性之外,这允许我有一系列特定的“窗口”方法和属性。我认为这不适用于获取对活动子窗体的引用。引用将始终指向主窗体。好的,那么如果您的整个操作都在导航窗体中,该怎么办?因为这不起作用。在导航表单的情况下,您可能没有在代码中使用“打开表单”命令来打开表单(因此没有代码或机会传递值)。但是,您可以使用“浏览到”命令设置/打开导航表单。在这些情况下,您必须将set frmPrevious=screen.Activeform替换为对实际表单名称的引用。一旦设置了该引用,frmPrevious就可以工作了。
frmPrevious.SetProjectStatusOn