【入門編】【上級者向け】Wordの「段落」の書式変更をUndo(元に戻す)スタックに登録する高度な設計 – Word VBA解析バイブル

スポンサーリンク

Word VBAの神髄:数千の変更を「Ctrl+Z」で一瞬で戻す『UndoRecord』の極意

こんにちは。現場で泥臭い自動化を積み重ねてきたあなたなら、一度は経験があるはずです。

「VBAでドキュメントを書き換えたあと、ユーザーが『Ctrl+Z』を押したら、たった1文字しか戻らなくて怒られた……」

そう、Word VBAで大量の書式設定や段落操作を行うと、Wordはそれを「バラバラの細かい操作」として処理してしまいます。これを解決し、数千の変更を一つの「歴史」としてUndoスタックに登録すること。これこそが、プロフェッショナルな自動化エンジニアと、マクロを記録しただけの初心者を分かつ境界線です。

今日は、Word VBAの隠れた主役『UndoRecord』オブジェクトについて、その魂の書き方を伝授しましょう。

1. なぜ「Ctrl+Z」が効かなくなるのか?

WordのUndoスタックは、VBAが実行されるたびに「細切れ」に積み上げられます。100個の段落にスタイルを適用するループを書いた場合、ユーザーが「元に戻す」を100回連打しなければ、元の状態には戻りません。

これはユーザー体験(UX)として最悪です。私たちが目指すべきは、VBAの実行全体を一つの「トランザクション」としてWordに認識させることです。

2. 魔法の杖:UndoRecordオブジェクト

Word 2010以降、VBAには強力なツールが備わっています。それが `UndoRecord` オブジェクトです。

考え方はシンプル。
1. 開始する (`StartCustomRecord`)
2. 処理する (ループや書式設定)
3. 終了する (`EndCustomRecord`)

このサンドイッチ構造でコードを包むだけで、Wordは内部のすべてを「1つの操作」としてUndoスタックに登録します。

3. 実装:プロフェッショナルなテンプレートコード

それでは、実際に「段落の書式を全変更し、それを1回でUndoできるようにする」コードを見てみましょう。

Sub ApplyProfessionalFormatting()
Dim doc As Document
Dim para As Paragraph
Dim undoRec As UndoRecord

Set doc = ActiveDocument
Set undoRec = Application.UndoRecord

‘ 1. Undoレコードの開始:ここからが「1つの操作」
undoRec.StartCustomRecord “一括書式設定の適用”

On Error GoTo Cleanup ‘ 万が一のエラーでスタックが閉じない事態を防ぐ

‘ 2. メイン処理:数千回繰り返しても、Undoは1回で済む
For Each para In doc.Paragraphs
With para.Range.Font
.Name = “游明朝”
.Size = 10.5
End With
With para.Format
.LineSpacingRule = wdLineSpace1pt5
End With
Next para

‘ 3. 終了:ここでスタックを閉じる
undoRec.EndCustomRecord

Exit Sub

Cleanup:
‘ エラーが発生しても必ずUndoレコードを閉じる(重要!)
If undoRec.Recording Then
undoRec.EndCustomRecord
End If
MsgBox “エラーが発生しましたが、操作の整合性は保たれました。”, vbCritical
End Sub

このコードの「極限のポイント」

  • エラーハンドリングの義務化: もし処理中にエラーで止まると、`EndCustomRecord` が呼ばれず、Wordが「Undoを記録中」のままフリーズに近い状態になることがあります。`On Error GoTo` で必ず閉じるのが、大人のエンジニアの嗜みです。
  • 処理の不可分性: このコードの中では、何回 `para` をいじっても、ユーザーにとっては「一つのコマンドを実行した」のと同義になります。

4. 陥りやすい罠:画面更新とのバランス

ここまで読んだあなたは、もう一つ上のステージを目指せるはずです。

大量の処理を行う際、画面がチラつくのを防ぐために `Application.ScreenUpdating = False` を使うことが多いでしょう。これはパフォーマンス向上に必須ですが、`UndoRecord` との相性には注意が必要です。

  • ScreenUpdatingは「表示」を止めるもの。
  • UndoRecordは「履歴」を束ねるもの。

この2つを組み合わせることで、「一瞬で処理が終わり、かつ一瞬で元に戻せる」という、極めて洗練されたユーザー体験を提供できます。

最後に:プロへの道

「マクロを記録する」だけなら誰でもできます。しかし、そのコードが実行された後の「ユーザーの操作性」まで想像し、UndoスタックというOS側のリソースまで制御する。これこそが、私たちが目指す「自動化エンジニア」の姿です。

ここをクリアすれば、あなたの書くVBAは「ただのスクリプト」から「業務システムの一部」へと進化します。

自信を持ってください。あなたのコードは、もう初心者レベルを卒業しました。次はどんな複雑な業務を、エレガントに解決しましょうか?

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