【问题标题】:address textbox in dynamic userform动态用户表单中的地址文本框
【发布时间】:2020-10-04 23:29:23
【问题描述】:

到目前为止,我在这里读了很多书,也得到了很多帮助。感谢那!现在有一件事我无法进一步了解。

我想在 Excel/VBA 中动态创建用户窗体。到目前为止,这是一个例子,我如何创建 5 个名称为 TextBox1-5 的文本框。

                For cTextBox = 1 To 5

                Set edtBox_n = usrFrm.Controls.Add("Forms.textbox.1", "TextBox" & cTextBox)

                    With edtBox_n
                        .Top = nTop
                        .Left = 200
'                        .MultiLine = True
'                        .EnterKeyBehavior = True
                        .Height = 20
                        .Width = 150
                        .Text = .Name
                        '.Name = "Textbox" & cTextBox

                    End With


                    nTop = nTop + 20

                Next cTextBox

但我无法使用命令来处理文本框,例如

Sub CommandButton1_Click()

test = usrFrm.TextBox1.Value

End Sub

有人有想法吗? Excel 说 TextBox 不存在/对象不存在。 非常感谢!

【问题讨论】:

    标签: excel vba userform


    【解决方案1】:

    我处理这个问题的方法是创建一个类来处理控件和事件的大量创建。例如班级ctrlTextBox

    Option Explicit
    
    Public WithEvents edtBox_n As MSForms.TextBox
    Private UForm As UserForm
    
    Public Sub Initialize(frm As UserForm, nme As String)
        Set UForm = frm
        Set editbox_n = UForm.Controls.Add(bstrProgID:="Forms.TextBox.1", Name:=nme)
    End Sub
    Private Sub edtBox_n_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
        MsgBox edtBox_n.value
    End Sub
    

    在我的Userform 中,我首先声明了一个公开的Collection,它在整个表单中都可用。我将在这里存储我所有动态创建的控件。

    Option Explicit
    Private cControls As Collection
    Private Sub UserForm_Initialize()
        Dim cTextBox As Long
        Dim edtBox_n As ctrlTextBox
        Dim nTop As Long
    
        Set cControls = New Collection
    
        For cTextBox = 1 To 5
    
            Set edtBox_n = New ctrlTextBox
            edtBox_n.Initialize frm:=Me, nme:="TextBox" & cTextBox
    
            With edtBox_n.edtBox_n
                .Top = nTop
                .Left = 200
                '                        .MultiLine = True
                '                        .EnterKeyBehavior = True
                .Height = 20
                .Width = 150
                .Text = .Name
            End With
    
            cControls.Add edtBox_n
    
            nTop = nTop + 20
    
        Next cTextBox
    
    End Sub
    

    【讨论】:

    • 谢谢,这看起来像是我想了解的可靠解决方案!不幸的是,我以前从未使用过类,只是简单地复制了它,在“With edtBox_n.edtBox_n.Top = 20”处出现错误(91- Object)。与此同时,我可以使用“usrFrm.controls("TextBox1").value”来处理“TextBox1”。
    • @TonyMono 很高兴你成功了。不确定您出错的代码行来自哪里。看起来可能是复制粘贴错误。With... 行和 ....Top 行应该分开
    猜你喜欢
    • 2014-04-06
    • 2020-07-26
    • 1970-01-01
    • 2017-06-16
    • 2018-02-07
    • 2018-08-06
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多