MS Access 2003 - 用于将值从一种形式传递到另一种形式的VBA

时间:2009-09-22 22:04:37

标签: ms-access vba parameters parameter-passing

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

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

感谢。

3 个答案:

答案 0 :(得分:16)

在这些情况下,最好的方法是不要试图传递一堆变量。代码太多,而且不灵活。例如,如果您需要传递两个值,那么多年来当该需求增长到5个值时会发生什么?试图维护并传递一整套价值观的代码太多了。

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

以下是:

通常,当一个表单在表单on-open事件中启动第二个表单中的另一个表单时(事实上,您甚至可以使用on-load事件),您可以获取对PREVIOUS表单对象的引用。换句话说,您可以在此处使用对象方法。

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

Option Compare Database
Option Explicit 
dim frmPrevious       as form 

然后,在表格加载事件中,我们去:

Set frmPrevious = Screen.ActiveForm

现在,我们表单中的任何代码都可以自由地使用代码,事件,甚至是代码中前一个表单声明为public的变量。

因此,如果要强制写入先前表单的磁盘,并重新加载数据。

frmPrevious.Refresh

如果要设置ID值,请转到:

frmPrevious!ID = some value

并且,请注意,您甚至可以将表单声明为此表单的PUBLIC变量,因此,如果您有两个表单,那么您可以:

frmPrevious.frmPrevious!ID = some value

因此,只需在EACH表单代码模块中声明一个表单对象(或者至少需要在代码中使用值的表单)。以上意味着任何代码都具有对先前表单对象的现成引用。在表单中声明为public的函数将成为表单的METHOD,并且可以像:

一样运行
frmPrevious.MyCustomRefresh

甚至可以选择强制上一个表格来生成和设置发票号码的选项:

frmPrevous.SetInvoice

frmPrevious.SetProjectStatusOn

因此,您不仅可以来回移动值和数据,还可以轻松执行您在代码中构建的特性和函数。

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

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

这种方法意味着以前的大部分形式现在触手可及。

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

答案 1 :(得分:6)

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

Forms!frmInitialForm!tripID
Forms!frmInitialForm!OrgID

但是,这会将弹出窗体紧密绑定到初始窗体,因此无法在应用程序中的任何其他位置使用它。

更好的方法是使用OpenArgs:

DoCmd.OpenForm "frmPopup", OpenArgs:=Me.tripID & ", " & me.OrgID

这会将您的两个值放入一个字符串中,该字符串将传递给弹出窗体。然后,您可以使用“拆分”功能从OpenArgs中解析出两个值。

有关使用OpenArgs传递参数的详细信息,请参阅: http://www.fmsinc.com/free/NewTips/Access/accesstip13.asp

答案 2 :(得分:1)