excel VBAを利用し、テンプレートとなるワードファイルの一部分をエクセルデータで
置換を行い、新しいワードファイルとして保存するという処理を作成しています。
[環境]
Windows Vista
Office 2007
差し込み文書ではなく個別にファイルを作りたいという条件があります。
処理としては、
テンプレートを開く→置換を実施→別名で保存→テンプレートを変更せず閉じる
を繰り返し実施しています。
ただ、このやり方ですと最後の閉じる処理を行った際に、
「wordは、動作を停止しました」というエラーメッセージが頻繁に出てしまいます。
出来上がったファイル自体は問題なく読めているんですが。
処理自体に問題があるんでしょうか?
VBA自体初心者であり、他に良い方法などありましたらご教示いただけたら助かります。
#処理内容はだいぶ簡略化しています。
Public Function output_word2()
Dim word As New word.Application
Dim document As word.document
Dim file_name As String
Dim output As String
Dim path As String
Dim row As Integer
Sheets(CALC_SHEET).Select 'データ取得用シート
path = Application.ActiveWorkbook.path
file_name = path & "\xxxxxx.doc" '元の文書
row = 3
Do
If Range("B" & row).Value = "" Then
Exit Do
End If
With word
.Documents.Open Filename:=file_name
Set document = .ActiveDocument
End With
word.Selection.Find.Text = "{置換対象文字}"
word.Selection.Find.Forward = True
word.Selection.Find.Replacement.Text = Range("C" & row).Value
word.Selection.Find.Execute , , , , , , , , , , wdReplaceAll
output = path & "\output\" & Range("C" & row).Value & ".doc"
document.SaveAs Filename:=output '置換後のword文書を別名で保存
document.Close SaveChanges:=False
word.Quit
row = row + 1
Set word = Nothing
Set document = Nothing
Loop
End Function
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
修正ソースまで提示いただきありがとうございます。
VBAの例外処理など全く知らずに修正していた自分がちょっと怖くなりました@@;
知らない部分が多すぎて、前提が前提ではなくなっていました。
回答いただいたソースを元に修正をかけたところ
無事動作させることができました。
この度はご協力いただき、ありがとうございました。
VBAの奥深さも痛感いたしました・・。反省です。
No.2
- 回答日時:
お役に立てるかどうかわかりませんが、ご質問で気がついた点を二つ。
(1)
> 「wordは、動作を停止しました」というエラーメッセージが頻繁に出てしまいます。
とのことですが
> word.Quit
と Word を止めているからで、これは Loop 文の後に記述するべきです。
(2)
Excel のC列に新しく保存する文書の名前が入っているから Excel VBA になさったのでしょうが、Word文書が対象ですから、Word VBA の方も
トライなさることをおすすめします。世界が広がりますよ。
早速の回答ありがとうござました。
他の方の作成したVBAを修正していけるかと思って安易に考えていた部分があり、
VBAの奥深さを痛感いたしました。
きちんと学ばなければなりませんね^^;
word.Quitの件、アドバイスいただいた通り(先のWendy02さんのアドバイスも含めて)
修正しましたところエラーの頻発はなくなりました。
この度は、アドバイス頂きありがとうございました。
無事解決することができました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Docuworksに代わるソフトを教え...
-
複数のWord文書の共通個所の書...
-
ワードで作った文書をブログ画...
-
複数のテキストボックスの一括...
-
提出受ける文書の「作成日時」...
-
ワードの表、別文書からコピペ...
-
略字を使ってはいけない場面。
-
Word文書から頻出語を求めるには?
-
Wordでページ指定し、メールで...
-
WORDで作成した文書を、編集・...
-
「リンク貼り付け」で、リンク...
-
Word文書内のWordデータの埋め...
-
「Docu Works」と「PDF」の違い...
-
FQAかFAQか?
-
pdfファイルが開いてもすぐ閉じ...
-
印刷プロパティの給紙は自動だ...
-
AcrobatでPDFにフリーハンドで...
-
Wordの差込印刷でNextRecordを...
-
excel VBAを利用し、テンプレー...
-
文字がグレーで表示される
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Docuworksに代わるソフトを教え...
-
Wordの差込印刷でNextRecordを...
-
「Docu Works」と「PDF」の違い...
-
ワードの表、別文書からコピペ...
-
Wordでページ指定し、メールで...
-
pdfファイルが開いてもすぐ閉じ...
-
WORDで作成した文書を、編集・...
-
文字がグレーで表示される
-
AcrobatでPDFにフリーハンドで...
-
複数のWord文書の共通個所の書...
-
印刷プロパティの給紙は自動だ...
-
提出受ける文書の「作成日時」...
-
ワードで作った文書をブログ画...
-
ワードで新旧対照表を作成
-
2つのワードファイルを1つにす...
-
「リンク貼り付け」で、リンク...
-
Wordのページ数が勝手に増えて...
-
ワード2010 A4で作成したファイ...
-
wordの保存するときの文書の種...
-
【Word2010】新規文書の「文書N...
おすすめ情報