Word VBAを「支配」する:オートコレクト辞書をコードで極限制御する
Wordのオートコレクト機能は、多くの一般ユーザーにとって「お節介な修正機能」に過ぎない。だが、我々のようなシステムアーキテクトにとって、これは「文書作成プロセスを標準化するための強力なエンジン」である。
今回は、GUIの煩雑なダイアログをバイパスし、`Application.AutoCorrectEntries` を直接操作して、辞書をプログラム制御下に置く手法を伝授する。これは単なる自動化ではない。企業内文書の「表記揺れ」という慢性的な癌を根絶するための、極めて戦略的なアプローチだ。
—
1. オブジェクトモデルの深層:AutoCorrectEntriesの真実
`AutoCorrectEntries` は `Application` オブジェクトの配下に存在するコレクションだ。しかし、このオブジェクトの振る舞いは一見シンプルに見えて、内部的にはWordのグローバルテンプレート(Normal.dotm)に深く依存している。
ここでシニアエンジニアとして留意すべきは、「変更の永続性」である。
VBAで追加・削除したエントリはWordのセッションを跨いで保持されるが、これはWordが終了時に Normal.dotm を書き換えるからだ。大規模な辞書更新を行う際、Wordのクラッシュや予期せぬ終了が発生すれば、辞書データが破損するリスクがある。
実装の鉄則
- バックアップ: 操作前に `Application.AutoCorrectEntries` の全スナップショットを取るか、辞書ファイルをバイナリレベルでバックアップする論理を組み込むこと。
- エラーハンドリング: エントリの重複追加はランタイムエラー(Error 4160)を誘発する。必ず存在確認を行うガード節を挟め。
—
2. 辞書管理の自動化エンジン:実用コード
以下に、CSVから辞書を一括インポートし、不要なエントリをフィルタリングしてクリーンアップする実用的なクラスモジュールの断片を示す。
‘ @Description: オートコレクト辞書を制御するマネージャークラス
Option Explicit
Public Sub UpdateDictionaryFromCSV(ByVal csvPath As String)
Dim fileNo As Integer: fileNo = FreeFile
Dim lineData As String
Dim parts() As String
On Error GoTo ErrorHandler
Open csvPath For Input As #fileNo
‘ オブジェクトの明示的参照を維持し、ループ内のオーバーヘッドを最小化する
Dim ace As AutoCorrectEntries
Set ace = Application.AutoCorrectEntries
Do Until EOF(fileNo)
Line Input #fileNo, lineData
parts = Split(lineData, “,”) ‘ CSV形式: 誤変換,正解
‘ 既存チェック:重複によるランタイムエラーを回避
If Not IsEntryExists(ace, parts(0)) Then
ace.Add parts(0), parts(1)
End If
Loop
Close #fileNo
Exit Sub
ErrorHandler:
Debug.Print “Error: ” & Err.Number & ” – ” & Err.Description
If fileNo > 0 Then Close #fileNo
End Sub
Private Function IsEntryExists(ace As AutoCorrectEntries, target As String) As Boolean
‘ 名前による高速アクセスを試行(存在しない場合はエラーが発生する)
On Error Resume Next
Dim dummy As AutoCorrectEntry
Set dummy = ace.Item(target)
IsEntryExists = (Err.Number = 0)
On Error GoTo 0
End Function
—
3. レガシー環境とパフォーマンスへの配慮
VBAはシングルスレッドである。数千件を超えるエントリを一度に投入すると、WordのUIはフリーズする。この場合、以下の最適化を検討せよ。
1. Application.ScreenUpdating の制御: 大量投入時は一時的にオフにし、再描画コストを抑える。
2. Windows APIによる状態確認: `FindWindow` 等を併用し、Wordがモーダルダイアログを出していないか確認してから処理を開始する。
3. オブジェクトの解放: `Set ace = Nothing` を明示的に行い、COMオブジェクトのデストラクターを強制的に呼び出す。メモリリークは長時間の文書作成プロセスにおいて致命的だ。
—
4. 伝説のアーキテクトからの提言
オートコレクト辞書の管理は、単なるテキストの置換ではない。これは「企業の言語規格」をコードに落とし込む作業である。
- バージョン管理: 辞書ファイルをGit等で管理し、ビルドスクリプトからこのVBAを叩く運用へ移行せよ。
- 配布: アドイン(.dotm)として配布し、起動時にサーバー上の辞書定義と同期(Sync)する機能を持たせれば、全社員のPCで「表記揺れ」は過去のものとなる。
Word VBAは、今やレガシーと呼ばれるかもしれない。だが、OSの深部とドキュメントモデルを直結できるこの言語は、適切に扱えば、現代のどのフレームワークよりも強力な「業務制圧ツール」となり得る。
次回の記事では、この辞書データと `Range.Find` を組み合わせた、高速検索・置換エンジンの設計について深掘りしていく。期待せよ。
