将变量从子表单传递到主表单

时间:2009-07-14 23:28:39

标签: ms-access vba ms-access-2007

我创建了一个Access 2007数据库。我将为表单的相应事件编写一些基本的vba,以便在打开原始表单时显示模式表单。这并不困难,但该表单将具有来自特定表的ID下拉框。用户将选择一个ID,但我希望此表单中的所选ID返回到父表单。 E.g:

  1. 开车形式
  2. 触发事件以打开模式表格
  3. 必须从组合框中选择FK到汽车的ID(例如,驱动程序的ID - 为简单起见,我们假设一辆汽车可以有多个驱动程序,但反之亦然,因此只有1:n)

    有一个确认选择的按钮。单击此按钮后,表单将关闭,所选的驱动程序ID将自动插入到汽车表单的DriverID文本框中(可能只读)。

    最后一步我不确定。怎么能在VBA中完成?

5 个答案:

答案 0 :(得分:3)

要获得“访问”(获取它?!)以控制单独运行的表单,您可以使用以下内容:

Forms("AnOpenFormName").Controls("ControlName") = value

编辑:我使用错误的括号AMG!

答案 1 :(得分:3)

这是我在StackOverflow.com上见过的最糟糕的Access线程之一,因为至少在某些关键方面,每个答案都是错误的 - 如果你将它们粘贴到VBA中,它们中的任何一个都不会真正运行Access数据库。

这里的关键原则是:

以模态方式打开对话框表单(使用acDialog参数)

确认值后不要关闭它,而是将它的.Visible属性设置为False。

然后在调用表单中,从隐藏表单中读取值,然后将其关闭。

这样的事情:

  DoCmd.OpenForm "dlgPickDriver", , , , , acDialog 
  If IsLoaded("dlgPickDriver") Then
     Me!DriverID = Forms!dlgPickDriver!cmbDriver
     DoCmd.Close acForm, "dlgPickDriver"
  End If

[IsLoaded是Microsoft提供的功能;我最近发布了它here on StackOverflow,但是会认为绝大多数编写VBA的Access开发人员都会永远使用它了。

我建议不要让对话框中运行的代码将数据戳到父表单中,因为这样就无法在多个位置使用对话框表单。让对话形式尽可能少地了解它所称的上下文是良好的编程实践。另一方面,调用表格确实需要知道它从中获取值的控制名称,但在我看来,这是一个比其他方式更合理的上下文。

答案 2 :(得分:0)

您可以编写一个以模态方式显示表单的函数,然后将用户选择的值作为其返回值返回(类似于msgbox / inputbox)。

编辑:您可以编写如下的函数。

Function GetUserSelectedCarID() as string
dim myPopupForm as Form
set myPopupForm = new Form

myPopupForm.Show vbModal
GetUserSelectedCarID = myPopupForm.UserSelectedCar
End Function

UserSelectedCar是一个在弹出窗体上存储用户选择的属性。

EDIT2:您还可以在弹出窗体上添加一个属性,以查看用户是单击“确定”还是“取消”。 如果用户点击取消,它将从上述功能返回空白。

答案 3 :(得分:0)

以上所有答案都很好。我特别喜欢将这种功能包装到可重用函数调用中的第三种方法。我唯一要补充的是不要关闭模态形式......否则你无法获得所选的值。相反,请执行me.visible = false。

所以你做这样的事情。

Public Function GetCArKey as Integer

dim intReturn as integer

docmd.openform "MyModalForm",,,,,,acdialog  

'(此表单的okay按钮的click事件会显示me.visible = false ...单击Cancel将关闭表单。)

if isloaded("MyModalForm") then
   intReturn=Forms("MyModalForm").Controls("ControlName").Value
end if

GetCarKey=intReturn

End Function 

答案 4 :(得分:0)

在模块中创建一个全局变量(例如Public gi_Value as Integer)然后在子窗体中设置它会更容易。然后可以在任何地方读取该值。