【问题标题】:EXCEL Userform - Creating multiple Labels and Textboxes with specific namesEXCEL 用户表单 - 创建具有特定名称的多个标签和文本框
【发布时间】:2023-02-09 04:17:16
【问题描述】:

我有一个有效的数据输入用户表单,但现在我想复制它我总共需要 36 个字段(144 个项目不包括按钮) 举个例子 字段 1 将包含一个文本框和 3 个标签。 (数据条目、标题、底部边框和 FieldRequired 标签。

我想要做的是生成上面的名称,如 Txt1、Txt2、Txt3.... Title1、Title2、Title3、Bdr1、Bdr2、Bdr3、Fr1、Fr2、Fr3,对于一些我需要创建 Listbox1、Listbox2 和Listbox3 在第 1、2 和 3 帧内,但我可以手动完成。

我想将它们分开,跨 4 个字段,向下 9 个字段。

有没有简单的解决方案来执行此操作或仅手动执行?

我可以使用下面的方法来做这个,然后只做 4 次,然后在左边加上 80 然后我需要对其他字段做同样的事情,并将事件应用于它们和字体/字体大小等,但我无法弄清楚如何对它们使用事件。

Sub addLabel()
frmUserAdd.Show vbModeless
Dim lblid As Object
Dim lblc As Long

For lblc = 1 To 9
    Set lblid = frmUserAdd.Controls.Add("Forms.Label.1", "Alert" & lblc, True)
    With lblid
        .Caption = "*Field Required" & lblc
        .Left = 10
        .Width = 60
        .Top = 30 * lblc
    End With
Next
end sub

【问题讨论】:

  • 为了创建/使用事件,您应该为每种控件类型创建特定的类。我可以告诉你怎么做。但是,他们都会吗?应该有相同的代码?如果不是这样,是否有一种算法可以根据其数字后缀选择其行为?
  • 是的,使用 enter exit 和 change 事件隐藏标签并根据选择使它们全部处于活动状态
  • 我不能完全理解代码应该是怎样的。如果我要准备一个答案来展示如何为动态添加的 5 个文本框创建必要的类,将它们命名为“Txt1”、“Txt2”到“Txt5”以及将 Change 事件分配给所有的代码部分创建的文本框,它会是你需要的吗?我的意思是,您应该为具有(它们自己的相同或不同)事件的所有其他控件复制方式。
  • 是的,其余的可以将其应用于其他事件。谢谢
  • 好的。我将准备一段代码来涵盖我上面所说的...

标签: excel vba userform


【解决方案1】:

请测试下一个场景:

  1. 插入一个类模块,将其命名为“clsTbox”并在其中复制下一个代码:
    Option Explicit
    
    Public WithEvents newTBox As MSForms.TextBox
    
    Private Sub newTBox_Change()
       If Len(newTBox.Text) > 3 Then 'it do something for 4 entered digits:
            Select Case CLng(Right(newTBox.name, 1))
                Case 1, 3
                    MsgBox newTBox.name & " changed (" & newTBox.Text & ")"
                Case 2, 4
                    MsgBox newTBox.name & " changed its text"
                Case Else
                   MsgBox newTBox.name & " Different text..."
            End Select
      End If
    End Sub
    

    插入一个 Userform 并在其代码模块中复制下一段代码:

    Option Explicit
    
    Private TBox() As New clsTBox
    
    Private Sub UserForm_Initialize()
        Dim i As Long, txtBox01 As MSForms.TextBox, leftX As Double, tWidth As Double, k As Long
        Const txtBName As String = "Txt"
        
        leftX = 20: tWidth = 50
        ReDim TBox(10) 'use here the maximum number of text boxes you intend creating
        For i = 1 To 5
             Set txtBox01 = Me.Controls.Add("Forms.TextBox.1", txtBName & i)
            With txtBox01
                .top = 10
                .left = leftX: leftX = leftX + tWidth
                .width = tWidth
                .Text = "something" & i
            End With
            
            Set TBox(k).newTBox = txtBox01: k = k + 1
        Next i
        ReDim Preserve TBox(k - 1) 'keep only the loaded array elements
    End Sub
    

    现在,在 5 个新创建的文本框中显示表单和文本。

    您可以通过以下方式显示其中一个实例:

    a) 将其命名为“frmTxtBEvents”

    b) 使用下一个Sub

    Sub ShowTheForm()
       Dim frm As New frmTxtBEvents
       frm.Show vbModeless
    End Sub
    

    当输入4个字符时,根据最后一个文本框名称数字他们的Change事件将显示特定的消息框......

    如果有什么地方不够清楚,请不要犹豫,要求澄清。

    但是在我的国家已经很晚了,(今天)我最多只能呆半个小时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多