无需循环将变量设为当前加载的UserForm对象的方法
问题:如何直接引用唯一显示的UserForm?
我在类模块中写了一段可正常运行的代码:
Private Sub bt_Click() Dim oObj As Object If UserForms.Count = 0 Then Set oObj = ActiveSheet Else For Each uf In VBA.UserForms: Set oObj = uf: Next uf End If Debug.Print oObj.Name End Sub
这段代码的逻辑是:当没有显示UserForm时,oObj指向ActiveSheet;否则指向当前显示的唯一UserForm。
我想知道有没有无需循环的语法,直接把oObj设为当前显示的唯一UserForm,类似set oObj = TheOnlyOneUserformSeenInThisPage的写法。我试过set oObj = UserForm(1),但运行前就报错“Sub or Function not defined”,高亮UserForm。请问正确的语法是什么?
解答
正确的语法是使用复数形式的UserForms集合通过索引访问,代码如下:
Set oObj = UserForms(1)
你之前报错是因为误用了单数的UserForm——它是默认窗体类的名称,并非管理已加载窗体的集合对象。而UserForms(复数)才是VBA中专门用来管理所有已加载窗体的集合,其索引从1开始。
需要注意的是,这段代码仅在确实只有一个窗体加载显示的场景下适用:如果同时加载了多个窗体,UserForms(1)会返回集合中的第一个窗体,而非你预期的“当前显示的那个”。为了确保逻辑严谨,建议先判断窗体数量再执行赋值:
If UserForms.Count = 1 Then Set oObj = UserForms(1) ElseIf UserForms.Count = 0 Then Set oObj = ActiveSheet Else ' 可添加多个窗体加载时的处理逻辑,比如提示用户 MsgBox "当前加载了多个窗体,请检查" End If
内容的提问来源于stack exchange,提问作者karma
相关产品推荐
相关产品推荐

