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

スポンサーリンク

【Word VBA】マクロの「ハードコーディング」から卒業せよ!外部JSONで置換ルールを動的に操る極意

こんにちは。自動化の現場で血と汗と涙を流してきた、あなたの技術メンターです。

Word VBAで「検索と置換」を繰り返していると、必ずぶつかる壁があります。それは「置換ルールをコードの中に直接書き込んでしまう(ハードコーディング)」という罠です。

「表記ゆれを一つ直すたびにVBAエディタを開いて修正する」……そんな非効率な作業は、今日で終わりにしましょう。今回は、FSO(FileSystemObject)を使って外部ファイルから置換ルールを読み込み、Wordを自動制御する「プロの運用術」を伝授します。

—

1. なぜ「外部ファイル管理」なのか?

VBAの中に置換リストを書くと、以下のような悲劇が待っています。

  • メンテナンス性の欠如: 修正のたびにVBAのコードを触るため、予期せぬバグを混入させるリスクが高い。
  • 共有の困難さ: プログラミングが分からない担当者に、修正をお願いすることができない。
  • 拡張性の欠如: 数百個の置換ルールを扱うようになると、コードがスパゲッティ化して収拾がつかなくなる。

これを解決するのが、「ロジック(VBA)」と「データ(CSV/JSON)」の分離です。今回は扱いやすい「CSVファイル」を例に、その実装を見ていきましょう。

—

2. 準備するもの:置換ルール定義ファイル

まず、デスクトップなどに `replace_rules.csv` という名前で以下の内容を作成してください。

検索文字列,置換後文字列
株式会社,(株)
有限会社,(有)
VBA,Visual Basic for Applications

—

3. 実装の要:FSOとWord Findオブジェクトの連携

VBA側では、`Scripting.FileSystemObject` を使ってこのCSVを読み込み、一行ずつWordの `Find` オブジェクトに渡していきます。

プロフェッショナルな実装コード

Option Explicit

‘ 参照設定: Microsoft Scripting Runtime を有効にしてください
‘ 手順: ツール > 参照設定 > Microsoft Scripting Runtime にチェック

Sub DynamicReplaceFromCSV()
Dim fso As Object
Dim ts As Object
Dim line As String
Dim items() As String
Dim filePath As String

‘ CSVファイルのパスを指定
filePath = Environ(“USERPROFILE”) & “\Desktop\replace_rules.csv”

Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ファイルが存在しない場合のガード節
If Not fso.FileExists(filePath) Then
MsgBox “ルールファイルが見つかりません。”, vbCritical
Exit Sub
End If

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

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

‘ 画面更新を停止してパフォーマンスを最大化
Application.ScreenUpdating = False

Do While Not ts.AtEndOfStream
line = ts.ReadLine
items = Split(line, “,”)

‘ 文字列置換の実装
If UBound(items) >= 1 Then
Call ExecuteWordReplace(items(0), items(1))
End If
Loop

ts.Close
Application.ScreenUpdating = True

MsgBox “置換処理が完了しました。”
End Sub

‘ 置換実行の本体:Findオブジェクトのライフサイクルを意識する
Private Sub ExecuteWordReplace(findText As String, replaceText As String)
With Selection.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

—

4. ここがプロのポイント!解説と注意点

① `Application.ScreenUpdating = False` の重要性

Word VBAの描画は非常に重い処理です。置換のたびに画面を更新していると、処理速度が劇的に低下します。必ず処理の前後で制御しましょう。

② `Find` オブジェクトの初期化(重要!)

`Execute` の前に必ず `.ClearFormatting` を実行してください。これを行わないと、前回の置換で設定された「書式条件(太字など)」が引き継がれ、意図しない挙動を引き起こすことがあります。これは初心者が最も陥りやすい罠です。

③ 正規表現(Wildcards)への発展

今回のコードの `.MatchWildcards = False` を `True` に変更すれば、Word独自の強力な正規表現が使えます。例えば「数字の連続」を検索するなら `[0-9]{1,}` と指定するだけで、置換の幅が一気に広がります。

—

最後に:自動化の先にあるもの

コードを外部から読み込む仕組みを作るということは、「自動化の仕組み」を「メンテナンス可能な製品」に昇華させるということです。

最初は難しく感じるかもしれませんが、この「データとロジックの分離」の考え方は、VBAに限らず、PythonやJavaScriptなどあらゆる言語で通用するエンジニアの基礎体力です。

ここをクリアしたあなたは、もう「マクロの記録」に頼るだけのユーザーではありません。自らの手で業務フローを設計し、制御するエンジニアの第一歩を踏み出したのです。

何か詰まったら、いつでも戻ってきてくださいね。あなたの挑戦を応援しています。

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