2016-04-20 56 views
3

有人可以幫助我理解如何調整「For Each」循環通過UserForm的控件循環的順序? (我知道它不是通過「TabIndex」順序循環的,我知道它並不關心在「For Each」中以編程方式循環的「TabIndex」。)Excel宏/用戶窗體:「For Each」沒有循環通過TabIndex順序的控件

我將控件添加到了我當前的UserForm中(屏幕截圖如下)通過複製一對夫婦的單個控件,然後複製先前表單中的一組控件(Ctrl +單擊,複製/粘貼),然後添加控件。控制組(「站點名稱」到「City,St,Zip」)以相反順序(從下到上)循環。理想情況下,我想不斷從頂部到底部循環。

我嘗試通過右鍵單擊和「發送向後/向前」來重新排序,但對於「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 

enter image description here

回答

1

的控制似乎加入到通過複製/粘貼訂單的形式(一組經常有最後的第一個),你可以在不改變控制的順序。

你可以看看下面的代碼,看看你如何使用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 

如果您將tabIndexes設置爲像您那樣運行,那麼這將通過tabIndex位置將它們推送到數組中。然後你在數組中循環。

+0

我喜歡你的答案,就在一個人想無論怎麼加控制的順序使得通過控制宏觀流動。這也有助於在混合中添加新的控制。我想再給它一點時間,看看是否會彈出一個不同的解決方案。 – JGR

+0

我明白了。它看起來有點笨拙(不得不循環兩次),誰知道 - 也許有一些更優雅的方式 – MacroMarc

+0

我最終刪除了控件並重新添加 - 沒有太多(可能是一打)受到影響。不過,我會在將來記住這一點。很好的答案。 :-) – JGR

1

我有一個類似的問題使用Access窗體並且正在尋找解決方案,所以我偶然發現了這篇文章。由於我對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