在我的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检查一下,但这似乎是一个相当粗糙和笨拙的解决方案。
谢谢大家,
路易斯
答案 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