2012-08-22 11 views
10

Ho installato Word 2007 e 2010. Devo aprire Word da Excel ma devo specificare quale versione devo aprire all'interno di VBA.Come aprire la versione specifica di Word 2007/2010 in Excel

Ho provato l'associazione tardiva

Dim wordApp2007 As Object 
Dim wordApp2010 As Object 

Set wordApp2007 = CreateObject("Word.Application.12") 
wordApp2007.Visible = True 
Set wordApp2010 = CreateObject("Word.Application.14") 
wordApp2010.Visible = True 

ma entrambi Word Open 2010

Ho anche provato l'associazione anticipata utilizzando

Dim wordApp As Word.Application 
Set wordApp2007 = New Word.Application 
wordApp2007.Visible = True 

e l'impostazione riferimenti all'oggetto Word 12.0 modello ma questo si apre ancora Word 2010 enter image description here

Se mi registro ogni versione di Word utilizzando

"C:\Program Files\Microsoft Office\Office12\WINWORD.EXE" /regserver

"C:\Program Files\Microsoft Office\Office14\WINWORD.EXE" /regserver

poi la versione registrata si apre ma poi non può aprire aprire la non-registrata.

Qualcuno può aiutarmi e mostrarmi come aprire una versione specifica di Word in Excel utilizzando VBA?

Grazie

Edit: il codice di esempio ....

Option Explicit 

Dim wordApp2007 As Word.Application 

Sub Word_InfoEarly() 
'early binding 
Set wordApp2007 = New Word.Application 
wordApp2007.Visible = True 

    'other Stuff 
    Stop 

    wordApp2007.Quit 
    Set wordApp2007 = Nothing 

End Sub 


Sub Word_InfoLate() 
Dim wordApp2007 As Object 
Dim wordApp2010 As Object 

    Set wordApp2007 = CreateObject("Word.Application.12") 
    wordApp2007.Visible = True 
    Set wordApp2010 = CreateObject("Word.Application.14") 
    wordApp2010.Visible = True 

    'other Stuff 
    Stop 

    wordApp2007.Quit 
    Set wordApp2007 = Nothing 
    wordApp2010.Quit 
    Set wordApp2010 = Nothing 

End Sub 
+0

Puoi pubblicare il codice che crea l'oggetto, quindi chiama la versione registrata di MS Word? – EastOfJupiter

+0

Ho modificato la mia domanda per mostrare sia la dichiarazione che l'assegnazione degli oggetti – user3357963

+0

Non ero chiaro. Mi chiedo, ma mi piacerebbe l'intera subroutine (s). È difficile vedere cosa potrebbe mancare o essere errato senza l'intero blocco. – EastOfJupiter

risposta

3

Questo è un lavoro intorno:

TaskID = Shell("C:\Program Files\Microsoft Office\Office12\WINWORD.EXE",vbHide) '2007 
'TaskID = Shell("C:\Program Files\Microsoft Office\Office14\WINWORD.EXE",vbHide) '2010 
GetObject(,"Word.Application") 

Si sarebbe anche bisogno di verificare se una versione precedente di parola è aperto, o usa qualcosa di diverso da un semplice GetObject per attivare la finestra, altrimenti non ci sono garanzie che otterrà la versione giusta.

L'altro modo sarebbe quello di passare il nome del documento nel comando Shell, e quindi GetObject potrebbe essere denominato con il nome del documento

+1

+1 Logicamente questa shell deve essere corretta nell'app, a meno che MS non abbia qualche convalida irritante in atto per avviare sempre la versione più recente –

+0

Utilizzo di Shell avvia Office processo di configurazione se la versione non è la versione registrata corrente. Quindi non riesce su GetObject poiché non è pronto per alcuni minuti. – user3357963

+0

@ooo - un po 'un hack, ma si potrebbe usare 'Application.Wait' per dire a VBA di uscire un po' mentre Shell fa il suo dovere. –

0

Questa è una soluzione VB.NET:

Sub Word_InfoLate() 
Dim wordApp2007 As New Object 
Dim wordApp2010 As New Object 

Questo è un po 'intimidatorio per alcuni, ma potrebbe esserci una modifica del registro che può risolvere questo problema. Non riesco a testare perché ho a disposizione una sola versione di MS Office, tuttavia, le versioni precedenti hanno ancora le chiavi di registro lasciate.

Ho trovato la versione 2007 di Word nel Registro di sistema e la posizione predefinita è C: \ Programmi \ Microsoft Office \ Office14 \ WINWORD.EXE "che indica che le versioni precedenti di Word sono registrate nel percorso di installazione della versione più recente come è nuovo di default

che cosa si potrebbe essere in grado di fare è navigare verso la posizione del registro

HKEY_CLASSES_ROOT\Word.Documet.12\shell\Open\Command 

cambiare la chiave (default) per leggere "C:. \ programmi \ Microsoft Office \ Office12 \ WINWORD.EXE"/ n '% 1'

In teoria ogni volta

Set wordApp2007 = CreateObject("Word.Application.12") 

viene invocato può sondare il Registro di sistema per la posizione del file eseguibile, e trovare il percorso corretto.

+0

'Dim wordApp2007 As New Object' non viene compilato. – user3357963

+0

rilasciare il 'Nuovo'. Usa 'Dim wordApp2007 As Object' – CaBieberach

+0

@CaBieberach - L'OP aveva già quella riga di codice, che non funziona. Ultimamente ho trascorso un po 'di tempo nello sviluppo di .NET, e ho notato che, in quanto bug percepito, non ero corretto. – EastOfJupiter

1

Questo potrebbe ulteriormente spiegare il motivo per cui il codice funziona alcune volte e non altri.

la mia osservazione sulla situazione del comando

'Set wordAppxxxx = CreateObject("Word.Application.xx")' 

funziona o meno sul tuo computer è che è una funzione dell'ultimo aggiornamento che ottieni da Microsoft.

perché credo che questo:

Ho un'applicazione che converte un file di testo in un documento di Word per la compatibilità con alcune applicazioni legacy. Il piano migliore include l'utilizzo di una versione di Word simile alla versione con cui le app precedenti sono state progettate con /. Di conseguenza, ho cercato su come richiamare una versione legacy di Word rispetto all'offerta predefinita sul mio computer che è Word 2010.

La soluzione indicata in questa catena di discussione ha fornito la risposta alla mia domanda. (Grazie Stack collaboratori di overflow!) Ho voluto usare Word XP, così ho guardato le mie directory e osservai che Word XP (aka Word 2002) è un membro di Office 10, così ho creato il comando

'Set wordApp2002 = CreateObject("Word.Application.10")' 

e il mio programma ha lanciato Word 2002 e il mondo era un posto felice.

Nel corso del fine settimana qui, ho avuto un aggiornamento al mio computer. Controllo gli aggiornamenti tramite un'app che mi consente di controllare quando si verificano gli aggiornamenti in modo da poter osservare le modifiche alla mia configurazione. Questa mattina (30/09/13) ho acceso un computer con un aggiornamento di Word. Non lo sapevo fino a dopo aver effettuato una sola esecuzione della mia app dalla scorsa settimana. L'app è stata eseguita correttamente e invocato Word 2002 come previsto.

Ma poi ho ricevuto la pagina banner che mi informava di un aggiornamento di Word 2010 che si stava installando.

In seguito, ho eseguito l'applicazione che ha funzionato così bene per me la scorsa settimana e una volta oggi. Ora, dopo l'aggiornamento di Word (subito dopo!), Lo stesso codice ora avvia Word 2010 nonostante il fatto che la riga di comando che richiama Word 2002 non sia stata modificata.

Ciò sembra una prova evidente che un aggiornamento Microsoft ha ottimizzato le impostazioni che in precedenza consentivano al codice VB di funzionare come previsto. Questo potrebbe essere un buon elemento da portare all'attenzione di Microsoft, quindi vediamo se possiamo ottenere questo elemento stabilizzato nei successivi pacchetti di aggiornamento per consentire un comportamento coerente nelle versioni future.

Spero che questo è utile,

JeffK

0

ho avuto un problema simile, e ho pensato di dettaglio la mia esperienza per coloro che incappare in questo in futuro.

Nella mia situazione, avevo una macro Powerpoint che doveva aprire una finestra di dialogo file per consentire all'utente di selezionare alcuni file Excel e quindi creare tabelle dai dati; Non ho avuto problemi fino a quando non ho installato Excel 2003. Ora Powerpoint apriva una finestra di dialogo dei file di Excel 2003, che avrebbe sollevato errori durante il tentativo di selezionare un file * .xlsx.Non importa se ho usato Excel.Application.10 o Excel.Application.14 nel mio codice per creare l'oggetto Excel, era sempre una finestra di dialogo dei file di Excel 2003.

Ho notato in Explorer che i file * .xlsx erano impostati per essere aperti in Excel 2010 e che i file * .xls erano impostati per essere aperti in Excel 2003. Ho provato il solito modo di ripristinare i file * .xls da aprire in 2010 senza successo. Ho finito per dover eliminare la chiave di registro e riparare Office 2010. Ora che tutti i file Excel si aprono nel 2010, il mio problema è stato risolto.

So che il mio problema era un po 'diverso dal tuo, ma penso che la mia esperienza potrebbe aiutare a portare a una soluzione. Penso che ogni soluzione finirà per basarsi su alcune modifiche del registro.

0

Ho sprecato mezza giornata e voglio aiutare a evitare che altri facciano lo stesso! Sono in esecuzione Windows 7 e Office 2013 e 2010 sullo stesso laptop. Volevo ottenere Access VBA per aprire una vecchia versione di Word, poiché le chiamate di Word 2013 vengono stampate con bordi neri spessi.

aver provato un sacco di varianti, ecco il mio codice che ha funzionato:

Sub GetWordReference() 

'finally got Access to open old version of Word 

'open Word 2010 
Shell "C:\Program Files (x86)\Office 2010\Office14\winword.exe" 

'open Word 2013 
'Shell "C:\Program Files\Microsoft Office 15\root\office15\winword.exe" 

TryAgain: 

    On Error GoTo NoWord 
    Set word2010 = GetObject(, "Word.Application") 
    On Error GoTo 0 

    word2010.Visible = True 

    'word2010.Documents.Add 
    'word2010.Selection.TypeText "This is Word " & word2010.Version 

    Exit Sub 

NoWord: 
    Resume TryAgain 

End Sub 

non riesco a ottenere l'editor di codice SO per mostrare correttamente questo, ma copia e incolla dovrebbe funzionare.