C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: VBからWordを呼び出した時の問題について


(過去ログ 113 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■67041 / inTopicNo.1)  VBからWordを呼び出した時の問題について
  
□投稿者/ ワーワーワー (1回)-(2013/06/25(Tue) 16:08:48)

分類:[VB.NET/VB2005 以降] 

言語:VB 2008
環境:Windows 7・Word 2010

お世話に成ります。
今、VBでWordファイルを読み込み、Word上で加工して保存するようなプログラムを作っていますが、
プログラム実行前にWordファイルが開かれている場合、以下の条件で、元々開いていたWordファイルが
タスクバーから復帰できなくなり、このウィンドウを開くことができなくなります。

1.任意のWordファイルをWord 2010で開く
2.開いたWordのウィンドウを最小化(タスクバーに格納)する。
 (複数のWordファイルを開いている場合はすべて最小化する)
3.『特許ストーリー』で任意のWordファイルの読込を行う。
 →現象発生
  (開いたWordファイルの内、1つだけウィンドウを開くことができなくなる)

以下にソースサンプルを載せますが、何かコード上問題となる個所はございますでしょうか?
今回のケースでは元々Wordファイルを開いているので、GetObject(, "Word.Application")が行われます。
また、Wordでの処理時にWord画面がチラチラするのが嫌なので、oWord.Visible = False(非表示)としていますが、
Wordを非表示にしなければ今回の問題は発生しません。
なお、この現象が発生したのはWindows 7&Word 2010のPCでした。
Windows Vista&Word 2007では問題が発生しませんでしたが、Windows 7&Word 2007の組み合わせでは
この現象が発生するものとしないものがありました。
(そういう意味では、OSとWordのバージョンに依存するとは限らないかもしれません。)

Try
    Try
        oWord = GetObject(, "Word.Application")
    Catch ex As Exception
        oWord = CreateObject("Word.Application")
        IsNew = True
    End Try

    oWord.DisplayAlerts = False
    oWord.Visible = False

    oWordDocs = oWord.Documents
    oWordDoc = oWordDocs.Open(対象のWordファイル)

    '処理色々(以下略)

Finally
    If Not oWord Is Nothing Then
        '処理で使用したComオブジェクトを解放(以下略)

        If Not oWordDoc Is Nothing Then
            Try
                oWordDoc.Close(False)

            Catch ex As Exception
                '何もしない
            End Try
        End If

        oWord.DisplayAlerts = True
        If IsNew Then
            oWord.Quit()
        Else
            oWord.Visible = True
        End If
        MRComObject(oWordDoc)  'Marshal.FinalReleaseComObjectを呼んでいるメソッド(以下同様)
        MRComObject(oWordDocs)
        MRComObject(oWord)
    End If
End Try

以上、宜しくお願い申し上げます。

引用返信 編集キー/
■67042 / inTopicNo.2)  Re[1]: VBからWordを呼び出した時の問題について
□投稿者/ shu (342回)-(2013/06/25(Tue) 16:53:06)
No67041 (ワーワーワー さん) に返信

必ずCreateすれば良い気がしますが、
なぜGetするのでしょうか?
引用返信 編集キー/
■67046 / inTopicNo.3)  Re[2]: VBからWordを呼び出した時の問題について
□投稿者/ ワーワーワー (2回)-(2013/06/26(Wed) 10:31:07)
2013/06/26(Wed) 10:43:19 編集(投稿者)

No67042 (shu さん) に返信
> ■No67041 (ワーワーワー さん) に返信
>
> 必ずCreateすれば良い気がしますが、
> なぜGetするのでしょうか?

ありがとうございます。
実は、はじめはCreateObjectで対応していたのですが、他にWordファイルを開いている状態で
プログラム上でCreateObjectでの処理を行うと、

 このファイルは既に使用中のため保存できません
 (C:\Users\<ユーザー名>\AppData\...\Normal.dotm)

という警告メッセージの出るPCがあり(確か、Windows 7&Word 2007の組み合わせだったと思います)、
その対策として、すでにWordが開いている場合はGetObjectというようにすることで、問題を回避できました。

参考にしたページ
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200905/09050025.txt

また、プログラム内で編集したWordファイルをそのままWord画面に表示させる場合があり、
既存のWordプロセスに表示させた方がいいのかなと思い、新たにCreateObjectを行わずに
GetObjectで対応したというケースがあります。
(これについては、複数のWordプロセスが起動していても問題ないのであれば気にしなくてもいいのかも知れません。)

CreateObjectを使用した場合でもNormal.dotmの警告が出ない方法があれば、それも合わせてご教示頂けると助かります。

以上、宜しくお願い申し上げます。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -