用一行调用多个 Sub

  • 本文关键字:调用 Sub 一行 excel vba
  • 更新时间 :
  • 英文 :


我试图用一行调用多个子,此刻我要这样做(这不实用(

' Textbox1
' Textbox2
' Textbox3
' Textbox...
' Textbox100
Private Sub TextBox1_AfterUpdate()
    Call TextBox1_Function
End Sub
Private Sub TextBox2_AfterUpdate()
    Call TextBox2_Function
End Sub
Private Sub TextBox3_AfterUpdate()
    Call TextBox3_Function
End Sub
' ......................... till Textbox100

我现在想知道我是否可以这样的事情:

' 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个文本框...

对于某些文本框来说,它具有不同的功能,因此我无法使用"每个文本框....."

您可以通过添加处理事件的类来为多个文本框添加事件处理程序。该类可以包括一个BoxType,因此您可以为每种TextBox定义哪种类型,在事件处理程序中,您可以通过其BoxType区分盒子。

  1. 添加Class Module名称 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指定触发事件的文本框的类型。
  2. 初始化您的文本框。因此,将以下代码粘贴到您的用户表格

    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
    

最新更新