次の方法で共有

エクセルマクロでワードのファイル操作をするとNormal.dotに関するエラーメッセージが出ます

Anonymous
2010-04-15T02:51:42+00:00

ワードファイルのページ数をカウントするため、エクセルで以下のマクロを使ったのですが、プログラムの最後に「このファイルは他のアプリケーションまたはユーザーが使用しています」というメッセージが出て「OK」をクリックするとワードのNormal.dotの保存先を聞いてきます。

キャンセルをクリックするとワードが起ち上がった状態です(文書はなし)。

さらにワードを閉じようとすると「Normal.dot テンプレートが変更されているが反映させるか」というメッセージが出て、「いいえ」をクリックして閉じなければなりません。これで閉じた後はワードを開いて閉じても何も聞いてきません。

それでMyWD.Quitを外したところ、上記メッセージがなくマクロが終了するのですが、ワードファイルを起ち上げるとまた上記メッセージが出ます。

 これの回避方法がわかりません。どなたかご教示願えませんでしょうか

<実行マクロ>

Dim MyWD As Object

Dim MyDoc As Object

Dim mypath As String

Dim i As Integer

 Application.ScreenUpdating = False

   For i = 1 To Cells(Rows.Count, 19).End(xlUp).Row

       Cells(i + 2, 19).Select

       Selection.Copy

       Cells(i + 2, 21).Select

       Selection.PasteSpecial Paste:=xlPasteValues

       Excel.Application.CutCopyMode = False

       mypath = Cells(i + 2, 21).Value

       If MyWD Is Nothing Then

           Set MyWD = CreateObject("Word.Application")

       End If

       If (Trim(Cells(i + 2, 21).Value) <> "") Then

           Set MyDoc = MyWD.documents.Open(mypath)

               With MyDoc

                   .Repaginate

               End With

           Cells(i + 2, 22) = MyDoc.BuiltinDocumentProperties("Number of Pages")

           MyDoc.Close savechanges:=0

       End If

   Next i

   MyWD.Quit

   'オブジェクトの破棄

   Set MyDoc = Nothing

   Set MyWD = Nothing

 Application.ScreenUpdating = True

End Sub

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2010-04-16T10:32:15+00:00

良く分かりませんが・・・・

>On Error Resume Next 

は、VBAに異常が起きた場合、停止させずにエラーを無視して先へ進めということです。

ですから、保存しますか?というメッセージを出さないようにする機能はありません。

それから、

>Set MyWD = GetObject(, "Word.Application")

はWordが既に走っていた場合、そのインスタンスを使用してしまいます。

kyonchanさんのコードでは、最後にApplicationのQuitが入っていますから、このコードを走らせた時点で

Wordが走っていた、つまり全く関係ない文書が開かれていたとすると、そのWordインスタンスを使用し、

最後のQuitでそのWordを終了してしまうという不具合が出ます。

ですから、一般論で言えば元のコードの方が真っ当だと思います。

因みに私の提示したコードを実行するとどうなりますか?

Excelブックと同じフォルダにaaaと言う名前のWord文書を入れて置いて実行してみてください。

なお、問題がなさそうなので、コメントしなかったのですが、GetObjectが登場したので、少々申し上げておきます。

問題はCreateObjectの位置です。

今のコードは毎回Wordインスタンスが生成されているかどうか確認しておられますが、通常は次の構成が

普通だと思います。

Set MyWD = CreateObject("Word.Application")

For

  Set MyDoc = MyWD.documents.Open(mypath)

  <文書に対する処理>

Next

MyWD.Quit

Set MyWD = Nothingところで、あまり根拠のない話なんですが、元のコードで

Set MyWD = Nothing

をはずしたらどうなりますか?

ほとんど忘却の彼方でWordかExcelかも覚えていないのですが、Nothingが入っているとトラぶったと言う

トラブルに遭遇したことがありました。

この回答は役に立ちましたか?

0 件のコメント コメントはありません

7 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2010-04-17T05:19:04+00:00

    削除、リネームとも試してみましたが現象は変わりませんでした。

    ご指摘ありがとうございました。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2010-04-16T12:41:32+00:00

    それから、Normal.dotの削除ないしはリネームは試されていないのでしょうか?

    Wordでなにか挙動がおかしい場合、結構Normal.dotに傷がある場合は多いですよ。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. Anonymous
    2010-04-16T03:35:44+00:00

    ご回答ありがとうございました。

    Officeは2003です。

    マクロを実行させるためのシート構造は

    N列にディレクトリ1:C:\Documents and Settings\Administrator\デスクトップ\フォルダ1(\は¥マークです。以下同じ)

    O列にディレクトリ2:\フォルダ2

    P列にディレクトリ3:\フォルダ3

    Q列にディレクトリ4:\フォルダ4

    R列にファイル名:\aaa.doc

    S列にファイル名(式):=N列&O列&P列&Q列&R列

    です。

    また、自分でネットを検索して以下のように修正すると、ワードのエラーメッセージが消えました。

    mypath = Cells(i + 2, 21).Valueの後ろに

    On Error Resume Next 

    Set MyWD = GetObject(, "Word.Application")

    の2行を追加

    これで正解なのか自分では判断できないのですが、これで良いのでしょうか。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  4. Anonymous
    2010-04-15T12:04:17+00:00

    Officeのバージョンを明記してください。2003以前ト2007以降ですと対応が異なる場合が多々あります。

    本論ですが、簡単なサンプルで試してみましたが再現できません。

    Sub aaa()

    Set wd = CreateObject("word.application")

    wd.Visible = True

    Set wdoc = wd.documents.Open(ThisWorkbook.Path & "\aaa.doc")

    With wdoc

      .Repaginate

      MsgBox .BuiltinDocumentProperties("Number of Pages")

    End With

    wdoc.Close False

    wd.Quit

    End Sub

    山勘ですが、Normal.dotが壊れているのではないかと思います。

    一度Normal.dotをリネームして(拡張子を .dotaaa)試してみてください。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません