2

我已经制作了一个 Access 2007 数据库。我将为表单的适当事件编写一些基本的 vba,以便在打开原始表单时显示模态表单。这并不难,但该表单将有一个来自特定表的 ID 下拉框。用户将选择一个 ID,但我希望从此表单中选择的 ID 返回父表单。例如:

  1. 车表打开
  2. 触发事件以打开模态表单

必须从组合框中选择 FK 到汽车的 ID(例如,驾驶员 ID - 为简单起见,假设一辆车可以有多个驾驶员,但反之则不然,因此仅 1:n)

有一个按钮可以确认选择。单击此按钮后,表单关闭,选定的驾驶员 ID 会自动插入到汽车表单上的驾驶员 ID 文本框中(可能是只读的)。

最后一步我不确定。如何在 VBA 中做到这一点?

4

5 回答 5

4

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

这里的关键原则:

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

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

然后在调用窗体中,将隐藏窗体中的值读取出来,然后关闭。

像这样的东西:

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

[IsLoaded 是微软提供的功能;我最近在 StackOverflow 上发布了它,但假设绝大多数编写 VBA 的 Access 开发人员会一直使用它]

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

于 2009-07-16T02:17:06.403 回答
3

要获得对单独运行窗体上的控件的“访问”(得到它?!),您可以使用以下内容:

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

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

于 2009-07-15T00:28:13.553 回答
0

以上所有答案都很好。我特别喜欢将这种功能包装成可重用函数调用的第三种方式。我唯一要添加的是不要关闭模态表单......否则您无法获得所选值。而是做 me.visible=false。

所以你做这样的事情。

Public Function GetCArKey as Integer

dim intReturn as integer

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

'(这个表单的okay按钮的点击事件做me.visible=false...点击取消会关闭表单。)

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

GetCarKey=intReturn

End Function 
于 2009-07-15T03:31:53.573 回答
0

It would seem much easier to me to create a global variable in a module (eg Public gi_Value as Integer) and then set this in the child form. The value can then be read anywhere.

于 2014-01-29T17:36:25.090 回答
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:您还可以在弹出表单上添加一个属性,以查看用户是否单击了确定或取消。如果用户单击取消,它将从上述函数返回空白。

于 2009-07-14T23:40:48.777 回答