Excelmacros/用户窗体:“For Each”不以TabIndex顺序循环控制

有人可以帮助我了解如何调整“For Each”循环通过UserForm的控件循环的顺序? (我知道它不是通过“TabIndex”顺序循环的,我知道它不关心在“For Each”中以编程方式循环的“TabIndex”。)

我添加控件到我目前的用户窗体(下面的截图),通过复制一个控件的一对夫妇,然后一组控件(Ctrl +单击,复制/粘贴)从以前的forms,并添加控件。 控件组(“站点名称”到“City,St,Zip”)以相反顺序(从下到上)循环。 理想情况下,我想不断从上到下循环。

我尝试通过右键单击和“向后/向前发送”来重新sorting,但对于“For Each”循环没有任何作用。

For Each txtBox In ADSheaderForm.Controls If TypeName(txtBox) = "TextBox" Then If txtBox.Name = "stNmTxtBx" Then ReDim Preserve txtArr(txtNum) txtArr(txtNum) = txtBox.Text txtNum = txtNum + 1 Else If txtBox.Text = "" Or txtBox.Text = "Optional" Then ReDim Preserve txtArr(txtNum) txtArr(txtNum) = "Not Entered" txtNum = txtNum + 1 Else ReDim Preserve txtArr(txtNum) txtArr(txtNum) = txtBox.Text txtNum = txtNum + 1 End If End If End If Next 

在这里输入图像描述

控件似乎通过复制/粘贴顺序添加到表单中(一个组通常具有最后一个),并且不能更改该控件的顺序。

你可以看看下面的代码,看看你可能如何使用tabIndex来为你的目的重新sorting控件。

  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 eg if typeName = blabla Next arrItem MsgBox str 

如果将tabIndexes设置为像以前那样运行,那么这将通过tabIndex位置将它们推送到数组中。 然后你在数组中循环。

我有一个类似的问题与访问窗体的工作,并寻找解决scheme,所以我偶然发现这个职位。 由于我对VBA语法的知识非常有限,所以我不得不把MarcoMarc的想法(感谢那个,btw)变成我想知道如何写的东西。

这是我想出来的…它对我有用:

 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