• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:excel VBAを利用し、テンプレートとなるワードファイルの一部分を)

Excel VBAを利用したテンプレートワードファイルの一部分の置換と保存処理の問題

このQ&Aのポイント
  • Excel VBAを利用して、テンプレートとなるワードファイルの一部分をエクセルデータで置換し、新しいワードファイルとして保存する処理を作成しています。しかし、最後の閉じる処理の際に「wordは、動作を停止しました」というエラーメッセージが頻繁に出てしまいます。処理自体に問題がある可能性があります。初心者なので、他に良い方法があれば教えてください。
  • Excel VBAを使って、テンプレートワードファイルの一部分をエクセルデータで置換し新しいワードファイルとして保存する処理を作成しました。しかし、閉じる処理の際に「wordは動作を停止しました」というエラーメッセージが頻繁に出てしまいます。ファイル自体は正常に読み込めるので、処理に問題がある可能性があります。初心者なので、改善策があれば教えてください。
  • Excel VBAを使って、テンプレートワードファイルの一部分をエクセルデータで置換し新しいワードファイルとして保存する処理を作成しました。しかし、最後の閉じる処理を行う際に「wordは、動作を停止しました」というエラーメッセージが頻繁に表示されます。処理自体に問題があるのか、他の方法で実現できるのか、初心者なのでわかりません。助言をいただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

その元のコードは、癖になりますから、エラーが発生するとかいう以前に直した方がよいですね。時々、非VBAのプログラマの人にいますが、VBAは、ほとんど、予約語が存在しないので、変数名は、何でも付けられますが、それをそのまま使うと、他人からは、まったくコードを読めなくなってしまいます。エラーが発生しても原因がわかりにくくなります。 それから、ハングした後は、タスクマネージャーで、WinWord を削除しないと、エラーが繰り返すはずです。それで、メモリに残らないように、以下のように、エラーが発生したら、必ず、wdApp を外すようにします。 '//  Sub WordDocDupulicate()  Dim wdApp As Word.Application  Dim wdDoc As Word.Document  Dim wdRng As Word.Range  Dim Fname  As String  Dim sOutput As String    Dim mPath  As String  Dim mRow As Long  Dim sh As Worksheet  Set wdApp = New Word.Application    Const CALC_SHEET As String = "Sheet1" '←シート名  Set sh = Worksheets(CALC_SHEET) 'データ取得用シート  sh.Select    mPath = ActiveWorkbook.Path & "\"  Fname = mPath & "xxxxxx.doc"    sOutput = mPath & "\"  On Error GoTo ErrHandler  '元の文書  If Dir(Fname) = "" Then   MsgBox "元の文書がありません。", vbExclamation   GoTo ErrHandler  End If  mRow = 3  Do   With wdApp    Set wdDoc = .Documents.Open(Fname)    Set wdRng = wdDoc.Content   End With   With wdRng.Find    .Text = "[置換対象文字]"    .Forward = True    .Replacement.Text = Range("C" & mRow).Value    .MatchCase = False    .MatchWildcards = False    .MatchFuzzy = True    '.Execute Replace:=wdReplaceAll 'Ver Word2003    .Execute , , , , , , , , , , wdReplaceAll   End With   sOutput = mPath & "test1\" & Range("C" & mRow).Value & ".doc"   wdDoc.SaveAs sOutput '置換後のword文書を別名で保存   wdDoc.Close False   mRow = mRow + 1  Loop Until sh.Range("C" & mRow).Value = ""  wdApp.Quit ErrHandler:  If Err.Number > 0 Then   MsgBox Err.Number & " : " & Err.Description  Else   Beep '正常終了  End If  Set wdRng = Nothing  Set wdDoc = Nothing  Set wdApp = Nothing  Set sh = Nothing End Sub

nekomikekamo
質問者

お礼

修正ソースまで提示いただきありがとうございます。 VBAの例外処理など全く知らずに修正していた自分がちょっと怖くなりました@@; 知らない部分が多すぎて、前提が前提ではなくなっていました。 回答いただいたソースを元に修正をかけたところ 無事動作させることができました。 この度はご協力いただき、ありがとうございました。 VBAの奥深さも痛感いたしました・・。反省です。

その他の回答 (1)

  • mimeu
  • ベストアンサー率49% (39/79)
回答No.2

お役に立てるかどうかわかりませんが、ご質問で気がついた点を二つ。 (1) > 「wordは、動作を停止しました」というエラーメッセージが頻繁に出てしまいます。 とのことですが > word.Quit と Word を止めているからで、これは Loop 文の後に記述するべきです。 (2) Excel のC列に新しく保存する文書の名前が入っているから Excel VBA になさったのでしょうが、Word文書が対象ですから、Word VBA の方も トライなさることをおすすめします。世界が広がりますよ。

nekomikekamo
質問者

お礼

早速の回答ありがとうござました。 他の方の作成したVBAを修正していけるかと思って安易に考えていた部分があり、 VBAの奥深さを痛感いたしました。 きちんと学ばなければなりませんね^^; word.Quitの件、アドバイスいただいた通り(先のWendy02さんのアドバイスも含めて) 修正しましたところエラーの頻発はなくなりました。 この度は、アドバイス頂きありがとうございました。 無事解決することができました。

関連するQ&A