我正在尝试创建一个基本搜索,查找指定表单中任何控件的部分关键字匹配。表单名称通过组合框选择,并存储为变量。
如何使用它来遍历所选表单的控件?
我可以使用以下内容轻松遍历当前表单的控件:
KafkaCluster.scala
但我无法弄清楚如何引用外部表单,变量基本上替换For Each ctrl In Me.Controls
Debug.Print ctrl.Name
Next ctrl
。
我尝试过使用:
Me
但这只返回错误438(Object不支持此属性或方法)。
答案 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