如何在表单之间传递数据?

时间:2019-07-18 16:41:06

标签: database vba ms-access access-vba

我在下面有此表格:

frmMembers

当我按下“新付款”按钮时,我希望表单采用成员ID文本框,名字文本框和姓氏文本框内的值,并分别将它们分别自动加载到字段中。表格如下:

frmPayments

我正在考虑使用全局变量来实现,但是我从未使用过VBA。有人可以向我解释如何做吗?

1 个答案:

答案 0 :(得分:1)

正如一些人所述,如果使用选项卡控件,则可以将该表单作为子表单放置,然后在大多数情况下完全不需要代码。

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

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

我建议这种方法:

您不传递值,而是“抓住”先前的表单对象。

因此,在第二个表单代码模块中,您声明了一个名为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

等等。

因此,上面的代码很不错,因为这样您就可以传递/使用并引用前一个表格中的任何值或控件。

但是,您不应该重新复制“姓氏”框,但实际上只能为客户设置“ customer_ID”或类似名称,这样以后您就可以引用/获取电话号码,城市等。

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

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

并且,如果用户点击了新的付款,然后THEN决定纾困而不添加?好吧,那么您将获得空白记录。

这的真正含义是,您应该将“复制”和“设置”先前表单中的值的代码放入before insert事件中。此事件仅会触发新记录,因此您不需要特殊的代码即可检查或担心是否会意外覆盖已知有效记录中的值。