excel - 一根线调用多个Sub

标签 excel vba

我正在尝试用一行调用多个 Sub,此时我正在这样做(这不切实际)

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

某些文本框的功能必须不同,因此我无法使用“For Each Textbox.....”

最佳答案

您可以通过添加处理事件的类来为多个文本框添加事件处理程序。此类可以包含 BoxType,以便您可以为每个 TextBox 定义它的类型,然后在事件处理程序中,您可以通过它们的 BoxType.

  1. 添加一个类模块将其命名为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
    

关于excel - 一根线调用多个Sub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56326513/

相关文章:

excel - 在一行中引用多个工作表

excel - 为 Excel VBA 解决方案创建用户帮助文档的最佳方法是什么?

c# - EPPlus 添加带有最新版本 Office Losses All 宏的工作表

excel - 将一个单元格的值分布到多个单元格上,直到剩余值为 0

excel - 使用VBA提取行地址的第一行号

PHP Excel 多张导出 || fatal error : Uncaught exception 'PHPExcel_Exception'

vba - 将每一列转移到一个工作表

java - 计算数据矩阵中的空单元格 xlsx

vba - 将两个工作表函数合并为一个代码

excel - 获取 ID 序列中的第一个和最后一个数字以及产品名称并显示在另一个工作表中