更改所有表单上所有组合框对象的设置

Posted

技术标签:

【中文标题】更改所有表单上所有组合框对象的设置【英文标题】:Change a setting on all the combo box objects on all the forms 【发布时间】:2014-05-07 15:21:12 【问题描述】:

tldr:如何依次引用每个表单上的每个组合框?

我在游戏后期发现组合框的默认值是“LimitToList = False”。这很糟糕,因为我有很多组合框,没有人应该通过在它们上面输入来添加或编辑任何东西。我的用户一直在这样做,我需要他们停止。

例如,我已经知道如何更改我的所有表单,以便拆分表单的方向是“底部的数据表”。也就是说,我已经解决了“打开所有表格,更改每个表格的设置,冲洗,重复”的问题。我所拥有的效果很好:

1    Public Sub MakeSplitFormsAllBottom()
2    
3        Dim strForm As String, db As DAO.Database
4        Dim doc As DAO.Document
5        Set db = CurrentDb
6
7        For Each doc In db.Containers("Forms").Documents
8
9        strForm = doc.Name
10
11           DoCmd.OpenForm strForm, acDesign
12           Forms(strForm).SplitFormOrientation = 1
13
14       DoEvents
15       DoCmd.Close acForm, strForm, acSaveYes
16
17       Next doc
18 
19   End Sub

问题是我不太清楚如何更改每个表单上所有组合框的设置

我在 Google 上搜索了很多,但没有找到任何好的例子,所以我在黑暗中拍摄了(一堆)照片,通常看起来像这样:

1    Public Sub MakeAllCombosLimited()
2    
3        Dim strForm As String, db As DAO.Database, obj As AccessObject, strObj As String
4        Dim doc As DAO.Document
5        Set db = CurrentDb
6
7        For Each doc In db.Containers("Forms").Documents
8
9        strForm = doc.Name
10
11          DoCmd.OpenForm strForm, acDesign
12   
13           For Each obj In strForm
14              Forms(strForm).Controls(obj).LimitToList = True
15              DoEvents
16           Next obj
17    
18       DoEvents
19       DoCmd.Close acForm, strForm, acSaveYes
20
21       Next doc
22
23   End Sub

我尝试过的任何方法都没有奏效。上面的那个给了我错误“For Each 只能迭代一个集合对象或一个数组。”我还尝试了以下变体:

7    For Each obj in db.Containers("Forms").Documents

仅引用整个数据库中的所有对象,但这也不起作用-我得到的是“未定义子或函数”,我猜这是因为您需要说该对象属于特定的表格。

说实话,我不确定我应该问什么问题。在我看来,底线是我至少需要知道以下一项:

    如何引用/修改整个数据库中的所有组合框,或者 如何引用/修改给定表单中的所有组合框

但我知道我不知道其中任何一个的答案。我觉得我让这件事变得比需要的更难。

【问题讨论】:

【参考方案1】:

不确定这是否适用于 Access,但请尝试:

Dim ctrl as Control
For each ctrl in Form.Controls  'Revise to refer to your form object.
    If TypeOf(ctrl) Is MSForms.ComboBox
       'Do something with the ctrl, here:
       '
       '
    End If
Next

【讨论】:

你让我走上了正确的道路!我将在数据库完成运行后立即发布我开始工作的代码。非常感谢!【参考方案2】:

下面是一组代码,它实际上完成了我想要它做的事情:

1    Public Sub MakeAllCombosLimited()
2    
3    Dim db As DAO.Database, strForm As String
4    Dim doc As DAO.Document
5    Set db = CurrentDb
6    
7    For Each doc In db.Containers("Forms").Documents
8        strForm = doc.Name
9        DoCmd.OpenForm strForm, acDesign
10   
11       For Each ctl In Forms(strForm).Controls
12            
13            If ctl.ControlType = acComboBox Then
14               ctl.LimitToList = True
15            End If
16       
17       Next ctl
18   
19       DoEvents
20       DoCmd.Close acForm, strForm, acSaveYes

【讨论】:

以上是关于更改所有表单上所有组合框对象的设置的主要内容,如果未能解决你的问题,请参考以下文章

遍历用户表单中的所有组合框并使用名称进行验证并使它们可见

如何在剑道组合框中更改/设置值

选择项目后将多列组合框的值设置为所有列?

如何根据在表单上的组合框控件中输入的内容从查询中选择所有记录

查找记录的组合框正在显示多个字段

如何在 Access 中将一个控件源与来自用户表单的多个组合框一起使用?