假设我将这段代码附加到
UserForm
:
Private Sub UserForm_Initialize()
Dim t As String
t = Me.Tag
Me.Tag = Me.Caption
Me.Caption = t
End Sub
效果很好。由于类似的操作将应用于其他
UserForm
,所以我尝试了分包。在另一个模块(不是UserForm
)中,我有:
Public Sub swap_form_tag(ByRef frm As UserForm)
Dim cap As String
cap = frm.Caption
frm.Caption = frm.Tag
frm.Tag = cap
End Sub
然后我将第一个事件处理程序更改为:
Private Sub UserForm_Initialize()
Call swap_form_tag(Me)
End Sub
单步执行,我将其变为
swap_form_tag
,但 frm.Caption
查找引发错误 438。发生了什么事?
如果我用以下方式扩展事件处理程序,我将添加:
Dim ctrl As Control
For Each ctrl In Me.Controls
Call swap_tag(ctrl)
Next ctrl
哪里
swap_tag
是:
Public Sub swap_tag(ByRef ctrl As Control)
If ctrl.Tag = "" Then Exit Sub
Dim t As String
t = ctrl.Tag
If TypeOf ctrl Is TextBox Then
ctrl.Tag = ctrl.Text
ctrl.Text = t
ElseIf TypeOf ctrl Is CommandButton Then
ctrl.Tag = ctrl.Caption
ctrl.Caption = t
End If
End Sub
然后
swap_tag
部分就可以正常工作了。这个问题似乎特定于UserForm
...
UserForm
基类没有属性Tag
。SomeSpecificUserForm
可以,但通用 UserForm
则不能。 Name
也一样。
所以你必须将你的方法定义为
Public Sub swap_form_tag (ByVal frm As Object)
。