Excel 调用多个子&x27;只有一行
我试着用一行呼叫多个Sub,现在我正在这样做(这不实际) 我现在想知道我是否可以这样做: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
' 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