【実務・中級編】【中級者向け】FSOを利用して「置換ルール定義ファイル(JSON/CSV)」から動的に置換を実行する – Word VBA解析バイブル

スポンサーリンク

ハードコーディングは「技術的負債」の墓標である:Word VBAと外部定義ファイルによる置換の自動化

現場の業務自動化において、最も愚かな行為は「置換リストをVBAのコード内に直書きすること」です。

「置換対象が増えるたびにVBAエディタを開き、コードを修正し、再コンパイルする」。このサイクルは、あなたの生産性を奪うだけでなく、ヒューマンエラーという名の時限爆弾をプログラムに埋め込んでいるに等しい。

真のエンジニアは、「ロジック(実行エンジン)」と「データ(置換ルール)」を完全に分離します。今回は、FSO(FileSystemObject)を駆使し、外部のJSON/CSVファイルから置換ルールを動的に読み込み、Wordドキュメントを一括処理する「堅牢なアーキテクチャ」を伝授する。

—

1. なぜ「外部管理」が必要なのか

業務フローにおいて、置換ルールは頻繁に変わるのが常だ。

  • 表記ゆれの修正
  • 部署名の変更
  • クライアントごとの個別要件

これらをコードにハードコーディングしていては、修正のたびにテスト工数が発生する。外部ファイル(CSV)でルールを管理すれば、非エンジニアの担当者がExcelでルールを編集するだけで、システムは即座に最新状態へ更新される。 これが、保守性を担保するための唯一の正解だ。

—

2. プロダクションコード:CSV駆動型置換エンジン

今回はシンプルかつ汎用性の高いCSV方式を採用する。`Microsoft Scripting Runtime`を参照設定に追加してほしい。

準備:`rules.csv` の形式

検索文字列,置換文字列
(2023年度),2024年度
株式会社〇〇,株式会社△△

実装コード

Option Explicit

‘ 伝説的な堅牢性を備えた置換エンジン
Public Sub BatchReplaceFromCSV()
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim ts As Object
Dim csvPath As String: csvPath = ThisDocument.Path & “\rules.csv”

If Not fso.FileExists(csvPath) Then
MsgBox “ルールファイルが見当たりません。”, vbCritical
Exit Sub
End If

Set ts = fso.OpenTextFile(csvPath, 1) ‘ 1 = ForReading

‘ ヘッダーをスキップ
If Not ts.AtEndOfStream Then ts.SkipLine

Application.ScreenUpdating = False

Do Until ts.AtEndOfStream
Dim line As String: line = ts.ReadLine
Dim parts() As String: parts = Split(line, “,”)

‘ 検索文字列と置換文字列が揃っているか検証
If UBound(parts) >= 1 Then
Call ExecuteReplace(parts(0), parts(1))
End If
Loop

ts.Close
Application.ScreenUpdating = True
MsgBox “置換プロセスが完了しました。”, vbInformation
End Sub

‘ WordのFindオブジェクトを操作する極限の最適化
Private Sub ExecuteReplace(findText As String, replaceText As String)
With ActiveDocument.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = findText
.Replacement.Text = replaceText
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False ‘ 必要に応じてTrueへ

‘ 全置換を実行
.Execute Replace:=wdReplaceAll
End With
End Sub

—

3. 設計の勘所:なぜこの書き方なのか

このコードには、現場で生き残るための「こだわり」が詰まっている。

1. Application.ScreenUpdating = False
Wordは画面描画が重い。このフラグを立てるだけで、処理速度は劇的に向上する。数千行のドキュメントを扱う際、これがないとPCがフリーズする。
2. Findオブジェクトのクリーンアップ
`.ClearFormatting` を忘れるな。前回の置換設定が残っていると、意図しない書式置換が暴発し、ドキュメントが破壊される。
3. エラーハンドリングの徹底
FSOでのファイル存在チェックは必須だ。読み込み時にファイルがロックされている可能性も考慮し、本来は `On Error Resume Next` と組み合わせた制御が望ましい。
4. ロジックの分離
`ExecuteReplace` プロシージャを独立させることで、将来的には「正規表現置換」や「書式付き置換」への拡張が容易になる。

—

4. 次なるステップ:正規表現の活用

もし高度な検索が必要なら、`.MatchWildcards = True` を活用せよ。Wordのワイルドカードは通常の正規表現とは微妙に仕様が異なるが、これを使えば「メールアドレスの抽出」「特定パターンの日付置換」など、極めて複雑な処理が可能になる。

ただし、複雑な条件はバグの温床だ。まずは今回紹介したCSV方式で「単純置換」を完全に自動化し、安定稼働させてから、ワイルドカードの海へ漕ぎ出すことを強く推奨する。

自動化とは、一度作って終わりではない。「誰が触っても壊れない仕組み」を作り上げることこそが、エンジニアとしての真の価値なのだ。

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