【问题标题】:VBA KeyDown Event Assigned to ActiveX Control through Class Module Not Working通过类模块分配给 ActiveX 控件的 VBA KeyDown 事件不起作用
【发布时间】:2021-02-01 07:00:38
【问题描述】:

目的:通过类模块将keydown事件分配给工作表(Sheet1)上的4个文本框

我有一个 Excel 工作表 (Sheet1),上面有 4 个文本框(默认名称 - TextBox1、TextBox2、TextBox3、TextBox4)。

采取的步骤:

(1) 使用以下代码创建了一个名为 ClsEventTxtBx 的类模块。

    Public WithEvents CTxtBx As MSForms.TextBox

      Private Sub CTxtBx_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyTab Then Debug.Print CTxtBx.Name
      End Sub

(2) 在 Workbook Open 事件中添加以下代码。

    Dim TxtBxArr() As New ClsEventTxtBx
 
    Private Sub Workbook_Open()
      Dim i As Integer, shp As Shape

      For Each shp In Sheet1.Shapes
        If shp.Type = msoOLEControlObject Then
            If TypeName(shp.OLEFormat.Object.Object) = "TextBox" Then
                i = i + 1
                ReDim TxtBxArr(1 To i)
                Set TxtBxArr(i).CTxtBx = shp.OLEFormat.Object.Object
            End If
        End If
      Next shp
    
    End Sub

你能找出代码有什么问题吗?

【问题讨论】:

  • 如果要维护现有的数组内容,需要使用Redim Preserve

标签: excel vba


【解决方案1】:

试试,

Dim TxtBxArr() As New ClsEventTxtBx
Private Sub Workbook_Open()
        Dim i As Integer, shp As OLEObject

    For Each shp In Sheet1.OLEObjects
          If shp.progID = "Forms.TextBox.1" Then
              i = i + 1
              ReDim Preserve TxtBxArr(1 To i)
              shp.Name = "myshp" & i
              Set TxtBxArr(i).CTxtBx = shp.Object
          End If
    Next shp
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多