2012-03-02 35 views
2

我有一个DOTM模板很简单的字子:调用带有参数的字VBA子从Excel VBA

Sub YHelloThar(msg As String) 
    MsgBox (msg) 
End Sub 

然后我有一个Excel子:

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':对象不支持此属性或方法。”

我不知道我在做什么错 - 我查过的所有东西都表明这是从不同的应用程序中调用子接口的正确方法。

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

回答

5

久经考验

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

而且在结尾有一个额外的End If。我猜猜错了吗?

提示:为了避免运行时错误,你将不得不打电话只是

Set wdApp = GetObject(, "Word.Application") 

随访我的小费

的下面是一个例子之前,处理错误。此外,我还使用了Late Binding,以便它能够与每个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 
+0

太棒了。这工作完美。特别感谢关于错误检查和延迟绑定的额外评论。我一直有点避免延迟绑定,因为我对VBA很陌生,想看看有什么属性/方法(当所有东西都只是一个对象时,这显然不能很好地工作),但我可能应该尽快做出改变。 – 2012-03-02 20:38:48

+0

+1打好的例子 – brettdj 2012-03-03 00:28:08