问题描述
我需要以编程方式读取表单的 RecordSource 属性,以了解表单所依赖的表或查询。
经过一番研究,似乎表单对象实际上需要在窗口中打开(或隐藏,但打开)才能访问某些属性。我整理了以下代码片段:
Application.DoCmd.OpenForm "Form1",view:=acDesign,windowMode:=acWindownormal
Dim frm as Access.Form
Set frm = Forms("Form1").Form
Debug.print frm.Name 'works ok
Debug.print frm.RecordSource 'prints an empty string
Application.DoCmd.Close AcForm,"Form1"
我可以看到表单已正确打开,但 RecordSource 属性为空,即使表单是从表中输入的。
会发生什么?我正在使用 .accdb Ms Access 数据库文件。并压缩了数据库,以防万一数据库损坏,但问题仍然存在。
编辑:表单很小,我意识到实际上根本没有记录源;它只有一个子表单,因为它确实是用表格提供的,所以确实有一个非空的 RecordSource。 所以 VBA 正确地为父表单返回了一个空白的 RecordSource。毕竟发布的脚本是正确的。感谢您的投入!!
任何提示或方向将不胜感激。提前谢谢你!!
解决方法
最有可能的是,RecordSource 在加载表单时在代码中分配,作为表名或 SQL:
Me.RecordSource = "Select * From SomeTable Order By SomeField"
,
在设计视图中,您无法以编程方式获取 RecordSource
。您可以从 Property
窗口看到。您必须以正常形式打开它,可能您希望它以隐藏形式打开。您可以指定 WindowMode
以通过 DoCmd.OpenForm "Form1",acNormal,acHidden
隐藏打开表单。试试下面的代码。
Private Sub CmdTest_Click()
Dim frm As Access.Form
DoCmd.OpenForm "Form1",acHidden
Set frm = Forms("Form1")
Debug.Print frm.Name
Debug.Print frm.RecordSource
DoCmd.Close acForm,"Form1"
End Sub