在VBA中,分包时什么会引发错误438?

问题描述 投票:0回答:1

假设我将这段代码附加到

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
...

vba userform
1个回答
0
投票

UserForm
基类没有属性
Tag

您的具体
SomeSpecificUserForm
可以,但通用
UserForm
则不能。
Name
也一样。

所以你必须将你的方法定义为

Public Sub swap_form_tag (ByVal frm As Object)

© www.soinside.com 2019 - 2024. All rights reserved.