使用Excel VBA中的参数调用Word VBA Sub

使用Excel VBA中的参数调用Word VBA Sub,vba,parameters,excel,arguments,ms-word,Vba,Parameters,Excel,Arguments,Ms Word,我在dotm模板中有一个非常简单的Word sub: Sub YHelloThar(msg As String) MsgBox (msg) End Sub 然后我有一个Excel sub: Sub CallWordSub() Dim wdApp As Word.Application Dim newDoc As Word.Document 'Word template location strFile = "C:\

我在dotm模板中有一个非常简单的Word sub:

Sub YHelloThar(msg As String)
    MsgBox (msg)
End Sub
然后我有一个Excel sub:

Sub CallWordSub()
        Dim wdApp As Word.Application
        Dim newDoc As Word.Document

        'Word template location   
        strFile = "C:\Some\Folder\MyWordDoc.dotm"
        'Get or create Word application
        Set wdApp = GetObject(, "Word.Application")
        If wdApp Is Nothing Then
            Set wdApp = CreateObject("Word.Application")
        End If
        'Create new Word doc from template
        Set newDoc= wdApp.Documents.Add(strFile)
        'Call the YHelloThar sub from the word doc
        Call wdApp.Run(strFile & "!YHelloThar", "Hello")
    End If
End Sub
最后一行给出了“运行时错误'438”:对象不支持此属性或方法

我不确定我做错了什么-我查过的所有东西都表明这是从不同应用程序调用sub的正确方法


此外,如果我将最后一行更改为无参数调用,它会突然正常工作。

经过尝试和测试。

Call wdApp.Run("YHelloThar", "Hello")
如果结尾处有,则还有一个额外的
结尾。我猜是打字错误吧

提示:为了避免运行时错误,您必须在调用之前处理错误

Set wdApp = GetObject(, "Word.Application")
我的建议的后续行动

这里有一个例子。此外,我还使用了后期绑定,因此它将适用于每个Office版本

Sub Sample()
    Dim wdApp As Object, newDoc As Object
    Dim strFile As String

    strFile = "C:\Some\Folder\MyWordDoc.dotm"

    '~~> Establish an Word application object
    On Error Resume Next
    Set wdApp = GetObject(, "Word.Application")

    If Err.Number <> 0 Then
        Set wdApp = CreateObject("Word.Application")
    End If
    Err.Clear
    On Error GoTo 0

    wdApp.Visible = True

    Set newDoc = wdApp.Documents.Add(strFile)

    Call wdApp.Run("YHelloThar", "Hello")

    '
    '~~> Rest of the code
    '
End Sub
子样本()
Dim wdApp作为对象,newDoc作为对象
作为字符串的Dim strFile
strFile=“C:\Some\Folder\MyWordDoc.dotm”
“~~>建立Word应用程序对象
出错时继续下一步
Set wdApp=GetObject(,“Word.Application”)
如果错误号为0,则
Set wdApp=CreateObject(“Word.Application”)
如果结束
呃,明白了
错误转到0
wdApp.Visible=True
Set newDoc=wdApp.Documents.Add(strFile)
呼叫wdApp.Run(“YHelloThar”,“Hello”)
'
“~~>代码的其余部分
'
端接头

太棒了。这很有效。特别感谢关于错误检查和后期绑定的额外评论。我一直在避免后期绑定,因为我对VBA非常陌生,喜欢看看什么属性/方法(当一切都只是一个对象时,它显然不能很好地工作),但我可能应该尽快进行切换。附录:这也适用于不在活动文档中的子对象,但在通过Word的启动文件夹自动加载的.dotm模板中。