循环访问 MS Access 子窗体并获取列可见性

Posted

技术标签:

【中文标题】循环访问 MS Access 子窗体并获取列可见性【英文标题】:Loop through MS Access subform and get column visibility 【发布时间】:2020-04-20 15:40:13 【问题描述】:

我正在使用一个包含多个页面的选项卡控件,每个页面都存储一个具有不同列数的子表单。每个子表单都必须显示一些基本信息,并且按需显示更多信息。每个子表单的OnLoad 事件定义了哪一列可见或不可见。

作为导出工具的一部分,我正在尝试构建一个循环,该循环返回每个字段 name、字段 captionvisibility列作为布尔值。

Dim strAns As String
Dim ctl As Control
Dim sfrm As SubForm
Set sfrm = Forms![frm_Main]![frm_Sub]

For Each ctl In sfrm.Controls
    strAns = ctl.Name & "_" & ctl.Caption & "_" & ctl.columnVisible
    Debug.Print strAns
Next ctl

目前它只使用ctl.Name 运行,但我觉得这可能不是我用例的正确语法。它在新行中返回每个字段名称以及它下面的文本框的名称,所以基本上这是我需要的信息的两倍。

有人知道如何到达其他两个属性吗?

【问题讨论】:

您是否在项目资源管理器中查看了控件的可用字段?我认为.Visible 应该可以工作。但是 VBE 中的项目资源管理器会帮助您,VBA Access 的控制对象的文档也会帮助您——尽管有时缺少 MSDN 文档。 .Visible 为每个字段返回 True :( 可能需要引用字段而不是控件。并使用 ColumnHidden 而不是 ColumnVisible。评论docs.microsoft.com/en-us/previous-versions/office/developer/… 【参考方案1】:

对于那些有同样问题的人,这里有一个可能的解决方法!与此同时,我发现我的特定用例不一定需要.Caption

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rstQry As DAO.Recordset
Dim fldQry As DAO.Field

Set db = CurrentDb
Set qdf = db.QueryDefs("qrySource_frmSub")
Set rstQry = qdf.OpenRecordset

Dim dictHidden As New Scripting.Dictionary
For Each fldQry In rstQry.Fields
    dictHidden.Add fldQry.Name, False
Next fldQry
qdf.Close

Dim frm As SubForm
Set frm = Forms![frm_Main]![frm_Sub]

For Each key In dictHidden.Keys
    dictHidden(key) = frm.Controls.item(key).ColumnHidden
Next key

【讨论】:

以上是关于循环访问 MS Access 子窗体并获取列可见性的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历所有子窗体 MS Access VBA

Ms Access中更新主窗体时更新子窗体的相关字段

循环访问 MS Access 中的子记录

MS Access 子窗体不显示记录且不导航

访问子表单可见性

子表单在 MS Access 中的主表单之前打开