一个
控件集合 是一组简单的控件,它们有一个相同的顺序,与控件的放置顺序相同。
首先,即使是可创建的集合对象也缺乏
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、Control)对的
Dictionary
,并能够正确地检查小部件的名称是否存在,而不需要错误抑制。
如果
Dictionary
对您来说是新信息,则
这里有一份很好的指南。
无论选择哪个对象,如果用户(或代码)无法创建更多的文本框,则可以将此上述
Function
转换为具有
Static
集合的
Static Property Get
或只是
Property Get
,这样您只需要在
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
毕竟,最后创建的名称为Box*
的TextBox
将会是:
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
我认为现在对你来说事情更清晰了!干杯!
注:所有代码都是表单的一堆方法/属性,因此所有内容都应放置在表单模块内。
Me.Controls
最终也将需要更改,但目前还不相关。 - George