You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过运行时创建的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:27:28