我有一个userform“myUserForm”,其中包含许多TypeName()为“CheckBox”的控件。我只是讨厌有几十个名为“Private Sub Chk1_Click()”的_Click()例程,所以为了管理_Click()例程的数量,我简化并使它们几乎相同:
Private Sub Chk1_Click()
ProcessClickFor ("Chk1")
End Sub
Private Sub Chk2_A_Click()
ProcessClickFor ("Chk2_A")
End Sub
Private Sub Chk3_Z_Click()
ProcessClickFor ("Chk3_Z")
End Sub
ProcessClickFor()可以完成大部分工作。
Sub ProcessClickFor(anyCheckBox As String)
Dim cbControl As Object
Set cbControl = ControlByName(anyCheckBox)
If cbControl.Value Then
cbControl.Value = True
End If
End Sub
稍后,当我想使用任何控件时,我可以按名称获取Control对象,例如:
Dim aControl As Object
Set aControl = ControlByName(“Chk3”)
MsgBox “The control named “ & cbControl.Name & “ is “ & cbControl.Visible
Function ControlByName(sName) As Object
Dim objectified As Object
For Each objectified In myUserForm.Controls
If objectified.Name = sName Then
Set ControlByName = objectified
Exit Function
End If
Next objectified
End Function
这很好,几乎,但是在每次时间myUserForm 上的相同四个控件上都会失败。
失败“模式”是ControlByName()似乎成功返回,但第一次使用返回的控件(例如我的MsgBox)会出错:
"Run-time error '91': Object variable or With block variable not set".
我验证了定义的控件名称的拼写与我的_Click()例程中的名称匹配。数十个类似设计的CheckBox控件完美运行。它可能与CheckBox名称的长度或CheckBox名称中的“_”字符数有关吗? CheckBox名称中是否存在损坏的字符?你能想到让我尝试的其他事情吗?