首页 > 解决方案 > 如何在表单之间传递数据?

问题描述

我在下面有这个表格:

会员

一旦我按下“新付款”按钮,我希望表单获取成员 ID 文本框、名字文本框和姓氏文本框内的值,并自动将它们分别加载到下面表单上的字段中:

frmPayments

我正在考虑使用全局变量,但我从未使用过 VBA。有人可以向我解释怎么做吗?

标签: vbadatabasems-access

解决方案


正如一些人所指出的,如果您使用选项卡控件,您可以将该表单作为子表单,然后在大多数情况下根本不需要任何代码。

但是,有很多方法可以传递值。

最干净的代码,没有全局变量?

我建议这种方法:

您不传递值,而是“获取”前一个表单对象。

因此,在您的 2nd forms 代码模块中,您声明了一个名为 frmPrevious 的变量。此 var 在表单模块级别声明。

因此,您的代码模块将如下所示:

Option Compare Database
Option Explicit

Public frmPrevious     As Form

现在,在表单打开事件中,您可以执行以下操作:

Private Sub Report_Open(Cancel As Integer)

   Set frmPrevious = Screen.ActiveForm

End Sub

请注意,在打开事件完成之前,您当前的表单不会成为活动表单。实际上,您甚至可以将上述代码放在表单加载事件中。

现在没事了。

您的新付款按钮代码?

有了上面的内容,您可以自由地从以前的表单中获取您想要的“任何”值。

例如:

Me.CompanyName = frmPrevious!CompanyName
Me.member_id   = fromPrevous!ID

等等。

因此,上述内容很好,从那时起,您可以传递/使用和引用以前表单中的任何值或控件。

但是,您不应该重新复制LastName框,而实际上只为客户设置customer_ID或一些类似的东西,然后您可以在将来参考/gget电话号码,城市等。

重新复制一个值是非常非常糟糕的方法,因为您正在破坏关系设计,并且您最终需要编写大量代码。

事实上,在您的代码中,可能新的付款按钮必须首先进入新记录,否则上述代码将开始覆盖现有值。

而且,如果用户点击了新的付款,然后决定退出而不添加?好吧,那么你会以空白记录结束。

这真正意味着您应该将“复制”和“设置”前一个表单中的值的代码放在插入前的事件中。此事件只会针对新记录触发,因此您不需要特殊代码来检查或担心是否会意外覆盖已知良好记录中的值。


推荐阅读