2016-01-25 75 views
9

Sto cercando di automatizzare la generazione di report in cui Excel VBA sta facendo tutto il lavoro. Il mio datore di lavoro ha una serie standardizzata di modelli di cui tutti i documenti dovrebbero essere generati. Devo compilare uno di questi modelli da VBA di Excel. I modelli di Word utilizzano estesamente VBA.Come accedere a una variabile pubblica di Word in Excel VBA

Si tratta di (alcune) il mio codice VBA di Excel:

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 

Nel modulo VBA di Word Autoexec, una variabile pubblica di nome user è definito e dichiarato. Il modulo Userinfo secondario dal modulo Utilities popola user. Entrambe queste routine vengono eseguite senza alcun reclamo da VBA. Vorrei poi essere in grado di accedere alla variabile user nel mio Excel VBA, ma ottengo il seguente errore

Compile Error: Variable not yet created in this context.

Come posso accedere alla variabile Word VBA in Excel VBA? Pensavo che fosse più o meno lo stesso?

MODIFICA: la variabile user è un utente definito Type con solo attributi String. Copiare le funzioni di Word VBA che popolano la variabile user è assolutamente fattibile, solo più lavoro di quanto mi era necessario ...

+0

Trasforma 'UserInfo' in una funzione e dargli un valore di ritorno che può essere assegnato a una variabile in Excel –

+0

@MacroMan' UserInfo' è incorporato nei modelli e non è qualcosa che sono in grado di manomettere ... – Holene

+0

È possibile creare la propria UDF per restituire la variabile –

risposta

4

In un modulo di Word:

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

In un modulo Excel:

myUser = WordApp.Run("GetUserVariable") 

In alternativa, si potrebbe essere in grado di replicare il valore delle variabili - come si dice user Sospetto che stia restituendo alcune informazioni su un utente , o autore, di un documento. In tal caso una delle seguenti potrebbe essere quello che stai dopo:

'// 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

Questo può essere fatto solo tramite Excel VBA? Qualcosa come Excel VBA aggiunge il modulo al documento Word, eseguendo e restituendo la variabile 'user'? – Holene

+1

a meno che non si abbia accesso al modello di oggetto VBProject protetto, che è disabilitato per impostazione predefinita per motivi di sicurezza. –

+0

Sospetto che questi modelli siano stati realizzati diversi anni fa, forse a metà del 2000. Come posso confermare che non funzionerà? – Holene

3

Un'altra opzione - se si poteva solo aggiungere una riga di codice al Utilities.UserInfo sub (dopo aver impostato la variabile pubblica):

ActiveDocument.Variables("var_user") = user 

Poi si potrebbe accedervi facilmente in seguito in 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 

Ciò presuppone che user è una stringa.

EDIT: Poiché è necessario lavorare solo su VBA di Excel, proverei sicuramente l'approccio suggerito da Scott e MacroMan, replicando la stessa funzionalità dei macro di Word in Excel, se possibile.

Presumo che hai già escluso la possibilità di utilizzare una copia modificata del modello originale, ambientato in una cartella pubblica ...

Per ragioni di completezza, c'è un'altra possibilità: in realtà è possibile iniettare codice VBA in un documento di Word senza VBProject Object Model, per "forza bruta". Se si rinomina un documento di Word come file .zip e lo si apre, si noterà un file \word\vbaProject.bin al suo interno. Questo file contiene il progetto VBA per il documento e, in linea di principio, si potrebbe aggiungere o modificare il codice VBA modificandolo o sostituendolo.

Ho eseguito alcuni test per il trapianto di codice da un documento all'altro semplicemente copiando il file vbaProject.bin e il concetto funziona. Se sei interessato a saperne di più su questo file, this topic potrebbe essere utile.

Si noti, tuttavia, che fare ciò che si desidera con una tale tecnica sarebbe alquanto complesso (comporterebbe, per i principianti, l'aggiornamento dei file zip dal VBA di Excel) e richiederebbe molta sperimentazione per mitigare il rischio di corrompere accidentalmente i tuoi file. Sicuramente non è raccomandato se stai cercando una soluzione facile e semplice - ma è possibile.

+0

Si noti che con questa tecnica, se il documento viene salvato, il valore della variabile di documento "var_user" viene salvato con esso e può essere successivamente aggiunto senza eseguire nuovamente le macro (di basta aprire il documento e controllare la sua collezione Document.Variables). – dnep

+0

Si noti inoltre che Word ha difficoltà a impostare DocVariables su un valore vuoto; dovresti usare una sequenza di caratteri speciale per indicarli se possono verificarsi. –

+0

Sarebbe assolutamente bello usare questo metodo, ma non posso toccare il VBA di Word. Il codice deve funzionare anche su altri computer e i modelli sono impostati per tutti gli utenti sul posto di lavoro ... – Holene