【入門編】【上級者向け】正規表現による「数式エディタ」内の文字列検索と置換の限界と回避策 – Word VBA解析バイブル

スポンサーリンク

【上級者向け】Wordの「数式エディタ」をハックせよ!正規表現とXML解析による置換術

こんにちは。業務自動化の世界へようこそ。
普段、Word VBAで`.Find`メソッドを使って検索・置換をしている皆さん。ある日、こんな壁にぶつかりませんでしたか?

「文書内の文字は置換できるのに、数式エディタの中身だけが一切反応しない……!」

そう、Wordの数式オブジェクト(OMath)は、VBAの通常の検索エンジンの「外側」に存在しています。マクロの記録で生成されるコードが通用しない、まさに聖域です。

今日は、その聖域を突破し、数式内部を自在に操るための「XML解析ハック」を伝授します。ここをクリアすれば、あなたはもう「マクロの記録」を卒業した、真の自動化エンジニアです。

—

なぜ数式は「Find」で検索できないのか?

Wordの数式は、通常のテキストとは異なる「OMath」という特別なオブジェクトで管理されています。Wordの検索機能は「文章のストリーム(流れ)」を見ていますが、数式は文書の中に「埋め込まれた別の小宇宙」のようなもの。だから、通常の`Selection.Find`では到達できないのです。

突破口は「XML」にあり

Wordの`.docx`ファイルの実体は、実はただの「ZIP圧縮されたXMLの集合体」です。VBAを使えば、Wordが裏側で持っているXML構造を直接覗き込み、テキストとして書き換えることができます。

—

実践:数式内の文字列を置換するコード

以下のコードは、数式内の特定の文字(例:`old`)を別の文字(例:`new`)に一括置換するプロトタイプです。

Sub ReplaceTextInMathEquations()
Dim oMath As OMath
Dim oRange As Range

‘ 文書内のすべての数式オブジェクトをループ処理
For Each oMath In ActiveDocument.OMaths
‘ 数式の範囲を取得
Set oRange = oMath.Range

‘ Findオブジェクトの設定
With oRange.Find
.ClearFormatting
.Text = “old” ‘ 検索対象
.Replacement.Text = “new” ‘ 置換後の文字
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = True ‘ 大文字小文字を区別

‘ 置換を実行
.Execute Replace:=wdReplaceAll
End With
Next oMath

MsgBox “数式内の置換が完了しました!”, vbInformation
End Sub

このコードのポイント

1. `ActiveDocument.OMaths`: これが数式を操作するための唯一の入り口です。
2. `oMath.Range`: 数式オブジェクトからRange(範囲)を取り出すことで、通常のテキスト処理と同じ手法を適用可能にします。
3. `wdReplaceAll`: 範囲内であれば、数式全体をスキャンして一気に置換します。

—

さらに高度な「正規表現」を使いたい場合

上記のコードは単純な文字列置換ですが、もし「数式内の数字だけを抽出したい」といった複雑な要件がある場合は、VBA標準の`Find`では力不足です。

その場合、`Microsoft VBScript Regular Expressions 5.5` を参照設定し、数式内のテキストを一度変数に格納して解析する必要があります。

陥りやすいエラーと回避策

  • 「オブジェクトがありません」エラー: 数式の中にさらに別のオブジェクトがネストされていると発生します。`On Error Resume Next`で処理を飛ばすか、再帰処理(関数の中で自分を呼び出す手法)を検討してください。
  • 数式が崩れるリスク: 数式内部のXML構造を直接書き換える際、構文を壊すとWordが数式を表示できなくなります。必ず「バックアップを取った上での実行」を鉄則にしてください。

—

読者の皆さんへ:ここを突破する意義

なぜ、わざわざこんな面倒なことをするのでしょうか?
それは、「人間にしかできないと思われていたチェックや修正作業を、完全に自動化できるから」です。

論文や技術仕様書の数式を、後から一括で修正するのは膨大な時間がかかります。しかし、このXML解析の知見があれば、数千の数式も一瞬で書き換え可能です。

次のステップへのアドバイス

1. `ActiveDocument.OMaths(1).Range.XML` を実行して、数式のXML構造をイミディエイトウィンドウに出力してみてください。
2. その構造が見えた時、あなたはWordというソフトウェアの「設計者側」の視点に立っています。

Word VBAは、単なる事務作業の道具ではありません。文書構造を制御する強力なエンジンです。ぜひ、この技術を武器にして、誰にも真似できない自動化ツールを構築してください。

応援しています!また次の現場でお会いしましょう。

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