【问题标题】:One event sub for multiple textboxes instead of declaring it multiple time?一个事件子用于多个文本框,而不是多次声明?
【发布时间】:2021-07-01 03:54:46
【问题描述】:

是否可以为同一工作簿中的多个文本框设置一个更改事件过程? 例如,如果我在工作簿的第一张、第二张和第三张表中有一个名为“textbox3”的文本框,我希望下面的这个单一代码适用于所有这些(文本框),而不是必须在每个上声明它床单。现在,我必须在所有工作表上声明相同的程序,但我只想声明一次,因为它对所有工作表都执行相同的操作。

'my procedure
Sub testObj()
Dim i As Integer, obj As oleobject
Set ac = ThisWorkbook.ActiveSheet

For Each obj In ac.oleobjects
    If TypeName(obj.Object) = "TextBox" And obj.name = "TextBox3" Then
        i = i + 1
        ReDim Preserve TextArray(1 To i)
        Set TextArray(i).TextBoxEvents = obj
    End If
Next obj
Set obj = Nothing

结束子

'My class1
Public WithEvents TextBoxEvents As MSForms.TextBox
'Public WithEvents TextBoxEvents As OLEObject
 

Private Sub TextBoxEvents_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyTab Then
        TextBox12.Activate
    End If
End Sub

【问题讨论】:

  • 改为在模块中声明它,确保它是公共的而不是私有的,然后将文本框控件作为每个表单事件的参数传递给它。
  • 通常你会使用一个 control array 来做这样的事情:例如见siddharthrout.com/index.php/2018/01/15/vba-control-arrays
  • 您的建议是否适用于工作表?这些文本框不在表单上
  • 它的工作方式与表单相同。仅供参考,如果您想用问题标记我,那么您可以添加@TimWilliams,我会收到通知...
  • @TimWilliams ,我无法让它在工作表上工作。你能举个例子吗?

标签: vba


【解决方案1】:

这是一个例子

名为clsTextBox的类模块:

Option Explicit

Public WithEvents TextBoxEvents As MSForms.TextBox

Private Sub TextBoxEvents_Change()
    Debug.Print TextBoxEvents.Name & ": " & TextBoxEvents.Text
End Sub

'Private Sub TextBoxEvents_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'    If KeyCode = vbKeyTab Then
'        TextBox12.Activate 'unclear what you're aiming for here?
'    End If
'End Sub

常规模块:

Dim ColTB As Collection

Sub testObj()
    Dim i As Integer, obj As OLEObject, ac As Worksheet
    
    Set ac = ThisWorkbook.ActiveSheet
    Set ColTB = New Collection
    For Each obj In ac.OLEObjects
        If TypeName(obj.Object) = "TextBox" Then
            ColTB.Add EventObj(obj.Object)
        End If
    Next obj
    Set obj = Nothing
End Sub

Function EventObj(obj As MSForms.TextBox) As clsTextBox
    Dim o As New clsTextBox
    Set o.TextBoxEvents = obj
    Set EventObj = o
End Function

【讨论】:

  • 不确定发生了什么,尝试对其进行测试,我得到用户定义的类型未使用 Function EventObj(obj As MSForms.TextBox) As clsTextBox 定义
  • 您是否将类模块命名为“clsTextBox”?您的 VBA 项目中是否有对“Microsoft Forms 2.0 对象库”的引用? (您可以通过将用户表单添加到项目中然后将其删除来获得它 - 引用将保留)
  • 哦,我把它命名为class1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
相关资源
最近更新 更多