Excel宏/用户表单:“Excel宏/用户表单”;对于每一个“;不按TabIndex顺序在控件之间循环

Excel宏/用户表单:“Excel宏/用户表单”;对于每一个“;不按TabIndex顺序在控件之间循环,excel,vba,Excel,Vba,有人能帮助我理解如何调整“For Each”循环在用户表单控件中循环的顺序吗?(我知道它不是通过“TabIndex”顺序循环的,我也知道它在“For Each”中编程循环时并不关心“TabIndex”。) 我将控件添加到当前的UserForm(下面的屏幕截图)中,方法是从上一个窗体复制一个控件,然后复制一组控件(Ctrl+单击,复制/粘贴),然后再添加控件。控件组(“站点名称”到“城市、街、邮编”)按相反顺序(从下到上)循环。理想情况下,我希望从上到下连续循环 我试图通过右键单击和“向后/向前发

有人能帮助我理解如何调整“For Each”循环在用户表单控件中循环的顺序吗?(我知道它不是通过“TabIndex”顺序循环的,我也知道它在“For Each”中编程循环时并不关心“TabIndex”。)

我将控件添加到当前的UserForm(下面的屏幕截图)中,方法是从上一个窗体复制一个控件,然后复制一组控件(Ctrl+单击,复制/粘贴),然后再添加控件。控件组(“站点名称”到“城市、街、邮编”)按相反顺序(从下到上)循环。理想情况下,我希望从上到下连续循环

我试图通过右键单击和“向后/向前发送”来重新排序,但这对我的“for Each”循环没有任何作用


控件似乎是按复制/粘贴顺序添加到表单中的(一个组通常最后一个作为第一个),您不能更改控件的顺序

您可以查看以下代码,并了解如何使用tabIndex对控件进行重新排序

  Dim ctrl As Control
  Dim str As String
  Dim v() As Control
  Dim i As Long
  Dim arrItem As Variant

  i = ADSheaderForm.Controls.count
  ReDim v(1 To i)

  For Each ctrl In ADSheaderForm.Controls
        Set v(ctrl.TabIndex + 1) = ctrl
  Next ctrl

  For Each arrItem In v
        str = str & arrItem.Name & vbNewLine
        'Actually do your code as above within this loop e.g. if typeName = blabla
  Next arrItem

  MsgBox str

如果您将tabIndex设置为按原样运行,那么这将按tabIndex位置将它们推送到数组中。然后你在数组中循环。

我在使用访问表单时遇到了类似的问题,正在寻找解决方案,所以我偶然发现了这篇文章。由于我对VBA语法的了解非常有限,我不得不把MarcoMarc的想法(谢谢你,顺便说一句)变成我会写的东西

这是我想到的。。。这对我很有用:

Dim i as Integer
Dim ctl as Control

For i = 1 To ADSheaderForm.Controls.Count
    For Each ctl In ADSheaderForm.Controls
        If ctl.TabIndex = i then
            'do something 
            Exit For
        End If
    Next ctl
Next i

正如MacroMarc所述,您可以使用复制/粘贴功能一次对所有控件进行重新排序,但必须按照您希望它们循环的相反顺序选择控件


例如,在userform中,您可以选择“工作范围”旁边的文本框,按住CTRL键并按相反顺序单击每个后续控件。剪切、粘贴和瞧,它们将按正确的顺序循环。

我喜欢你的答案,只要使宏按所需的顺序通过控件,而不管控件是如何添加的。在将新控件添加到混合中的情况下,这也会有所帮助。我想再给它一点时间看看是否会出现不同的解决方案。我理解。它看起来有点笨拙(必须循环两次),谁知道呢?也许有更优雅的方法,我最终删除了控件并重新添加了它们,但受影响的并不多(可能有十几个)。不过,我以后会记住这一点。回答得好。:-)
Dim i as Integer
Dim ctl as Control

For i = 1 To ADSheaderForm.Controls.Count
    For Each ctl In ADSheaderForm.Controls
        If ctl.TabIndex = i then
            'do something 
            Exit For
        End If
    Next ctl
Next i