A Controls
集合是控件(顯然)的簡化集合,並且與控件的放置順序共享相同的順序。首先,即使是可創建的集合對象也缺少方法,例如Exists
或Contains
,因此您需要一個具有錯誤處理功能來從集合中檢查/拉取小部件。
Public Function ExistsWidget(ByVal Name As String) As Boolean
On Error Resume Next
ExistsWidget = Not Me.Controls(Name) Is Nothing
On Error GoTo 0
End Function
如果你真的很喜歡犯規「請求寬恕不許可」選項,你可以拉你的文本框的整個有序集合(和/或與類似的邏輯另一個循環按名稱查詢所有腦幹)。
Public Function PullBoxes() As Collection
Dim Control As MSForms.Control
Set PullBoxes = New Collection
For Each Control In Me.Controls
If TypeOf Control Is MSForms.TextBox And _
Left(Control.Name, 3) = "Box" Then
Call PullBoxes.Add(Control)
End If
Next
End Function
由於部件的名稱是唯一的 - 你可以從函數(Control.Name,控制)對內部,能夠通過名稱來檢查控件的所有腦幹適當W/O錯誤抑制返回Dictionary
。 There's一個很好的指南Dictionary
如果它是一個新的信息給你。
反正不管你選擇什麼樣的對象,如果用戶(或代碼)是無法創造更多的thoose文本框的 - 你可以把這個Function
上面的Static Property Get
或只是一個Property Get
與Static
集裏面,這樣你迭代超過所有控件只有一次(例如在UserForm_Initialize
事件)!
Public Property Get Boxes() As Collection
Static PreservedBoxes As Collection
'There's no loop, but call to PullBoxes to reduce duplicate code in answer
If PreservedBoxes Is Nothing Then _
Set PreservedBoxes = PullBoxes
Set Boxes = PreservedBoxes
End Property
畢竟,最後創建TextBox
與名稱Box*
將是:
Public Function LastCreatedBox() As MSForms.TextBox
Dim Boxes As Collection
Set Boxes = PullBoxes
With Boxes
If .Count <> 0 Then _
Set LastCreatedBox = Boxes(.Count)
End With
End Function
我想,現在的東西更清晰給你!乾杯!
注:所有的代碼都是你的窗體的一堆方法/屬性,因此所有的東西都應該放在窗體模塊的內部。
我很驚訝任何迭代在'Conrtols'對象上工作:P –
@MacroMan - 它可能是用戶定義的:} – Vityata
這不是一種在Access中使用表單的非常糟糕的方式嗎?您正在尋找最後一個控件時,建議您在運行時將文本框添加到表單中,因爲您需要在設計模式下打開表單,所以我一直覺得這是一個糟糕的主意(在Access中)在添加控件之前,添加代碼,以便您可以使用按鈕(而不是鉤住控件的類) - 這個問題不是指出表單設計會更好,還是可能有更好的解決方案? –