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

Vba 如何在表单之间传递数据?,vba,database,ms-access,Vba,Database,Ms Access,我有以下表格: 一旦我按下“新建付款”按钮,我希望表单获取成员ID文本框、名字文本框和姓氏文本框中的值,并自动将它们分别加载到下面表单上的字段中: 我正在考虑使用全局变量,但我从未使用过VBA。有人能给我解释一下怎么做吗?正如一些人所说的,如果你使用一个选项卡控件,你可以把这个表单作为一个子表单,然后在大多数情况下,根本不需要代码 但是,传递值的方法有很多种 最干净的代码,没有全局变量 我建议采取这种做法: 您不传递值,而是“抓取”上一个表单对象 因此,在第二个表单代码模块中,您声明了一个名为f

我有以下表格:

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


我正在考虑使用全局变量,但我从未使用过VBA。有人能给我解释一下怎么做吗?

正如一些人所说的,如果你使用一个选项卡控件,你可以把这个表单作为一个子表单,然后在大多数情况下,根本不需要代码

但是,传递值的方法有很多种

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

我建议采取这种做法:

您不传递值,而是“抓取”上一个表单对象

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

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

Option Compare Database
Option Explicit

Public frmPrevious     As Form
现在,在“打开事件”窗体中,您可以执行以下操作:

Private Sub Report_Open(Cancel As Integer)

   Set frmPrevious = Screen.ActiveForm

End Sub
请注意,在打开事件完成之前,当前表单不会成为活动表单。事实上,您甚至可以将上述代码放在forms on load事件中

好的,现在

您的新付款按钮代码

有了以上内容,您就可以自由地从上一个表单中获取所需的“任意”值

例如:

等等

因此,上面的内容很好,因为您可以传递/使用和引用上一个表单中的任何值或控件

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

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

事实上,在代码中,“新建付款”按钮可能必须先转到新记录,否则上述代码将开始覆盖现有值

而且,如果用户点击了新的支付,然后决定退出而不添加?好吧,那你就会有空白记录了


这实际上意味着您应该将“复制”和“设置”上一个表单中的值的代码放在before insert事件中。此事件只会针对新记录触发,因此,如果在已知良好记录中意外写入值,则无需使用特殊代码进行检查或担心。

全局变量是一种方法。将数据正确地抽象到一个模型类中,该模型类可以在表单实例之间传递。我认为全局变量是丑陋和错误的,甚至在任何其他编程语言中都不会被视为选项。不知道为什么它突然在VBA代码中被接受,但您的里程可能会有所不同。在我看来,您编写的代码比需要的要多,因为您使用了两个弹出表单来完成这项工作。如果您将支付表单作为子表单,则可以免费获得所需的功能,并且代码更少。
Me.CompanyName = frmPrevious!CompanyName
Me.member_id   = fromPrevous!ID