通过运行时创建的CommandButton为MultiPage用户窗体新增页面报错求助
解决类模块中无法访问UserForm控件的问题
你遇到的问题核心是类模块里的Me关键字指向的是类实例本身,而不是你的UserForm,所以Me.MultiPage1自然找不到对应的控件。下面是具体的修复步骤和代码调整:
步骤1:修改类模块(Classe3)
给类添加一个公共变量来引用父窗体,这样就能通过这个变量访问UserForm上的所有控件:
Option Explicit Public WithEvents CmdEvents As MSForms.CommandButton ' 添加这行:用于引用父UserForm Public ParentForm As MSForms.UserForm Private Sub CmdEvents_Click() Dim multi_page As MSForms.Page Dim nb_blocks As Integer Dim i As Integer ' 替换Me为ParentForm,指向你的UserForm nb_blocks = ParentForm.MultiPage1.Pages(0).UF4_TB_nbC.Value For i = 1 To nb_blocks ' 明确声明为Page类型,更严谨 Set multi_page = ParentForm.MultiPage1.Pages.Add("page" & CStr(i), i) With multi_page ' 同样用ParentForm访问动态生成的TextBox .Caption = ParentForm.MultiPage1.Pages(0).Controls("UF4_TB_nameBlock" & CStr(i)).Value End With Next i End Sub
注意:把字符串拼接的
+换成&,VBA中&是专门的字符串连接符,避免+可能导致的类型转换错误。
步骤2:调整UserForm中的代码
在创建类实例并绑定按钮的时候,把当前窗体赋值给类的ParentForm属性,同时确保cmdArray是正确的类型:
' 先在UserForm的声明区域添加数组声明 Dim cmdArray() As New Classe3 Private Sub CommandButton1_Click() Dim command_button As MSForms.CommandButton Dim nb_blocks As Integer ' 先获取输入的数量(假设你这里已经正确获取了nb_blocks) nb_blocks = Me.UF4_TB_nbC.Value ' 动态生成按钮 Set command_button = Me.MultiPage1.Pages(0).Controls.Add("Forms.CommandButton.1") With command_button .Height = 18 .Top = 96 + 18 * nb_blocks + 18 .Width = 60 .Left = 44 .Caption = "Ok" .Name = "UF4_CB2_Validation" .Tag = 1 End With ' 调整数组并绑定类,同时赋值ParentForm If Not IsArray(cmdArray) Then ReDim cmdArray(1 To 1) Else ReDim Preserve cmdArray(1 To UBound(cmdArray) + 1) End If Set cmdArray(UBound(cmdArray)).CmdEvents = command_button ' 关键:把当前窗体传递给类 Set cmdArray(UBound(cmdArray)).ParentForm = Me Set command_button = Nothing End Sub
额外注意事项
- 确保你动态生成的TextBox名称严格是
UF4_TB_nameBlock1、UF4_TB_nameBlock2…这样的格式,否则Controls("UF4_TB_nameBlock" & CStr(i))会找不到控件。建议在生成TextBox时明确设置Name属性:Dim txtBox As MSForms.TextBox For i = 1 To nb_blocks Set txtBox = Me.MultiPage1.Pages(0).Controls.Add("Forms.TextBox.1") txtBox.Name = "UF4_TB_nameBlock" & i ' 补充位置、大小等样式设置 txtBox.Top = 30 + 20 * i txtBox.Left = 44 txtBox.Width = 100 Next i - 若你是第一次生成按钮,数组初始化判断能避免
UBound报错,让代码更健壮。
这样调整后,类模块就能通过ParentForm正确访问到UserForm上的MultiPage和所有控件,点击动态生成的按钮时就不会再报错了。
内容的提问来源于stack exchange,提问作者Nikola Lakic
相关产品推荐
相关产品推荐

