【入門編】【中級者向け】置換対象の文字列を外部テキストファイルから読み込んで一括置換する – Word VBA解析バイブル

スポンサーリンク

こんにちは! Word VBAの深淵へようこそ。
これまで「マクロの記録」ボタンを押して生成されたコードを眺めたり、ネットで見つけた断片的なコードをコピペしてエラーに悩まされたりしていませんか?

「特定のキーワードを別の言葉に一括で置き換えたい」
そう思ったとき、あなたならどうしますか? Wordの標準機能である「置き換え」画面を開き、何十回も同じ作業を繰り返していないでしょうか。あるいは、VBAのコードの中に `Find.Execute Replace:=wdReplaceAll` を何行も書き並べていませんか?

今回は、「外部のテキスト(CSV)ファイルから置換リストを読み込み、Word文書に対して一括で華麗に置換を適用する汎用ツール」の作り方を、世界最高峰のアーキテクチャの視点からお伝えします。

ここをクリアすれば、あなたのWord VBAスキルは「初学者」の領域を完全に抜け出し、業務自動化のエンジニアとしての第一歩を踏み出すことができますよ。さあ、一緒に本質を学んでいきましょう!

なぜ「外部ファイルからの置換」が必要なのか?

実務の世界では、置換したいルール(「Aという言葉をBに変える」)は頻繁に変更されます。ルールが変わるたびにVBAのコードを書き直して…なんてやっていたら、保守性が最悪の「負債コード」になってしまいますよね。

プロの鉄則:データとロジック(処理)は分離せよ。

置換リストをCSVファイルという「外部データ」として切り出すことで、VBAのコードを一切触ることなく、メモ帳やExcelで置換リストを編集するだけで、あらゆる置換パターンに対応できる柔軟なシステムが構築できます。

準備するもの

1. 置換リスト(CSVファイル)

デスクトップなどに `replace_list.csv` という名前で、文字コード「Shift-JIS(またはUTF-8)」のCSVファイルを作成してください。

検索文字列,置換文字列
旧システム,新システム
株式会社A,株式会社B
TODO,完了

※1行目は見出し(ヘッダー)としてスキップし、2行目以降のデータを処理するロジックにします。

2. 対象となるWord文書

適当なテキストが入力されたWordファイルを用意してください。

匠のコード:一括置換ツールの全貌

それでは、実際にWordのVBAエディタ(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてください。

Option Explicit

‘ ==============================================================================
‘ 外部CSVファイルから置換リストを読み込み、アクティブ文書を一括置換するプロシージャ
‘ ==============================================================================
Sub ExecuteBulkReplaceFromCSV()
Dim fso As Object
Dim ts As Object
Dim csvPath As String
Dim lineBuf As String
Dim fields() As String
Dim findText As String
Dim replText As String
Dim counter As Long

‘ 1. FSO(FileSystemObject)のインスタンス生成
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 2. CSVファイルのパスを指定(ここではWord文書と同じフォルダにあると仮定)
csvPath = ActiveDocument.Path & “\replace_list.csv”

‘ ファイルの存在チェック
If Not fso.FileExists(csvPath) Then
MsgBox “置換リストが見つかりません。” & vbCrLf & “パス: ” & csvPath, vbCritical, “エラー”
Exit Sub
End If

‘ 3. TextStreamでCSVを開く(ForReading = 1)
Set ts = fso.OpenTextFile(csvPath, 1, False)

‘ 4. ヘッダー行(1行目)をスキップ
If Not ts.AtEndOfStream Then
lineBuf = ts.ReadLine
End If

‘ 画面描画を停止してパフォーマンスを極限まで引き上げる(超重要テクニック)
Application.ScreenUpdating = False

counter = 0

‘ 5. ファイルの終端まで1行ずつ読み込む
Do While Not ts.AtEndOfStream
lineBuf = ts.ReadLine

‘ 空行はスキップ
If Trim(lineBuf) <> “” Then
‘ カンマで分割して配列にする
fields = Split(lineBuf, “,”)

‘ データが正しく「検索」「置換」のペアになっているか確認
If UBound(fields) >= 1 Then
findText = Trim(fields(0))
replText = Trim(fields(1))

‘ 検索文字列が空でない場合のみ置換を実行
If findText <> “” Then
Call ExecuteReplace(findText, replText)
counter = counter + 1
End If
End If
End If
Loop

‘ 6. 後処理
ts.Close
Application.ScreenUpdating = True

‘ 完了メッセージ
MsgBox “一括置換が完了しました。” & vbCrLf & “処理したパターン数: ” & counter & “件”, vbInformation, “完了”

CleanUp:
‘ オブジェクトの解放
Set ts = Nothing
Set fso = Nothing
End Sub

‘ ==============================================================================
‘ 個別の置換を実行するヘルパープロシージャ
‘ ==============================================================================
Private Sub ExecuteReplace(ByVal targetText As String, ByVal replaceText As String)
Dim rng As Range
Set rng = ActiveDocument.Content

With rng.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = targetText
.Replacement.Text = replaceText
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = True // 大文字・小文字を区別するか
.MatchWholeWord = False
.MatchWildcards = False // ワイルドカードを使用しない

‘ 一括置換実行
.Execute Replace:=wdReplaceAll
End With
End Sub

コードの深掘り解説:ここがエンジニアの知見

初心者から一歩抜け出すために、このコードに散りばめられた「プロの技」をいくつか解説します。

① `Application.ScreenUpdating = False` の魔力

Word VBAで最もやってはいけないのが、「ループの中で画面を何度も再描画させること」です。置換パターンが100件あれば、画面が100回パチパチと切り替わり、処理が極端に遅くなります。
処理の最初に `False` にし、最後に `True` に戻すことで、バックグラウンドで高速に処理を完結させます。これは大規模文書を扱う際の必須テクニックです。

② `FileSystemObject (FSO)` による堅牢なファイル操作

VBA古い標準の `Open` ステートメントではなく、`Scripting.FileSystemObject` を使っています。これにより、ファイルの存在チェック(`FileExists`)や文字エンコーディングの扱いなど、モダンで安全なファイルIO(入出力)が可能になります。

③ `Range.Find` オブジェクトの作法

`Selection.Find` ではなく、文書全体のコンテンツを保持する `Range.Find` を使っている点に注目してください。
`Selection`(画面上のカーソル)を操作しないため、画面がチラつかない、処理が圧倒的に速い、予期せぬ場所を選択してエラーになることがないという、三拍子そろった美しい設計になっています。

陥りやすいエラーと対策

1. パスエラー(ファイルが見つからない)

  • 原因: コードでは `ActiveDocument.Path & “\replace_list.csv”` としています。これは、「今開いているWordファイルと同じフォルダにCSVが置かれている」ことを前提としています。Wordファイルを一度も保存していない状態(文書1など)だとパスが取得できずエラーになります。必ずWordファイルを保存してから実行してください。

2. 文字化けによる一致エラー

  • 原因: CSVファイルの文字コードがShift-JISではなくUTF-8(BOMなし)などで保存されていると、VBAが正しく日本語を読み込めず、置換がヒットしなくなります。メモ帳の「名前を付けて保存」から、文字コードを「ANSI(またはShift-JIS)」に指定して保存し直してください。

おわりに

お疲れ様でした! ここまで理解できれば、単なるマクロの記録の域を超え、自分だけの強力な業務自動化ツールを自由自在に設計・構築できるようになります。

「ここをクリアすれば、Word VBAの基本はバッチリですよ!」

次は、このコードに「ワイルドカード検索」を組み合わせて、日付やメールアドレスのパターン置換に挑戦してみるのも面白いでしょう。あなたのVBAライフが、より知的でクリエイティブなものになることを応援しています。それでは、次のステージでお会いしましょう!

タイトルとURLをコピーしました