在用户表单中调用 Sub
Call a Sub Within a User Form
我有一个非常直截了当的问题,我似乎无法得到明确的答案,所以在这里问。
我有一个有效的用户表单。在那个表格中有一个功能。命令按钮的代码工作正常并且调用该函数也很好。我也可以从其他模块调用 subs 就好了。
我似乎无法做的是调用也在表单中的子。正如我所说,只要以 'me'.
开头,函数就可以正常工作
但这对潜艇不起作用。我曾尝试将 subs 设为私有,public,也尝试了 Form 和 Frm。如果我 运行 它作为 'me' 我得到一个自动化错误,注意到被调用者连接失败。如果我 运行 它作为 'Form' 我收到一条错误消息,指出该对象是必需的。
所以我的问题是...您可以调用存储在同一表单中的子项吗?我想是的,因为功能有效,但事实并非如此。
我希望它们出现在表格中的原因是,当我向用户推出它时,我不必也推出其他 10 个 sub。如果我能以相同的形式存储它们,那将会很有帮助。
谢谢
这是我正在谈论的代码的一部分。 Profile1 是我要调用的子程序,如您所见,它位于同一表单中。如前所述,它可以毫无问题地调用 GetBoiler 函数。包括对 Profile2 的调用只是为了演示我尝试过的 Form 选项。
Private Sub CommandButton1_Click()
findStr = Me.ComboBox1.Value
Unload Me
If findStr = "Vendor1" Then Me.Profile1
If findStr = "Vendor2" Then Form.Profile2
If findStr = 'Vendor3" Then Me.GetBoiler (SigString)
End Sub
Function GetBoiler(ByVal sFile As String) As String
Dim fso As Object
Dim ts As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
GetBoiler = ts.ReadAll
ts.Close
End Function
Private Sub Profile1()
Select Case Application.ActiveWindow.Class
Case olInspector
Set oMail = ActiveInspector.CurrentItem
Case olExplorer
Set oMail = ActiveExplorer.Selection.Item(1)
End Select
SigString = Environ("appdata") & _
"\Microsoft\Signatures\Profile1.htm"
Me
限定符指的是您所在的 class 的当前实例(是的,表单是 class),并为您提供 public 个对象的成员。
Profile1
是 Private
,因此该成员不在对象的 public 接口上,因此不会作为 Me
的成员出现在 IntelliSense 中。
只是...不要限定它:
If findStr = "Vendor1" Then Profile1
If findStr = "Vendor2" Then Profile2
GetBoiler
函数隐式 Public
,Me
限定符有效:
If findStr = "Vendor3" Then Me.GetBoiler (SigString)
除此之外,您有一个 函数 ,并且您将其用作 过程 ,即您正在丢弃它的 return 值。调用这样的函数时,需要去掉括号:
If findStr = "Vendor3" Then GetBoiler SigString
括号否则会强制对参数表达式求值,并传递结果 ByVal
,而不管函数的签名是什么 - 这里它说的是 ByVal
无论如何,所以括号完全是多余的.
当您不丢弃函数的return值时,您确实需要括号:
MsgBox "Message", vbOkOnly
result = MsgBox("Message", vbOkCancel)
在程序中间看到 Unload Me
是相当可怕的。我建议阅读 this article 我刚才写的 - 它有点高级,但非常值得理解。
我有一个非常直截了当的问题,我似乎无法得到明确的答案,所以在这里问。
我有一个有效的用户表单。在那个表格中有一个功能。命令按钮的代码工作正常并且调用该函数也很好。我也可以从其他模块调用 subs 就好了。
我似乎无法做的是调用也在表单中的子。正如我所说,只要以 'me'.
开头,函数就可以正常工作但这对潜艇不起作用。我曾尝试将 subs 设为私有,public,也尝试了 Form 和 Frm。如果我 运行 它作为 'me' 我得到一个自动化错误,注意到被调用者连接失败。如果我 运行 它作为 'Form' 我收到一条错误消息,指出该对象是必需的。
所以我的问题是...您可以调用存储在同一表单中的子项吗?我想是的,因为功能有效,但事实并非如此。
我希望它们出现在表格中的原因是,当我向用户推出它时,我不必也推出其他 10 个 sub。如果我能以相同的形式存储它们,那将会很有帮助。
谢谢
这是我正在谈论的代码的一部分。 Profile1 是我要调用的子程序,如您所见,它位于同一表单中。如前所述,它可以毫无问题地调用 GetBoiler 函数。包括对 Profile2 的调用只是为了演示我尝试过的 Form 选项。
Private Sub CommandButton1_Click()
findStr = Me.ComboBox1.Value
Unload Me
If findStr = "Vendor1" Then Me.Profile1
If findStr = "Vendor2" Then Form.Profile2
If findStr = 'Vendor3" Then Me.GetBoiler (SigString)
End Sub
Function GetBoiler(ByVal sFile As String) As String
Dim fso As Object
Dim ts As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
GetBoiler = ts.ReadAll
ts.Close
End Function
Private Sub Profile1()
Select Case Application.ActiveWindow.Class
Case olInspector
Set oMail = ActiveInspector.CurrentItem
Case olExplorer
Set oMail = ActiveExplorer.Selection.Item(1)
End Select
SigString = Environ("appdata") & _
"\Microsoft\Signatures\Profile1.htm"
Me
限定符指的是您所在的 class 的当前实例(是的,表单是 class),并为您提供 public 个对象的成员。
Profile1
是 Private
,因此该成员不在对象的 public 接口上,因此不会作为 Me
的成员出现在 IntelliSense 中。
只是...不要限定它:
If findStr = "Vendor1" Then Profile1
If findStr = "Vendor2" Then Profile2
GetBoiler
函数隐式 Public
,Me
限定符有效:
If findStr = "Vendor3" Then Me.GetBoiler (SigString)
除此之外,您有一个 函数 ,并且您将其用作 过程 ,即您正在丢弃它的 return 值。调用这样的函数时,需要去掉括号:
If findStr = "Vendor3" Then GetBoiler SigString
括号否则会强制对参数表达式求值,并传递结果 ByVal
,而不管函数的签名是什么 - 这里它说的是 ByVal
无论如何,所以括号完全是多余的.
当您不丢弃函数的return值时,您确实需要括号:
MsgBox "Message", vbOkOnly
result = MsgBox("Message", vbOkCancel)
在程序中间看到 Unload Me
是相当可怕的。我建议阅读 this article 我刚才写的 - 它有点高级,但非常值得理解。