循环遍历表单中的每个控件,并将表单名称定义为变量

时间:2017-04-07 15:28:12

标签: vba access-vba

我正在尝试创建一个基本搜索,查找指定表单中任何控件的部分关键字匹配。表单名称通过组合框选择,并存储为变量。

如何使用它来遍历所选表单的控件?

我可以使用以下内容轻松遍历当前表单的控件:

KafkaCluster.scala

但我无法弄清楚如何引用外部表单,变量基本上替换For Each ctrl In Me.Controls Debug.Print ctrl.Name Next ctrl

我尝试过使用:

Me

但这只返回错误438(Object不支持此属性或方法)。

4 个答案:

答案 0 :(得分:2)

你也需要Dim ctrl,你可能在表单名称中有空格:

Dim ctrl As Control
Dim variableName as String

variableName = "[" & Me.cmboFormName & "]"

For Each ctrl In Forms(variableName).Controls
    Debug.Print ctrl.Name
Next

答案 1 :(得分:0)

试试这个:

For Each ctrl In UserForm1.Controls 'or use your form name.
     Debug.Print ctrl.Name
Next ctrl

答案 2 :(得分:0)

由于错误发生在Forms(variableName).Controls上,因此指令执行的内容太多,无法轻松调试。拆分它。

声明一个包含Form对象的变量 - 注意,我不是Access dev,我通常使用Excel和MSForms,所以对我来说这将是UserForm,但我非常强烈怀疑您的Access表单不是来自MSForms类型库(您必须非常努力地在Access中获得UserForm),所以我猜测要使用的类型称为Form ,但我可能错了 - 如果在评论中得到纠正,将很乐意编辑。

Dim theForm As Form

现在Set表单对象:

Set theForm = Forms(variableName)

如果您的代码尚未爆炸,那么您已成功检索到表单实例。这不会让我感到惊讶,因为如果该步骤失败,您可能会面临下标超出范围错误。

如果您的库具有Controls集合类,请声明该类型的变量:

Dim theControls As Controls

并指定它:

Set theControls = theForm.Controls

如果Form没有Controls成员,那么可能会导致运行时错误438爆炸,但这不会真正加起来,给定Me.Controls似乎有效。

所以回过头来声明theForm As Object,让VBA的后期绑定魔术查询对象的界面,而不是使用特定的Form界面 - 再次我不太了解Access,但它是相当可能Me 特定表单类型公开Controls集合,但不是通用Form类型 - VBA UI框架内部是那种一团糟。

所以,说COM-gibberish,通过将其声明为Object,您允许运行时查询IDispatch并找到Controls成员。

如果您可以在不抛出的情况下运行该指令(Controls集合分配),那么您应该能够毫无问题地迭代其内容。

另请注意,Forms集合似乎只包含开放表单。

答案 3 :(得分:0)

表单包含已打开表单的集合。很遗憾,您无法使用变量名称访问已关闭的表单。

只需检查表单是否可用。如果没有在正常或设计视图中打开表单并继续这样的代码。

Dim ctrl as Control
Dim variableName as String
variableName = Me.cmboFormName

If Not (FN_FORM_ISLOADED(variableNAme)) Then
    'Open your form in desired view.
    DoCmd.OpenForm variableNAme, acNormal
End If

For each ctrl in Forms(variableName).Controls
    Debug.Print ctrl.Name
Next ctrl

将此功能放在公共模块中

Public Function FN_FORM_ISLOADED(iFormName As String) As Boolean
    Dim I As Integer

    FN_FORM_ISLOADED = False
    For I = 0 To Forms.count - 1
        If Forms(I).name = iFormName Then
            FN_FORM_ISLOADED = True
            Exit Function
        End If
    Next I
End Function