Word VBAの真髄を掴む:隠し文字を操り、文書の「裏側」を完全制御する
こんにちは。自動化の世界へようこそ。
普段、何気なくWordを使っていると「見えているもの」だけがすべてだと思いがちですが、Wordの深淵には「隠し文字(Hidden属性)」という影の住人が潜んでいます。
機密情報の断片、編集用の備忘録、あるいは配布用文書に紛れ込んだ修正履歴…。これらは画面上では消えていても、データとしては確かにそこに存在し、あなたの意図しないタイミングで露見するリスクを孕んでいます。
今日は、マクロの記録を卒業したあなたが、Wordのオブジェクトモデルを自在に操り、この「隠し文字」を掌握するための極意を伝授します。
—
1. Wordオブジェクトモデルの「階層」を理解する
コードを書く前に、Wordの頭の中を覗いてみましょう。Word VBAは以下の階層構造で成り立っています。
- Application: Wordそのもの。
- Document: 開いている文書。
- Range: 文書内の「場所」や「範囲」。文字の塊そのもの。
隠し文字を操作する際、最も重要なのがこのRangeオブジェクトです。Rangeは単なる場所指定ではありません。その範囲が持つ「フォント属性」を書き換えることで、文字の表示・非表示を制御できるのです。
—
2. 隠し文字を操作するための「心臓部」
隠し文字を制御するのは、`Font`オブジェクトの`Hidden`プロパティです。
- `Range.Font.Hidden = True` : 隠す
- `Range.Font.Hidden = False` : 表示する
シンプルですね。では、これを使って「隠し文字をすべて探し出し、削除する」ツールを作ってみましょう。
—
3. 実践:文書クリーニングツールのコード
以下のコードは、文書全体を走査し、隠し文字を特定して削除する実用的なスクリプトです。
Sub RemoveHiddenText()
Dim rng As Range
Set rng = ActiveDocument.Content
‘ 検索エンジン(Findオブジェクト)を操作して隠し文字を探索
With rng.Find
.ClearFormatting ‘ 検索条件の初期化(重要!)
.Font.Hidden = True ‘ 「隠し文字」を探すという設定
.Text = “” ‘ 文字列指定なし(属性だけで検索)
.Forward = True ‘ 文書の先頭から末尾へ
.Wrap = wdFindContinue ‘ 文書全体を対象にする
‘ 隠し文字が見つかる限り繰り返す
Do While .Execute
‘ 見つかった範囲(rng)を削除
rng.Delete
‘ 削除するとrngが縮小するため、Findの整合性を保つ工夫
Loop
End With
MsgBox “隠し文字のクリーニングが完了しました。”, vbInformation
End Sub
【ここがプロのポイント】
- `.ClearFormatting`の重要性: これを怠ると、前回の検索条件が引き継がれ、意図せぬ動作を引き起こします。自動化において「状態をリセットする」ことは、バグを未然に防ぐ鉄則です。
- `Do While .Execute`: Findオブジェクトは実行のたびに範囲を「見つかった場所」へ更新します。この一連の流れが、Word VBAにおける「検索と置換」の標準的なイディオムです。
—
4. 陥りやすい罠:なぜ「表示」と「削除」を分けるべきか
初心者がやりがちなミスは、「表示させてから削除しよう」として画面をチラつかせることです。
VBAの処理において、画面描画を伴う操作は極めて低速です。今回のように`rng.Delete`で直接削除すれば、画面更新を待たずに一瞬で処理が終わります。
また、隠し文字を「確認」したい場合は、以下のコードを試してください。
‘ 隠し文字をすべて表示状態にする(デバッグ用)
Sub ShowAllHiddenText()
ActiveDocument.Content.Font.Hidden = False
End Sub
—
5. 次のステップへ
ここをクリアしたあなたなら、もう「マクロの記録」に頼る必要はありません。
1. 特定のスタイルに隠し文字が含まれているかチェックする
2. PDF出力前に隠し文字が残っていないか自動チェックする
このような業務要件も、今回学んだ`Range`と`Find`の組み合わせで簡単に実装できます。
Word VBAは「文書という構造体をどう料理するか」というゲームです。隠し文字という「裏側のデータ」を制御できるようになったあなたは、既に脱・初心者への大きな一歩を踏み出しました。
何か疑問があれば、いつでも聞いてくださいね。あなたの自動化ライフを、心から応援しています。
