Wordで複数ファイルの文字列を一括置換したいときはないでしょうか。
例えば複数のワードファイルに記載されている文章に一部修正したい文字列があり、一度にまとめて置換したい場合などです。
けど、そんな中で悩むことは、
・Word VBAで複数ファイルの文字列を一括置換したいが複雑でどう組めばよいかわからない
ですよね。
今回はそんなお悩みを解決する
複数ファイルの複数の文字列を一括置換する方法について
まとめます!
もくじ
Wordで複数ファイルの文字列を一括置換するイメージ
Wordで複数ファイルの文字列を一括置換するイメージについて説明をします。
置換したい文字列を含むワードファイルをいくつか作成します。
置換対象文字と置換後の文字が記載されたCSVファイルを用意します。
このファイルにより複数の置換パターンを設定することができます。
VBAで複数ファイルを開き置換する機能を追加します。
ワンクリックでVBAを実行すると、
複数ファイルに記載されている文字列が置換後の文字に置き換わります!
それでは早速使ってみましょう!
置換したい文字を含むサンプルのワードファイルを用意する
置換したい文字を含むサンプルのワードファイルを用意しましょう。
何ファイルでもよいですが、サンプルでは3ファイルにしています。
ファイル名は好きなものでOKです。
任意の場所へ保存しましょう。
置換前と置換後の文字を記載したCSVファイルを用意する
置換前と置換後の文字を記載したCSVファイルを用意しましょう。
カンマ区切りで手前に置換前の文字、隣に置換後の文字を記載します。
また、複数の置換パターンの設定ができますので、追加する場合は改行して同じくカンマ区切りで置換前、置換後の文字を記載します。
できたら任意の場所へ、拡張子「.csv」で任意の場所へ保存します。
Wordで複数ファイルの文字列を一括置換するVBA
Wordで複数ファイルの文字列を一括置換するVBAを準備します。
サンプルコードは以下の通りです。
Sub 複数ファイルの複数の文字列を置換()
Dim csvFilePass As String
Dim strBuf As String
Dim tmp As Variant
'対象ファイルの格納先パスを入力する配列を宣言します。ファイル数に応じて配列数を変更してください。
Dim arrTargetFilePass(2) As String
'対象ファイルを指定します。
arrTargetFilePass(0) = "C:\Users\takahiro\Documents\****\置換対象ファイル\置換対象ファイル1.docx"
arrTargetFilePass(1) = "C:\Users\takahiro\Documents\****\置換対象ファイル\置換対象ファイル2.docx"
arrTargetFilePass(2) = "C:\Users\takahiro\Documents\****\置換対象ファイル\置換対象ファイル3.docx"
'置換リストファイルを指定します。
csvFilePass = "C:\Users\takahiro\Documents\****\置換リスト.csv"
'対象ファイルの格納先パスを件数分取得します。
For Each targetFilePass In arrTargetFilePass
Set objTargetFile = Documents.Open(targetFilePass)
Open csvFilePass For Input As #1
'CSV内の行数分置換処理を繰り返します。
'置換処理
Do Until EOF(1)
'1行分のデータを読み込みます。
Line Input #1, strBuf
'文字列を","で分割します。
tmp = Split(strBuf, ",")
'検索・置換の設定をおこないます。
With Selection.Find
.ClearFormatting '検索条件から書式を削除します。
.Replacement.ClearFormatting '置換対象の書式を削除します。
.Text = tmp(0) '検索ワードを代入します。
.Replacement.Text = tmp(1) '置換ワードを代入します。
.Forward = True '文書に対して末尾の方向(順方向)に検索します。
.Wrap = wdFindContinue '先頭(または末尾)に戻って検索をします。
.Format = False 'フォーマット変更を有効する(True)、有効にしない(False)を設定します。
.MatchCase = True '英語の大文字と小文字の区別する(True)、区別しない(False)を設定します。
.MatchWholeWord = False '単語全体を検索対象としない設定にします。
.MatchByte = False '半角と全角を区別する(True)、区別しない(False)を設定します。
.MatchAllWordForms = False '英単語の異なる活用形検索を有効する(True)、有効にしない(False)を設定します。
.MatchWildcards = False 'ワイルドカード(?*など任意の文字)を使った検索を有効する(True)、有効にしない(False)を設定します。
.MatchSoundsLike = False '誤った置換を防止するため、英語のあいまいな検索はOFFにします。
.MatchFuzzy = False '誤った置換を防止するため、日本語のあいまいな検索はOFFにします。
End With
'置換を実行(全て置換)します。
Selection.Find.Execute Replace:=wdReplaceAll
Loop
Close #1
'置換対象ファイルを保存します。保存したくない場合はコメントアウトして無効化してください。
objTargetFile.Save
Next
MsgBox "置換が完了しました。"
Set objTargetFile = Nothing
End Sub
VBAの設定をする
Wordで複数ファイルの文字列を一括置換するVBAに設定をしていきましょう。
設定箇所は以下の通りです。
対象ファイルの格納先パスを入力する配列を宣言します。ファイル数に応じて配列数を変更してください。
サンプルではファイル数3つなので、3が入力する数字に該当するかと思いますが、配列は0番から数えますので2が入る形になります。
置換対象ファイルをフルパスで指定します。
arrTargetFilePass(1) = “C:\Users\takahiro\Documents\****\置換対象ファイル\置換対象ファイル2.docx”
arrTargetFilePass(2) = “C:\Users\takahiro\Documents\****\置換対象ファイル\置換対象ファイル3.docx”
置換リストファイルを指定します。
VBAを実装し実行する
VBAを実装し実行してみましょう。
実装方法は「VBAを実装する」をご覧ください。
実装できたらマクロから「複数ファイルの複数の文字列を置換」を見つけ実行します。
はい、複数の指定ファイルの文字列が置換されていますね!
保存しない設定をする
今回のVBAは置換後すぐに保存するようにしていますが、確認してから保存したい場合もあるかと思います。その場合は以下Saveメソッドをコメントアウトして無効化するか、削除をしてください。
VBAの説明
Wordで複数ファイルの文字列を一括置換するVBAについて説明をします。
対象ファイルの格納先パスを件数分取得します。
対象ファイルを開きオブジェクトにセットします。
置換前後の文字列が記載されているCSVファイルを開きます。
CSV内の行数分置換処理を繰り返します。
1行分のデータを読み込みます。
文字列を”,”で分割します。
検索・置換の設定をおこないます。
検索設定は以下の設定です。
検索ワードを代入します。
.Replacement.Text = tmp(1)
置換ワードを代入します。
検索条件は以下の設定です。
検索条件から書式を削除します。
.Replacement.ClearFormatting
置換対象の書式を削除します。
.Forward = True
文書に対して末尾の方向(順方向)に検索します。
.Wrap = wdFindContinue
先頭(または末尾)に戻って検索をします。
.Format = False
フォーマット変更を有効する(True)、有効にしない(False)を設定します。
.MatchCase = True
英語の大文字と小文字の区別する(True)、区別しない(False)を設定します。
.MatchWholeWord = False
単語全体を検索対象としない設定にします。
.MatchByte = False
半角と全角を区別する(True)、区別しない(False)を設定します。
.MatchAllWordForms = False
英単語の異なる活用形検索を有効する(True)、有効にしない(False)を設定します。
.MatchWildcards = False
ワイルドカード(?*など任意の文字)を使った検索を有効する(True)、有効にしない(False)を設定します。
.MatchSoundsLike = False
誤った置換を防止するため、英語のあいまいな検索はOFFにします。
.MatchFuzzy = False
誤った置換を防止するため、日本語のあいまいな検索はOFFにします。
置換を実行(全て置換)します。
置換対象ファイルを保存します。
VBAを実装する
実装手順は以下の通りです。
①Wordを新規に開き、「開発」タブをクリックし、
「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインの「Nomal」を右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のVBAを入力します。
こちらで完了です。
VBAを実行する
早速VBAの実行をしてみましょう。
①「開発」タブの「マクロ」をクリックし今回実装したマクロ明を選択し、「実行」をクリックします。
②「完了しました。」が表示されたら、処理結果を確認しましょう。
さいごに
いかがでしょうか。
今回は、
複数ファイルの複数の文字列を一括置換する方法について
まとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
はじめまして。
初心者の私のような者でも大変分かりやすいご説明大変感謝しております。
誠にありがとうございます。
こちらでご説明頂いている内容について、1つのファイルの処理(文字の置換)を完了後、処理が終わったファイルを閉じて、次のファイルの文字の置換処理をしたいと考えております。
上記の場合のコードをご教示頂けると幸いでございます。
いつもご利用ありがとうございます。
処理が終わったファイルを閉じて、次のファイルの文字の置換処理をする方法につきまして、
Closeメソッドを追加することにより実現できます。
コードを以下のように変更した上検証いただければと存じます。
■変更前
objTargetFile.Save
■変更後
objTargetFile.Save
objTargetFile.Close
テキストボックス等の文字は、参照の仕方が別になるのですね。。。
色々と勉強になりました。
ご丁寧にありがとうございました。
もう一度コードをコピペしたところ、上書き保存を行うことが出来ました。ありがとうございます。
文字が置換されない件に関しては、文字コード等は、Shift-JISだったので問題ありませんでした。
現在置換を行いたいWordの文書の内容が、テキストボックスを複数使用し、文字を入力しております。他のサイトで、テキストボックス内の文字は、シェイプオブジェクトを使用する旨を見つけたました。
置換できたのは、Wordにベタ打ちだったものだけでしたので、それが原因でしょうか?
できたようでよかったです。
また置換についてご認識通りです。
テキストボックスやシェイプなどオブジェクト内のテキストは拾えませんので、
別の方法にてお願いいたします。
早速のご対応ありがとうございます。
①の対応策のobjTargetFile.Saveが有効かどうかの判断
イミディエイトウィンドウでobjTargetFile?と入力したところコンパイルエラーとなりましたので、恐らく設定できていないと思います。
ファイルがセットされているかどうかは、
Dim arrTargetFilePass(10) As Stringであってるかどうか、ということでしょうか?
コンパイルエラーが発生している場合はどこかでコード(End If、End Withなど)が抜けて誤った構文になっているかもしれませんね。
一度コード内を確認いただけますでしょうか。
なお、Dim arrTargetFilePass(10) As Stringは単に配列を宣言しているだけなので問題はありませんが、
問題切り分けのためファイルは1~2個に絞って検証したほうがよいでしょう。
お世話になります。
①上記のVBAコードを拝借しマクロを実行したのですが、置換を行ったファイルが上書き保存されていませんでした。
②CSVにて変更前と変更後の項目を7個ほど入力していたのですが、最初の1つ以外は、置換が行われておりませんでした(全角、半角も考慮する様に、MatchByteはTrueにしております)。
上記2点の改善策を教えていただけますでしょうか。
よろしくお願いいたします。
いつもご利用ありがとうございます。
ご質問につきまして、以下にご回答いたします。
①置換を行ったファイルが上書き保存されない
objTargetFile.Saveが有効になっているか、またデバッグしobjTargetFileオブジェクトに処理対象のファイルがセットされているか確認をお願いいたします。
②CSV記載の変更前後文字列7個中1つしか置換されない
CSVファイル側の文字コードがShift-JISであるか確認をお願いします。
メモ帳であればフッターの右下部に記載があります。
UTF-8など別の文字コードであればShift-JISへ変更をお願いします。
変更する場合は別名保存>エンコード>ANSIを選択して保存ボタンを押してください。