Excel 调用多个子&x27;只有一行

Excel 调用多个子&x27;只有一行,excel,vba,Excel,Vba,我试着用一行呼叫多个Sub,现在我正在这样做(这不实际) 我现在想知道我是否可以这样做: ' Textbox1 ' Textbox2 ' Textbox3 ' Textbox... ' Textbox100 Private Sub TextBox1_AfterUpdate() ' 1 - Get this Sub Object (I don't know if it's possible) ' 2 - Then Call the function Call Text

我试着用一行呼叫多个Sub,现在我正在这样做(这不实际)

我现在想知道我是否可以这样做:

' Textbox1
' Textbox2
' Textbox3
' Textbox...
' Textbox100

Private Sub TextBox1_AfterUpdate()

    ' 1 - Get this Sub Object (I don't know if it's possible)
    ' 2 - Then Call the function 
    Call TextBox_Function OBJ_Name

End Sub

Function TextBox_Function(OBJ as Object)

    ' Do some code

End Function

或者更好的。。。用更少的代码行。。。因为我有10个文本类别,每个类别都有100个文本框


某些文本框必须具有不同的函数,因为我不能使用“for Each Textbox…”

您可以通过添加一个处理事件的类来为多个文本框添加事件处理程序。此类可以包含一个
BoxType
,因此您可以为每个
TextBox
定义其类型,然后在事件处理程序中,您可以通过其
BoxType
来区分这些框

  • 添加
    类模块
    将其命名为
    clsTextBox
    并粘贴以下代码:

    Option Explicit
    
    Public WithEvents pTbx As MSForms.TextBox
    Public BoxType As String
    
    Private Sub pTbx_AfterUpdate()
        Select Case BoxType
            Case "TypeA"
                Debug.Print "Type A update " & pTbx.Name
            Case "TypeB"
                Debug.Print "Type B update " & pTbx.Name
        End Select
    End Sub
    
    Private Sub pTbx_Change()
        Select Case BoxType
            Case "TypeA"
                Debug.Print "Type A change " & pTbx.Name
            Case "TypeB"
                Debug.Print "Type B change " & pTbx.Name
        End Select
    End Sub
    
    创建您需要的事件

    • pTbx
      指触发事件的文本框
    • BoxType
      指定触发事件的文本框的类型
  • 初始化文本框。因此,请在用户窗体中粘贴以下代码

    Option Explicit
    
    Private mClsTbx() As clsTextBox
    
    Private Sub InitBoxes(ByVal BoxType As String, ByVal BoxNames As Variant)
        Dim StartIdx As Long
    
        On Error Resume Next
        StartIdx = UBound(mClsTbx) + 1
        On Error GoTo 0
        ReDim Preserve mClsTbx(StartIdx + UBound(BoxNames))
    
        Dim i As Long
        For i = 0 To UBound(BoxNames)
            Set mClsTbx(i + StartIdx) = New clsTextBox
            Set mClsTbx(i + StartIdx).pTbx = Controls(BoxNames(i))
            mClsTbx(i + StartIdx).BoxType = BoxType
        Next i
    End Sub
    
    
    Private Sub UserForm_Initialize()
        'here we define which TextBox belongs to which type
        InitBoxes BoxType:="TypeA", BoxNames:=Array("TextBoxA1", "TextBoxA2")
        InitBoxes BoxType:="TypeB", BoxNames:=Array("TextBoxB1", "TextBoxB2")
        'add more types here
    End Sub
    

  • 对于所有文本框,它应该是一个函数,还是对于某些文本框,它应该是不同的函数?对于某些文本框,它应该是不同的函数。如果不使用类来处理更新(或解决这个问题),我看不到这一点。我遇到编译错误“仅在对象模块中有效”使用此行:Public with events pTbx As MSForms。TextBox@HeitorBadotti是否添加了类模块?一个普通的模块不工作。是的!我添加了一个类模块“Insert>classmodule”。好吧,这是可行的,我对它进行了测试。第一个代码块需要在类模块中,第二个代码块需要在用户表单中。你用的是哪个Excel版本?是的,我用了这个。。。我使用的是1904(Build 11601.20230)
    Option Explicit
    
    Private mClsTbx() As clsTextBox
    
    Private Sub InitBoxes(ByVal BoxType As String, ByVal BoxNames As Variant)
        Dim StartIdx As Long
    
        On Error Resume Next
        StartIdx = UBound(mClsTbx) + 1
        On Error GoTo 0
        ReDim Preserve mClsTbx(StartIdx + UBound(BoxNames))
    
        Dim i As Long
        For i = 0 To UBound(BoxNames)
            Set mClsTbx(i + StartIdx) = New clsTextBox
            Set mClsTbx(i + StartIdx).pTbx = Controls(BoxNames(i))
            mClsTbx(i + StartIdx).BoxType = BoxType
        Next i
    End Sub
    
    
    Private Sub UserForm_Initialize()
        'here we define which TextBox belongs to which type
        InitBoxes BoxType:="TypeA", BoxNames:=Array("TextBoxA1", "TextBoxA2")
        InitBoxes BoxType:="TypeB", BoxNames:=Array("TextBoxB1", "TextBoxB2")
        'add more types here
    End Sub