Excel VBA类模块,通过按TAB键在工作表上的ActiveX控件之间导航
尝试完成:Excel工作表(Sheet1)上有几个文本框和组合框(ActiveX控件)按顺序排列,就像用户表单一样。我想通过tabing(按TAB键)在这些控件之间导航 部分成功:我能够使用下面显示的方法和代码在文本框之间导航。然而,当组合框也涉及到时,我不知道该怎么做 请注意:所有这些控件都已分组,必须保持分组状态 我如何在文本框之间导航: 插入了一个名为ClsEventTxtBx的类模块,并添加了以下代码 插入标准模块并添加了子例程JumpingToNextTextBox 在此工作簿中添加了以下代码Excel VBA类模块,通过按TAB键在工作表上的ActiveX控件之间导航,excel,vba,activex,keyevent,Excel,Vba,Activex,Keyevent,尝试完成:Excel工作表(Sheet1)上有几个文本框和组合框(ActiveX控件)按顺序排列,就像用户表单一样。我想通过tabing(按TAB键)在这些控件之间导航 部分成功:我能够使用下面显示的方法和代码在文本框之间导航。然而,当组合框也涉及到时,我不知道该怎么做 请注意:所有这些控件都已分组,必须保持分组状态 我如何在文本框之间导航: 插入了一个名为ClsEventTxtBx的类模块,并添加了以下代码 插入标准模块并添加了子例程JumpingToNextTextBox 在此工作簿中添加了
Dim ctlArr() As New ClsEventTxtBx
Private Sub Workbook_Open()
Dim i As Integer, shp As Shape, oleshp As Shape, oleArr(), oleObject As oleObject
Dim oleColl As New Collection
For Each shp In Sheet1.Shapes
If shp.Type = msoGroup Then
For Each oleshp In shp.GroupItems
If oleshp.Type = msoOLEControlObject Then
If TypeName(oleshp.OLEFormat.Object.Object) = "TextBox" Then
i = i + 1
ReDim Preserve ctlArr(1 To i)
Set ctlArr(i).CTxtBx = oleshp.OLEFormat.Object.Object
End If
End If
Next oleshp
End If
Next shp
End Sub
“按顺序排列”在Excel上下文中是相对的。他们的秩序是他们创造的秩序。现在,您的代码只将文本框名称放入数组中,然后根据它们的创建顺序从一个文本框跳到另一个文本框。你想要什么?如果在光标位于每个现有组合框内时按下Tab键,是否还可以在每个现有组合框之间跳转?当光标位于最后一个(创建的)文本框中时,要跳转到这样的组合框,或者什么?让我们假设控件的顺序如下(我同意创建顺序)。文本框1、文本框2、组合框1、文本框3、组合框2。如果我在ComboBox1中并按TAB键,光标应该移动到TextBox3。应激活序列中的下一个。如果光标位于ComboBox2中,按tab键应将光标移动到TextBox1。然后,必须创建另一个类来触发组合框的
KeyDown
(或keydup
)事件。两个事件(也包括文本框和组合框)都应该调用一个公共事件,比如说JumpingToNextControl
。然后,在工作簿\u Open
事件中放置一段类似的代码,将事件分配给所有组合框。如果TypeName(…)=“TextBox”或TypeName(…)=“ComboBox”和相同的原理,在控件之间跳转的子控件将使用。现在,在任何这样的控件中按Tab键都应该跳转到下一个(创建的)控件…让我试试。同时,是否有一种方法可以创建一个类来触发OLEObject的事件,然后使用JumpingToNextControl
将事件分配给所有OLEObject?恐怕您不能。用于分配事件的类是一种包装器。我的意思是,它只能处理已声明对象的现有事件(在您的示例中为MSForms.TextBox
)类。由于OLEObject
类本身不公开任何事件,因此不能简单地创建(常规)事件。。。
Sub JumpingToNextTextBox(ActiveCtl As MSForms.TextBox)
Dim shp As Shape, oleshp As Shape, i As Integer, ctlArr()
For Each shp In Sheet1.Shapes
If shp.Type = msoGroup Then
For Each oleshp In shp.GroupItems
If TypeName(oleshp.OLEFormat.Object.Object) = "TextBox" Then
i = i + 1
ReDim Preserve ctlArr(1 To i)
ctlArr(i) = oleshp.OLEFormat.Object.Name
End If
Next oleshp
End If
Next shp
i = 0
For i = LBound(ctlArr) To UBound(ctlArr)
If ActiveCtl.Name = ctlArr(i) Then
If Not i = UBound(ctlArr) Then
Sheet1.OLEObjects(ctlArr(i + 1)).Activate
Else
Sheet1.OLEObjects(ctlArr(1)).Activate
End If
End If
Next I
End Sub
Dim ctlArr() As New ClsEventTxtBx
Private Sub Workbook_Open()
Dim i As Integer, shp As Shape, oleshp As Shape, oleArr(), oleObject As oleObject
Dim oleColl As New Collection
For Each shp In Sheet1.Shapes
If shp.Type = msoGroup Then
For Each oleshp In shp.GroupItems
If oleshp.Type = msoOLEControlObject Then
If TypeName(oleshp.OLEFormat.Object.Object) = "TextBox" Then
i = i + 1
ReDim Preserve ctlArr(1 To i)
Set ctlArr(i).CTxtBx = oleshp.OLEFormat.Object.Object
End If
End If
Next oleshp
End If
Next shp
End Sub