Word VBAの「重い・落ちる」を根絶する。Rangeとオブジェクト管理の極意
こんにちは。自動化の現場で数々の「死にかけているWordマクロ」を救ってきたチーフアーキテクトです。
マクロの記録から一歩踏み出し、大規模な文書を扱い始めると、必ず突き当たる壁があります。「なぜか処理が進むほどWordが重くなり、最終的にフリーズする」という現象です。
これは、あなたが書いたコードがメモリ上に「亡霊」を大量に発生させていることが原因です。今日は、Word VBAを真に掌握するための「オブジェクト管理の極意」を伝授します。
—
1. Selection(選択範囲)は「使うな」が鉄則
初心者が最も陥りやすい罠。それが `Selection` オブジェクトの多用です。
`Selection` は、画面上のカーソル位置に依存します。画面をスクロールさせ、一つ一つを選択して書式を変える……。これは人間が目で追うには良いですが、PCにとっては「描画更新」という莫大な負荷を強いる無駄な行為です。
なぜ Selection はダメなのか?
- 描画コスト: 選択するたびにWordの画面描画エンジンが走り、処理が劇的に遅くなる。
- 不安定: ユーザーが途中でマウスを触ると、マクロが予期せぬ場所を操作して暴走する。
解決策は `Range` オブジェクトへの移行です。
—
2. Rangeオブジェクト:見えない場所で魔法をかける
`Range` は、文書内の「ある一点から別の点まで」を指し示すメモリ上のポインタです。画面を動かさず、裏側で静かに処理を完了させます。
【極意】Rangeを正しく破棄(解放)する
VBAのガーベジコレクション(自動メモリ解放)は、正直に言ってあまり賢くありません。特にWordのような複雑なオブジェクトモデルでは、自分で後始末をするのがプロの流儀です。
Sub FormattingWithRange()
‘ オブジェクト変数を宣言
Dim rng As Range
‘ 文書の先頭から末尾までを範囲指定(画面を動かさない!)
Set rng = ActiveDocument.Content
‘ 処理の開始
With rng.Find
.Text = “重要キーワード”
While .Execute
‘ マッチした箇所のフォントを太字&赤字にする
With rng
.Font.Bold = True
.Font.Color = wdColorRed
‘ 次の検索のために範囲を移動
.Collapse Direction:=wdCollapseEnd
End With
Wend
End With
‘ 【重要】使い終わったら解放する
‘ これを忘れると、大規模処理でメモリリークが蓄積する
Set rng = Nothing
End Sub
—
3. メモリリークを防ぐ「3つの掟」
大規模な文書を扱う際、以下の3点を徹底するだけで、アプリの安定感は別次元になります。
① `Set rng = Nothing` を儀式化せよ
`Set rng = Nothing` を書くことは、PCに対して「もうこのメモリ領域は使わないから掃除していいよ」と伝える行為です。ループ処理の中で一時的に作成したRangeも、ループを抜ける直前に必ずNothingを代入してください。
② `Application.ScreenUpdating` を制御せよ
処理の冒頭で描画を止め、最後に再開させる。これだけで処理速度が数倍〜数十倍になります。
Sub OptimizedProcess()
Application.ScreenUpdating = False ‘ 画面更新を停止
‘ ここに重い処理を書く
Application.ScreenUpdating = True ‘ 画面更新を再開
End Sub
③ 複雑な文書では `Paragraph` オブジェクトを直接叩く
`Selection` や `Find` を繰り返すとオブジェクトが断片化します。文書の構造(段落単位)が決まっているなら、以下のようにコレクションを直接回すのが最も安全で高速です。
Sub StyleFormatting()
Dim para As Paragraph
‘ 文書内の全ての段落を高速ループ
For Each para In ActiveDocument.Paragraphs
‘ 「見出し1」スタイルなら装飾を変える
If para.Style = “見出し 1” Then
para.Range.Font.Size = 16
End If
Next para
Set para = Nothing ‘ 最後に解放
End Sub
—
まとめ:ここをクリアすれば、あなたはもう「中級者」
今日お伝えしたことは、Word VBAの「心臓部」にあたる知識です。
1. Selectionを捨て、Rangeを使え。
2. 使い終わったオブジェクトには必ず `Set = Nothing` を。
3. ScreenUpdatingで描画コストをカットせよ。
これらを守るだけで、あなたのマクロは「止まらない、落ちない、爆速」のプロ品質へと進化します。
Word VBAは、単なる事務作業の自動化ツールではありません。文書という「巨大なデータ構造」を操作する、プログラミング言語としての奥深さがあります。今日のコードをコピーして、まずは小さな文書で試してみてください。
あなたの自動化ライフが、より快適で知的になりますように。応援しています!
