Вызов нескольких Sub с одной линией - PullRequest
3 голосов
/ 27 мая 2019

Я пытаюсь вызвать несколько 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 текстовых полей в каждой ...

Этобыть разными функциями для некоторых текстовых полей, поэтому я не могу использовать «Для каждого текстового поля .....»

1 Ответ

2 голосов
/ 27 мая 2019

Вы можете добавить обработчики событий для нескольких текстовых полей, добавив класс, который обрабатывает события. Этот класс может включать 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
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...