- ベストアンサー
Excel VBAを利用したテンプレートワードファイルの一部分の置換と保存処理の問題
- Excel VBAを利用して、テンプレートとなるワードファイルの一部分をエクセルデータで置換し、新しいワードファイルとして保存する処理を作成しています。しかし、最後の閉じる処理の際に「wordは、動作を停止しました」というエラーメッセージが頻繁に出てしまいます。処理自体に問題がある可能性があります。初心者なので、他に良い方法があれば教えてください。
- Excel VBAを使って、テンプレートワードファイルの一部分をエクセルデータで置換し新しいワードファイルとして保存する処理を作成しました。しかし、閉じる処理の際に「wordは動作を停止しました」というエラーメッセージが頻繁に出てしまいます。ファイル自体は正常に読み込めるので、処理に問題がある可能性があります。初心者なので、改善策があれば教えてください。
- Excel VBAを使って、テンプレートワードファイルの一部分をエクセルデータで置換し新しいワードファイルとして保存する処理を作成しました。しかし、最後の閉じる処理を行う際に「wordは、動作を停止しました」というエラーメッセージが頻繁に表示されます。処理自体に問題があるのか、他の方法で実現できるのか、初心者なのでわかりません。助言をいただけると幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
その元のコードは、癖になりますから、エラーが発生するとかいう以前に直した方がよいですね。時々、非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
その他の回答 (1)
- mimeu
- ベストアンサー率49% (39/79)
お役に立てるかどうかわかりませんが、ご質問で気がついた点を二つ。 (1) > 「wordは、動作を停止しました」というエラーメッセージが頻繁に出てしまいます。 とのことですが > word.Quit と Word を止めているからで、これは Loop 文の後に記述するべきです。 (2) Excel のC列に新しく保存する文書の名前が入っているから Excel VBA になさったのでしょうが、Word文書が対象ですから、Word VBA の方も トライなさることをおすすめします。世界が広がりますよ。
お礼
早速の回答ありがとうござました。 他の方の作成したVBAを修正していけるかと思って安易に考えていた部分があり、 VBAの奥深さを痛感いたしました。 きちんと学ばなければなりませんね^^; word.Quitの件、アドバイスいただいた通り(先のWendy02さんのアドバイスも含めて) 修正しましたところエラーの頻発はなくなりました。 この度は、アドバイス頂きありがとうございました。 無事解決することができました。
お礼
修正ソースまで提示いただきありがとうございます。 VBAの例外処理など全く知らずに修正していた自分がちょっと怖くなりました@@; 知らない部分が多すぎて、前提が前提ではなくなっていました。 回答いただいたソースを元に修正をかけたところ 無事動作させることができました。 この度はご協力いただき、ありがとうございました。 VBAの奥深さも痛感いたしました・・。反省です。