Vba 调用用户窗体中的子窗体

Vba 调用用户窗体中的子窗体,vba,userform,Vba,Userform,我有一个非常直截了当的问题,我似乎无法得到一个明确的答案,所以在这里提问 我有一个有效的用户表单。在这种形式中有一种功能。命令按钮的代码工作正常,调用函数也很正常。我也可以从其他模块调用sub 我似乎不能做的是调用一个也在表单中的sub。正如我所说,只要以“我”开头,函数就可以正常工作 但这对潜艇不起作用。我已经试着让潜艇私有化,公开化,试过的形式和Frm。如果我以“我”的身份运行它,我会得到一个自动化错误,注意到被叫方连接失败。如果我以“Form”的形式运行它,我会得到一个错误,表示该对象是必

我有一个非常直截了当的问题,我似乎无法得到一个明确的答案,所以在这里提问

我有一个有效的用户表单。在这种形式中有一种功能。命令按钮的代码工作正常,调用函数也很正常。我也可以从其他模块调用sub

我似乎不能做的是调用一个也在表单中的sub。正如我所说,只要以“我”开头,函数就可以正常工作

但这对潜艇不起作用。我已经试着让潜艇私有化,公开化,试过的形式和Frm。如果我以“我”的身份运行它,我会得到一个自动化错误,注意到被叫方连接失败。如果我以“Form”的形式运行它,我会得到一个错误,表示该对象是必需的

所以我的问题是…你能调用存储在同一表单中的sub吗?考虑到函数可以工作,我想是的,但事实似乎并非如此

我希望它们出现在表单中的原因是,当我向用户推出它时,我不必同时推出10个其他Sub。如果我能以相同的形式存储它们,那将很有帮助

谢谢

这是我正在谈论的代码的一部分。Profile1是我试图调用的sub,您可以看到它位于同一表单中。如前所述,它调用GetBoiler函数时不会出现问题。包括对Profile2的调用,只是为了演示我尝试的表单选项

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
限定符引用您所在类的当前实例(是的,表单就是类),并为您提供该对象的公共成员

Profile1
Private
,因此成员不在对象的公共接口上,因此不会在IntelliSense中显示为
Me
的成员

只是。。。不要限定它:

If findStr = "Vendor1" Then Profile1
If findStr = "Vendor2" Then Profile2
GetBoiler
函数隐式地
Public
Me
限定符工作:

If findStr = "Vendor3" Then Me.GetBoiler (SigString)
除此之外,您有一个函数,并且您将其用作一个过程,即您将丢弃其返回值。调用这样的函数时,需要去掉括号:

If findStr = "Vendor3" Then GetBoiler SigString
否则,括号将强制对参数表达式求值,并传递结果
ByVal
,而不管函数的签名是什么-这里它说的是
ByVal
,因此括号完全是多余的

如果不放弃函数的返回值,则确实需要括号:

MsgBox "Message", vbOkOnly
result = MsgBox("Message", vbOkCancel)


<>在程序中间看到<代码>卸载我\代码>是相当可怕的。我建议您阅读我不久前写的文章-这有点高级,但非常值得理解。

限定符指的是您所在类的当前实例(是的,表单就是一个类),并为您提供该对象的公共成员

Profile1
Private
,因此成员不在对象的公共接口上,因此不会在IntelliSense中显示为
Me
的成员

只是。。。不要限定它:

If findStr = "Vendor1" Then Profile1
If findStr = "Vendor2" Then Profile2
GetBoiler
函数隐式地
Public
Me
限定符工作:

If findStr = "Vendor3" Then Me.GetBoiler (SigString)
除此之外,您有一个函数,并且您将其用作一个过程,即您将丢弃其返回值。调用这样的函数时,需要去掉括号:

If findStr = "Vendor3" Then GetBoiler SigString
否则,括号将强制对参数表达式求值,并传递结果
ByVal
,而不管函数的签名是什么-这里它说的是
ByVal
,因此括号完全是多余的

如果不放弃函数的返回值,则确实需要括号:

MsgBox "Message", vbOkOnly
result = MsgBox("Message", vbOkCancel)


<>在程序中间看到<代码>卸载我\代码>是相当可怕的。我建议您阅读我不久前写的文章——这有点高级,但非常值得理解。

如果findStr=“Vendor2”那么Profile2
另外,
如果findStr=“Vendor3”,那么请致电我。GetBoiler(SigString)
或者
如果findStr=“Vendor3”那么Me.GetBoiler SigString
。它与在其他地方调用任何其他过程有什么不同?在程序的中间,BTW <代码>卸载Me/<代码>,看起来非常非常错误。@ MathieuGuindon,我在那里卸载以关闭窗口。这实际上是用于Outlook,而不是Excel。因此,如果我不这样做,b/c Outlook会看到一个对话框打开,那么一切都会停止。至于你的另一个问题,我也是这么想的,但出于某种原因,如果我不这样做,函数就不会调用。也许Outlook属性与Excel有些不同?不太确定,这就是为什么我对它如此失望的原因。我通常在头撞到墙上几天后才发帖@TimWilliams,谢谢,这正是我一开始尝试的,但失败了。如果您单步执行,它实际上会确认If值,转到Profile2,然后转到代码中的下一行。它似乎跳过了它,或者没有认识到它是一个sub。这是在outlookvba中,尽管如此,也许这就是它所做的。真让人恼火。为什么它不执行VBA在Excel和Access中依赖的基本功能(调用其他过程)。
如果findStr=“Vendor2”那么Profile2
同样,
如果findStr=“Vendor3”那么调用Me.GetBoiler(SigString)
或者
如果findStr=“Vendor3”那么Me.GetBoiler SigString
。它与在其他地方调用任何其他过程有什么不同?在程序的中间,BTW <代码>卸载Me/<代码>,看起来非常非常错误。@ MathieuGuindon,我在那里卸载以关闭窗口。这实际上是用于Outlook,而不是Excel。因此,如果我不这样做,b/c Outlook会看到一个对话框打开,那么一切都会停止。至于你的另一个问题,我也是这么想的,但出于某种原因,如果我不这样做,函数就不会调用。也许是