Forms 更改所有窗体上所有组合框对象的设置

Forms 更改所有窗体上所有组合框对象的设置,forms,ms-access,combobox,vba,Forms,Ms Access,Combobox,Vba,tldr:如何依次引用每个表单上的每个组合框? 我在游戏后期发现,组合框的默认值是“LimitToList=False”。这非常糟糕,因为我有很多组合框,任何人都不应该通过在组合框上键入来添加或编辑任何内容。我的用户一直在这样做,我需要他们停止 我已经知道如何更改所有表单,例如,使拆分表单的方向为“底部的数据表”。也就是说,我已经解决了“打开所有表单,更改每个表单的设置,冲洗,重复”的问题。我所做的工作非常出色: 1 Public Sub MakeSplitFormsAllBottom()

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
问题是我不太明白如何更改每个表单上所有组合框的设置

我在谷歌上搜索了很多次,没有找到任何好的例子,所以我在黑暗中拍摄了(一系列)照片,大致如下:

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
只引用整个数据库中的所有对象,但这也不起作用——“Sub或Function not defined”是我得到的,我猜这是因为你需要说对象属于特定的形式

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

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

  • 但我知道我不知道这两个问题的答案。我觉得这比需要的更难了。

    不确定这在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
    

    下面是一组代码,它们实际上完成了我希望它完成的任务:

    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
    

    你让我走上了正确的道路!我将在数据库运行完之后发布我需要处理的代码。非常感谢你!