2016-01-25 47 views
9

我試圖自動化Excel VBA所做的所有工作。我的僱主擁有一套標準化的模板,其中所有文檔都應該由其生成。我需要從Excel VBA中填充這些模板之一。 Word模板廣泛使用VBA。如何在Excel VBA中訪問Word公共變量

這是(一些)我的Excel VBA代碼:

Sub GenerateReport() ' (Tables, InputDataObj) 
    ' code generating the WordApp object (works!) 

    WordApp.Documents.Add Template:="Brev.dot" 

    ' Getting user information from Utilities.Userinfo macro in Document 
    Call WordApp.Run("Autoexec") ' generating a public variable 
    Call WordApp.Run("Utilities.UserInfo") 
    ' more code 
End sub 

在Word中VBA Autoexec模塊,名爲user公共變量定義,並宣佈。來自Utilities模塊的Userinfo子組填充user。這兩個例程都是在沒有VBA投訴的情況下運行的。然後我想能夠訪問我的Excel VBA的user變量,但我得到以下錯誤

Compile Error: Variable not yet created in this context.

我如何訪問Word中VBA變量在Excel VBA?我認爲它或多或少都是一樣的?

編輯:user變量是用戶定義Type只有String屬性。複製是填充user變量的話VBA函數是絕對可行的,只是更多的工作比我雖然是必要的......

+0

將'UserInfo'轉換爲一個函數,並給它一個可以分配給Excel中變量的返回值 –

+0

@MacroMan'UserInfo'內置於模板中,不是我能夠篡改的東西... – Holene

+0

儘管您可以創建自己的UDF來返回變量 –

回答

4

在Word模塊:

Public Function GetUserVariable() As String '// or whatever data type 
    GetUserVariable = user 
End Function 

在一個Excel模塊:

myUser = WordApp.Run("GetUserVariable") 

或者,您可能能夠複製變量值 - 因爲它被稱爲user我懷疑它是返回有關用戶的一些信息,或作者,文件。在這種情況下,執行下列操作之一可能是你追求的:

'// Username assigned to the application 
MsgBox WordApp.UserName 

'// Username defined by the system 
MsgBox Environ$("USERNAME") 

'// Name of the author of the file specified 
MsgBox CreateObject("Shell.Application").Namespace("C:\Users\Documents").GetDetailsOf("MyDocument.doc", 9) 
+0

這可以通過Excel VBA來完成嗎?像Excel VBA一樣將模塊添加到Word文檔中,執行並返回'user'變量? – Holene

+1

除非您有權訪問受保護的VBProject對象模型 - 由於安全原因,默認情況下它是禁用的。 –

+0

我懷疑這些模板是幾年前製作的,也許是2000年中期。我如何確認它不起作用? – Holene

3

另一種選擇 - 如果你只能添加一行代碼到Utilities.UserInfo子(設置你的公共變量後):

ActiveDocument.Variables("var_user") = user 

然後,你可以很容易事後訪問它在Excel中:

Sub GenerateReport() ' (Tables, InputDataObj) 
    ' code generating the WordApp object (works!) 

    'I am assuming your WordApp object is public, as you don't declare it. 
    'Capture the new document object  
    Dim newdoc as Object 
    set newdoc = WordApp.Documents.Add(Template:="Brev.dot") 

    ' Getting user information from Utilities.Userinfo macro in Document 
    Call WordApp.Run("Autoexec") ' generating a public variable 
    Call WordApp.Run("Utilities.UserInfo") 

    'Get and show the value of "user" 
    Dim user as String 
    user = newdoc.Variables("var_user") 
    msgbox, user 
End Sub 

這是假設user是一個字符串。

編輯:因爲這是一個只需要在Excel VBA上工作的要求,所以我會定義嘗試由Scott和MacroMan建議的方法 - 在可能的情況下複製Excel中Word宏的相同功能。

我假設你已經排除了使用原來的模板編輯副本,在一個公共文件夾設置的可能性...

對於completness的緣故,還有另外一種可能:實際上它可能通過「蠻力」在沒有VBProject對象模型的Word文檔中注入VBA代碼。如果您將Word文檔重命名爲.zip文件並將其打開,您會注意到其中包含一個\word\vbaProject.bin文件。該文件包含文檔的VBA項目,原則上可以通過修改或替換VBA代碼來添加或更改VBA代碼。

我做了一些測試,通過簡單地複製vbaProject.bin文件將代碼從一個文檔移植到另一個文檔,並且該概念起作用。如果您有興趣瞭解更多關於此文件的信息,可以使用this topic

然而,請注意,使用這種技術來做你想做的事情會有點複雜(對於初學者來說,它會涉及從你的Excel VBA更新zip文件),並且需要大量實驗來減輕風險意外地破壞你的文件。如果你正在尋找一個簡單而簡單的解決方案,絕對不推薦 - 但它是可能的。

+0

請注意,使用這種技術,如果文檔被保存,文檔變量「var_user」的值將與它一起保存,並且可以在不重新運行宏的情況下進行處理只需打開文檔並檢查其Document.Variables集合)。 – dnep

+0

另請注意,Word很難將DocVariables設置爲空值;您必須使用特殊字符序列來指示它們是否可能發生。 –

+0

使用這種方法絕對是可愛的,但我無法觸及Word VBA。該代碼還需要在其他計算機上工作,並且爲所有用戶在工作時設置模板... – Holene