2

在我的一个 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

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

谢谢大家,
路易斯

4

3 回答 3

1

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

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
于 2013-06-17T15:18:16.397 回答
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
于 2013-06-17T15:27:04.493 回答
1

就个人而言,我不会让一个用户窗体执行两项不同的活动。我认为,代码很快就会变得难以阅读。复制用户表单的布局非常简单。

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

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

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
于 2013-06-17T15:41:24.637 回答