我创建了一个Access 2007数据库。我将为表单的相应事件编写一些基本的vba,以便在打开原始表单时显示模式表单。这并不困难,但该表单将具有来自特定表的ID下拉框。用户将选择一个ID,但我希望此表单中的所选ID返回到父表单。 E.g:
必须从组合框中选择FK到汽车的ID(例如,驱动程序的ID - 为简单起见,我们假设一辆汽车可以有多个驱动程序,但反之亦然,因此只有1:n)
有一个确认选择的按钮。单击此按钮后,表单将关闭,所选的驱动程序ID将自动插入到汽车表单的DriverID文本框中(可能只读)。
最后一步我不确定。怎么能在VBA中完成?
答案 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)然后在子窗体中设置它会更容易。然后可以在任何地方读取该值。