2012-03-02 38 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