【Word VBA】複数の文字を一括・連続置換する方法

Wordで議事録報告書など文章作成をを行うことは多いかと思います。

そんなWordドキュメントをチェックするときに悩ませることは、

・作成する人によって用語表現のばらつきがあってチェックすることが大変
・ITサービスなどの名称の変更によりドキュメントの訂正が大変
・文字を置換する場合、一用語づつ繰り返さなければならないので面倒

ではないでしょうか。

特に中間管理職層やプロジェクトマネージャなど納品物や既存資産に責任を持つ方はこのチェック作業で苦労をしているかと思います。

今回はそんなお悩みを解決する、
Word VBAを使い、Wordドキュメント内の複数の用語を一括・連続置換して、きれいに用語を統一する方法
をご紹介します。

サンプルのWordドキュメントを準備する

今回の一括連続置換を行うWordドキュメントを用意します。

用語はなんでもよいのですが、サンプルでは最近名称が変わった「Microsoft365」を題材にしています。

文章は以下の通りです。

太字で強調表示しているところはすべて「Microsoft365」となりますので、これを「Microsoft365」に統一していきたいと思います。

 

サンプルの置換リストファイルを準備する

続いて置換したい用語を集めた置換リストファイルを準備します。

テキストエディッタで新規作成をします。

ファイル形式はCSVでカンマ「,」区切りで、

前を検索対象の用語、後ろを置換後の用語にしていきます。

サンプルでは置換後の用語を「Microsoft365」にしています。

完了したら適当なディレクトリに、拡張子を.csvにして保存します。

サンプルでは「置換リスト.csv」としています。

VBAを実装する

続いてWordのVisual Basic EditorVBAを実装します。

今回のVBAは置換リストであるCSVファイルを読み込み、そのリスト分置換処理を繰り返すというものになります。

実装にあたり、変更頂きたい箇所は以下です。

・置換リストファイルを指定する
置換リストを格納したパスに書き換えをお願いします。
csvFilePass = “C:\Users\****\Documents\****\置換リスト.csv

VBAソースコードは以下の通りです。

Sub 複数の文字列を置換()

Dim csvFilePass
Dim strBuf As String
Dim tmp As Variant

'置換リストファイルを指定します。
csvFilePass = "C:\Users\****\Documents\****\置換リスト.csv"


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

MsgBox "置換が完了しました。"

End Sub

実装手順は以下の通りです。

①Wordを新規に開き、「開発」タブをクリックし、

VisualBasic」をクリックします。

もしくはショートカットキー「Alt」+「F11」でもOKです。

②標準モジュールを追加します。
左ペインの「Nomal」を右クリックし、「挿入」、「標準モジュール」を選択します。

③右ペインのウインドウに上記のVBAを入力します。

こちらで完了です。

VBAを実行する

早速VBAの実行をしてみましょう。

①「開発」タブの「マクロ」をクリックし「複数の文字列を置換」を選択し、「実行」をクリックします。

②「置換が完了しました。」が表示されたら、
置換されていることを確認します。

変更前

変更後

はい!
置換されていますね!

置換する用語を加える

サンプルをよく見るとまだ不整合をおこしている用語がありますね。

「Exchange Online」も「EXO」も同じ意味なので、「Exchange Online」に統一したいと思います。

置換リストをテキストエディッタで開いて、
Exchange Online」の置換リストを追加します。

できたら保存をします。

同じようにVBAを実行してみましょう。

はい!

「EXO」が「Exchange Online」になり、統一されましたね!!

VBAの説明

置換リストCSVファイルを開きます。

Open csvFilePass For Input As #1

CSV内の行数分置換処理を繰り返します。

Do Until EOF(1)

1行分のデータを読み込みstrBufへ格納します。

Line Input #1, strBuf

文字列を”,”で分割し配列tmpへ格納します。

tmp = Split(strBuf, “,”)

検索時に指定した文字列から文字列および段落の書式を削除します。

.ClearFormatting
.Replacement.ClearFormatting

検索・置換の設定をおこないます。

With Selection.Find
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = True
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchFuzzy = False

Findメソッドのプロパティ設定値の詳細は以下の通りです。

プロパティ 説明
Forward (True)指定で文書に対して末尾の方向(順方向)に検索します。(False)で逆順です。
Wrap 「wdFindContinue」先頭(または末尾)に戻って検索をします。「wdFindAsk」で戻って検索をします。
Format フォーマット変更を有効する(True)、有効にしない(False)を設定します。
MatchCase 英語の大文字と小文字の区別する(True)、区別しない(False)を設定します。
MatchWholeWord 単語全体を検索対象とする(True)、しない(False)を設定します。
MatchByte 半角と全角を区別する(True)、区別しない(False)を設定します。
MatchAllWordForms 英単語の異なる活用形検索を有効する(True)、有効にしない(False)を設定します。
MatchWildcards ワイルドカード(?*など任意の文字)を使った検索を有効する(True)、有効にしない(False)を設定します。
MatchSoundsLike 英語のあいまい検索を有効する(True)、有効にしない(False)を設定します。誤った置換を防止するため、英語のあいまいな検索はOFFにします。
MatchFuzzy 日本語のあいまい検索を有効する(True)、有効にしない(False)を設定します。誤った置換を防止するため、日本語のあいまいな検索はOFFにします

 

置換を全て置換で実行します。

Selection.Find.Execute Replace:=wdReplaceAll

なお、定数の種類は以下の通りです。

定数 置換の方法
wdReplaceNone 置換しない(既定値)
wdReplaceOne 1つだけ置換
wdReplaceAll 全て置換

 

 

さいごに

いかがでしょうか。

今回は、
Word VBAを使い、Wordドキュメント内の複数の用語を一括・連続置換して、きれいに用語を統一する方法
をご紹介しました。

今回のVBAと置換リストをうまく活用すれば、短期間で用語統一ができ、各ドキュメントの品質があがりますので、ぜひ活用いただければと思います。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。



タカヒロ

タカヒロ
Excelの基礎がスルスル入ってくるAmazonランク1位の優良Excel本です。

この基礎本と応用技が多いエク短と組み合わせれば、短時間で誰よりもExcelが使いこなせるかと思います。
>詳細を見てみる 

6 件のコメント

  • 【Word VBA】複数の文字を一括・連続置換する
    勉強になります。
    ⽉,月のような康煕部首の置換はエラーになるのですが、なにか方法はあるのでしょうか?

    • いつもご利用ありがとうございます。

      ⽉,月のような康煕部首の置換ですが、康煕部首はUnicode文字でShift-JISにない特殊文字なのでそのままVBAで持ってくると判別できず「?」のようになります。

      ですので、康煕部首を指定する場合、文字ではなく文字コードのまま持ってきて、VBA側で文字へ変換し置換処理をする方法がよいかと思われます。

      やり方は以下の通りです。

      Unicodeの文字コード一覧表から該当文字コードを確認します。
      サンプルの「⽉」の場合は、文字コードは「2F49」となります。

      続いて、VBAの検索ワード指定のコードを以下のように変更します。
      .Text = ChrW(tmp(0))
      ChrW関数はUnicodeの文字コードから文字を取得する関数です。
      文字コードに16進数を表す「&H」を頭につける必要があるので上記コードでは「&H2F49」となります。

      最後に、置換文字一覧を入力しているcsvファイルに「&H2F49,月」と入力します。

      これで実行し、置換されるか確認頂ければと存じます。

      • 返信ありがとうございます。
        早速実行してみました。
        .Text = tmp(0) ‘検索ワードを代入します。
        部分を下記に書き換えました。
        .Text = ChrW(tmp(0)) ‘検索ワードを代入します。
        CSVファイルの記述を &H2F49,月 にて実行すると
        エラー13 型が一致しません といったエラーになります。
        いろいろ調べましたがダメでした。
        環境はWin10 Word365です。
        何がダメなのでしょうか?

        • 型が一致しないエラーが発生する状況ということですが、
          ChrW関数の引数に全角文字など整数以外の値が割り当たっている可能性があります。

          CSVファイルは「&H2F49,月」の1行のみとなっているか確認頂けますでしょうか。

          • 無事動作するようになりました。
            原因はExcelのA列検索語B列置換語を入力して別名保存でCSV UTF-8(コンマ区切り)で保存をしていた為でした。
            最初Unicodeで入力していたのでUTF-8で保存をしてまして16進数に変えてからもそのままでした。
            CSV(コンマ区切り)で保存すると無事置換されました。(ちょっと感動でした)
            後は、コードを追加していくだけで仕事もはかどります。
            ありがとうございました。

          • CSV側の文字コード指定の問題だったということですね。

            無事できたようでよかったです。

            また何かありましたら連絡いただければと思います。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です