2012-08-22 10 views
10

Word 2007と2010の両方をインストールしています。 Excel内からWordを開く必要がありますが、VBA内で開く必要があるバージョンを指定する必要があります。特定のバージョンのWord 2007/2010をExcelで開く方法

私は遅く、私も

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

とWord 12.0オブジェクトへの参照を設定することを利用して事前バインディング試してみた

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 

が、開いているWord 2010

の両方を結合しようとした

これはまだWord 2010を開きます。 enter image description here

私は

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

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

を使用してのWordの各バージョンを登録する場合、登録されたバージョンが表示されますが、その後、私は非登録開いて開くことができません。

誰でもVBAを使用してExcel内でWordの特定のバージョンを開く方法を教えていただけますか?

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

オブジェクトを作成するコードを投稿してから、MS Wordの登録バージョンを呼び出すことができますか? – EastOfJupiter

+0

私はオブジェクトの宣言と割り当ての両方を表示するために私の質問を編集しました – user3357963

+0

私は明確ではありませんでした。私は認めているが、サブルーチン全体が欲しい。ブロック全体がないと、何が欠落しているか正しくないかを確認するのは難しいです。 – EastOfJupiter

答えて

3

これは周りの作品です....例コード:

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") 

あなたはまた、単語の前のバージョンかどうかをテストする必要があるだろう

はあなたに

編集ありがとうございました開いているか、または基本的なGetObject以外のものを使用してウィンドウをアクティブにします。そうでなければ、正しいバージョンを取得する保証はありません。

他の方法は、Shellコマンドでドキュメント名を渡すことになり、その後、GetObjectは、ドキュメント名

+1

+1 MSは、常に新しいバージョンを起動するための刺激的な検証がない限り、正しいアプリケーションをシェルする必要があります –

+0

シェルを使用してOfficeを起動するバージョンが現在登録されているバージョンでない場合は、設定プロセス。 GetObjectは数分間準備ができていないので、失敗します。 – user3357963

+0

@ooo - ハックのビットですが、 'Application.Wait'を使って、シェルがそのことをやっている間にVBAにちょっとハングアップするよう指示することができます。 –

0

これはVB.NETのソリューションであると呼ばれることができます

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

はこれがあります少し怖い人もいますが、これを解決できるレジストリの編集があるかもしれません。 MS Officeのバージョンが1つしかないので、私はテストすることができませんが、以前のバージョンではレジストリキーが残っています。

2007年版のWordがレジストリに見つかりました。既定の場所はC:\ Program Files \ Microsoft \ Office \ Office14 \ WINWORD.EXEです。これは、古いバージョンのWordが最新のインストール場所に登録されていることを示します。 。それはあなたが行うことができるかもしれない

何新しい既定のレジストリの場所

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

変更「C読むこと(デフォルト)のキーに移動します:\プログラムファイル\のMicrosoft Office \ Office12に\ WINWORDを。EXE」/ N 『%1』理論的に

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

は、それが実行可能ファイルの場所のレジストリを調べる、そして正しいパスを見つけることが呼び出されるたび。

+0

「Dim wordApp2007 As New Object」はコンパイルされません。 – user3357963

+0

は 'New'を削除します。 'Dim wordApp2007 As Object'を使用してください。 – CaBieberach

+0

@CaBieberach - OPには既にそのコード行があり、これは動作しません。最近.NET開発のかなりの時間を費やしましたが、認識されたバグとして、私は間違っていました。 – EastOfJupiter

1

これはさらに説明することができますなぜコードは、いくつかの回ではなく、他に動作します。

コマンドの状況に関する私の観察

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

が動作しているかどうかは、Microsoftから入手した最新のアップデートの機能であることです。

私はこれを信じる理由:

私は一部のレガシーアプリケーションとの下位互換性のためにWord文書にテキストファイルを変換するアプリケーションを持っています。最高の計画には、従来のアプリケーションが/を使用して設計されたバージョンと同様のバージョンのWordを使用することが含まれます。その結果、Word 2010であるコンピュータの既定のオファリングとは対照的に、従来のバージョンのWordを呼び出す方法を検索しました。

このディスカッションチェーンに記載されている解決策は、私の質問に答えてくれました。 (あなたがオーバーフロー貢献をスタックありがとうございました!)私は、Word XPを使用していたので、私は私のディレクトリを見て、WordのXP(2002別名ワード)のOffice 10のメンバーであることを認められたので、私は、コマンドを作成し

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

私のプログラムはWord 2002を開始し、世界は幸せな場所でした。

週末、私は自分のコンピュータを更新しました。私は、私の設定の変更を観察できるように更新が発生したときに私を制御するアプリケーションを介して更新を制御します。今朝(9/30/13)私はWordのアップデートを持っているコンピュータを起動しました。私は先週から私のアプリの1つを実行した後まで、これを知らなかった。アプリケーションは正常に実行され、期待どおりWord 2002が呼び出されました。

しかし、バナーページには、自分自身をインストールしていたWord 2010アップデートがあることがわかりました。

その後、私は先週、そして今度は私のためにうまく働いたアプリを走らせました。今すぐWordの更新後(直後!)、Word 2002を呼び出すコマンドラインが変更されていないにもかかわらず、同じコードがWord 2010を起動するようになりました。

これは、Microsoftの更新プログラムによって、以前はVBコードが期待どおりに動作することを可能にした設定が変更されたことが示されています。これはMicrosoftの関心を引く良い項目かもしれないので、将来のリリースでの一貫性のある動作を可能にするために、このアイテムを後続の更新パッケージで安定させることができるかどうかを見てください。私はこれが役に立つことを願う

JeffK

0

私は同様の問題を持っていた、と私は詳細将来的にこの出くわすもののために私の経験を思いました。

私の状況では、ユーザーがいくつかのExcelファイルを選択してデータからテーブルを作成するためのファイルダイアログを開く予定のPowerpointマクロがありました。私は最近、Excel 2003をインストールするまでは問題ありませんでした。PowerpointはExcel 2003のファイルダイアログを開き、* .xlsxファイルを選択しようとするとエラーが発生しました。Excelオブジェクトを作成するためにExcel.Application.10またはExcel.Application.14をコード内に使用しても、それは問題ではなく、Excel 2003のファイルダイアログです。

* .xlsxファイルがExcel 2010で開くように設定されていて、* .xlsファイルがExcel 2003で開くように設定されていることがわかりました。* .xlsファイルを開くために通常の方法で試しました2010年は役に立たない。私はレジストリキーを削除してOffice 2010を修復する必要がありました。2010年にすべてのExcelファイルが開かれたので、私の問題は修正されました。

私の問題はあなたとは少し違っていたことは知っていますが、私の経験は解決につながると思います。私は、すべてのソリューションは、いくつかのレジストリ編集に依存することになると思います。

0

私はこれで半日を無駄にし、他の人が同じことをしないようにしたいと思っています!私はWindows 7とOffice 2013と2010を同じラップトップで実行しています。 Word 2013のコールアウトが太い黒色の枠線で印刷されているため、Access VBAで旧バージョンのWordを開くことを希望しました。私はこれを正しく表示するSOコードエディタを取得することはできませんが、コピー&ペーストが動作するはず

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 

はここに働いていた私のコードですが、バリエーションの多くを試してみました。