Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA类模块,通过按TAB键在工作表上的ActiveX控件之间导航_Excel_Vba_Activex_Keyevent - Fatal编程技术网

Excel VBA类模块,通过按TAB键在工作表上的ActiveX控件之间导航

Excel VBA类模块,通过按TAB键在工作表上的ActiveX控件之间导航,excel,vba,activex,keyevent,Excel,Vba,Activex,Keyevent,尝试完成:Excel工作表(Sheet1)上有几个文本框和组合框(ActiveX控件)按顺序排列,就像用户表单一样。我想通过tabing(按TAB键)在这些控件之间导航 部分成功:我能够使用下面显示的方法和代码在文本框之间导航。然而,当组合框也涉及到时,我不知道该怎么做 请注意:所有这些控件都已分组,必须保持分组状态 我如何在文本框之间导航: 插入了一个名为ClsEventTxtBx的类模块,并添加了以下代码 插入标准模块并添加了子例程JumpingToNextTextBox 在此工作簿中添加了

尝试完成: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