让MS Office UserForm检测哪个子例程调用它

时间:2013-06-17 15:00:14

标签: vba excel-vba userform excel

在我的VBA项目中,我将/将使用一系列相当复杂的用户表单,其中许多用户表单在视觉上相同但附加到按钮的子程序不同。因此,我并不过分热衷于多次复制它们以便从相同的布局中获得不同的功能。是否有可能让用户形式检测哪个子程序调用它并在流量控制中使用它?我希望能够做到这样的事情:

Private Sub UserForm_Initialize()
    If [the sub that called the userform is called "foo"] then
        Call fooSub
    else
        Call barSub
    End If
End Sub

我的备份计划是让调用子例程设置一个全局变量标志,并让userform检查一下,但这似乎是一个相当粗糙和笨拙的解决方案。

谢谢大家,
路易斯

3 个答案:

答案 0 :(得分:1)

您可以使用表单的tag属性。加载表单,设置属性,然后显示表单:

Sub PassCallerToForm()
    Load UserForm1
    UserForm1.Tag = "foo"
    UserForm1.Show
End Sub

现在设置了属性,您可以确定在表单中执行的操作:

Private Sub UserForm_Activate()
    If Me.Tag = "foo" Then
        Call fooSub
    Else
        Call barSub
    End If
End Sub

答案 1 :(得分:1)

您还可以使用公共变量:

' in userform

Public Caller As String

Private Sub UserForm_Click()
    MsgBox Caller
    Caller = Now()
    Me.Hide
End Sub

' in caller
Sub callUF()
    Dim frm As New UserForm1
    frm.Caller = "Test Caller"
    frm.Show
    MsgBox frm.Caller ' valid after Me.Hide
    Set frm = Nothing
End Sub

答案 2 :(得分:1)

就个人而言,我不会有一个用户表单执行两个不同的活动。我想,代码很难快速阅读。复制用户表单的布局非常简单。

复制用户表单:打开空白工作簿。在Project Explorer中,将userform拖到新工作簿中。重命名新工作簿中的用户窗体。现在将其拖回原始工作簿。更改用户表单副本中的代码。

如果您绝对不想要单独的用户表单,我建议您设置userform的属性。 Userforms只是类,除了它们有一个用户界面组件。在userform模块中

Private mbIsFoo As Boolean

Public Property Let IsFoo(ByVal bIsFoo As Boolean): mbIsFoo = bIsFoo: End Property
Public Property Get IsFoo() As Boolean: IsFoo = mbIsFoo: End Property

Public Sub Initialize()

    If Me.IsFoo Then
        FooSub
    Else
        BarSub
    End If

End Sub

我总是写自己的Initialize程序。在标准模块中:

Sub OpenForm()

    Dim ufFooBar As UFooBar

    Set ufFooBar = New UFooBar

    ufFooBar.IsFoo = True
    ufFooBar.Initialize

    ufFooBar.Show

End Sub