こんにちは!マクロの記録を卒業して、いよいよ本格的なWord VBAの自動化に踏み出そうとしている君なら、きっと今日のテーマにワクワクするはずだ。
実務でこんな面倒な作業に直面したことはないか?
「膨大なマニュアルや議事録の中で、太字になっている重要箇所や、赤字で注意書きされている部分だけを抜き出して、要約リストを作ってほしい」
これを手作業でやると、スクロールの嵐で目が疲れるし、コピペミスも起きる。でも、Word VBAを正しく使えば、わずか数秒で、しかも正確に別ファイルへとリスト化できるんだ。
今回は、単なるコードのコピペに留まらず、Wordの「文字」と「段落」の裏側の仕組み(ライフサイクル)に少しだけ踏み込みながら、実務で即戦力になるコードを授けよう。ここをクリアすれば、君のWord VBAのスキルは確実に一段階上のステージへ進む。しっかりついてきてくれよ!
—
1. なぜ「強調箇所」の抽出は難しいのか?(Word VBAの罠)
まず、エンジニアとして君に知っておいてほしいWordの現実がある。
Excelなら「セルA1」という明確な箱があるけれど、Wordの世界には厳密な「セルのような独立した箱」はない。文字は「ストーリー(本文やヘッダーなどの流れる領域)」という一本の長い文字列の連続として存在している。
さらに、一つの段落の中に「太字の部分」と「普通の文字」が混在していることも珍しくない。
今回のテーマである「太字や赤字になっている箇所を抽出する」にあたって、私たちは2つのアプローチを選ぶことができる。
1. 段落単位で判定するアプローチ:段落全体の書式を見て、太字や赤字ならその段落まるごと抜き出す。
2. 文字(ラン)単位で判定するアプローチ:文字の断片(Fontオブジェクト)を細かく走査して、強調された部分だけをピンポイントで抜き出す。
今回は、実務のレポートや要約リスト作成で最もニーズが高い「太字または赤字が含まれる段落を丸ごと抽出して、新しいWord文書に綺麗にリスト化する」手法を採用しよう。この基本を押さえることが、高度な文書解析への一番の近道になる。
—
2. 準備:VBAエディタを開こう
まずは開発の舞台裏への入り方だ。
1. Wordを開き、`Alt` + `F11` キーを押してVBAエディタ(VBE)を起動する。
2. メニューの「挿入」>「標準モジュール」をクリックし、真っ白なコードウィンドウを開く。
ここに、これから書くコードを流し込むことになる。
—
3. 実装:強調箇所を抽出して別ファイル化する全コード
以下のコードを、そのまま標準モジュールに貼り付けてみてほしい。
プログラミング初学者でも迷わないよう、すべての処理に魂を込めてコメントを入れている。
Sub ExtractEmphasisParagraphs()
‘ 変数の宣言(Wordのオブジェクトモデルをフル活用します)
Dim docSource As Document ‘ 処理元の文書
Dim docNew As Document ‘ 抽出結果を書き出す新しい文書
Dim para As Paragraph ‘ ループ用:元の文書の段落
Dim targetText As String ‘ 抽出するテキストを一時格納する変数
Dim foundCount As Long ‘ 抽出した件数をカウントする変数
‘ 1. 処理元のドキュメントをアクティブ文書として定義
Set docSource = ActiveDocument
‘ チェック:もしドキュメントが保存されていない等の理由があれば処理を中断
If docSource.Paragraphs.Count = 0 Then
MsgBox “処理する段落が存在しません。”, vbExclamation, “エラー”
Exit Sub
End
‘ 2. 抽出結果を書き出すための「新しい空の文書」を作成
Set docNew = Documents.Add
‘ 新しい文書の最初にタイトルを挿入
docNew.Content.InsertAfter “【強調箇所・要約リスト】” & vbCrLf & _
“抽出日時: ” & Format(Now, “yyyy/mm/dd hh:nn:ss”) & vbCrLf & _
String(40, “-“) & vbCrLf & vbCrLf
‘ カウンターの初期化
foundCount = 0
‘ 3. 元の文書のすべての段落を先頭から順番にチェック(高速処理の肝)
For Each para In docSource.Paragraphs
‘ 段落の中に「太字(Bold)」または「赤字(Red)」が含まれているか判定
‘ ※ Word VBAでは、書式が混在している場合、BoldやColorプロジェティは「9999(wdUndefined)」を返すことがあります。
‘ そのため、今回は「段落内の最初の文字」または「段落全体」のプロパティを安全に評価します。
If IsEmphasis(para) Then
‘ 抽出対象が見つかった場合、テキストの前後の余分な改行を取り除いて取得
targetText = CleanParagraphText(para.Range.Text)
If Len(targetText) > 0 Then
foundCount = foundCount + 1
‘ 新しい文書の末尾に、抽出した段落を追加していく
docNew.Content.InsertAfter foundCount & “. ” & targetText & vbCrLf & vbCrLf
End If
End If
Next para
‘ 4. 完了メッセージの表示
If foundCount > 0 Then
MsgBox “抽出が完了しました!” & vbCrLf & _
“合計 ” & foundCount & ” 件の強調箇所を新しい文書にまとめました。”, vbInformation, “処理成功”
Else
docNew.Close SaveChanges:=wdDoNotSaveChanges ‘ ヒットしなかったら新規文書を閉じる
MsgBox “条件に合致する太字・赤字の段落は見つかりませんでした。”, vbExclamation, “お知らせ”
End
End Sub
‘ —————————————————————–
‘ 補助関数1:段落が「強調(太字または赤字)」されているかを判定するロジック
‘ —————————————————————–
Function IsEmphasis(p As Paragraph) As Boolean
Dim rng As Range
Set rng = p.Range
‘ 改行コードのみの空段落は無視する
If rng.Characters.Count <= 1 Then
IsEmphasis = False
Exit Function
End If
' 条件A:段落全体の文字が太字に設定されているか?
' (※一部だけ太字の場合も考慮して、Range全体のBoldプロパティをチェック)
If rng.Bold = True Or rng.Bold = 9999 Then
IsEmphasis = True
Exit Function
End If
' 条件B:段落の中に「赤字(RGB: Red)」の文字が含まれているか?
' ※Font.Colorが赤(wdColorRed または RGB(255,0,0)付近)であるかをチェック
' 簡易的に、Range自体の文字色が赤色系統であるかを判定します
If rng.Font.Color = wdColorRed Or rng.Font.ColorIndex = wdRed Then
IsEmphasis = True
Exit Function
End If
' どちらにも当てはまらない場合
IsEmphasis = False
End Function
' -----------------------------------------------------------------
' 補助関数2:段落末尾の不要な改行やタブ記号を綺麗に掃除する関数
' -----------------------------------------------------------------
Function CleanParagraphText(rawText As String) As String
Dim cleaned As String
cleaned = rawText
' Wordの段落末尾には必ず特殊文字(vbCr または vbCrLf)が含まれるためこれを置換
cleaned = Replace(cleaned, vbCr, "")
cleaned = Replace(cleaned, vbLf, "")
cleaned = Replace(cleaned, vbTab, " ")
CleanParagraphText = Trim(cleaned)
End Function
---
4. コードのここがポイント!プロの設計思想
このコードをただの「動くコード」で終わらせず、ワンランク上のエンジニアの視点で解説しよう。
① `For Each para In docSource.Paragraphs` の美しさ
マクロの記録を使うと、余計な選択(SelectやSelection)が大量に生成され、画面がバキバキと点滅しながら遅い処理になりがちだ。
しかし、今回のコードでは `Selection` を一切使っていない。メモリ上でオブジェクト(`Paragraph`)を直接高速に巡回(イテレート)しているため、何百ページある分厚い文書であっても一瞬で処理が終わる。これがプロの書き方だ。
② Word特有の「あいまいさ」への対策(`9999` の正体)
Wordの段落内には、「冒頭だけ太字で、途中から普通の文字」という混在ケースが存在する。VBAで `para.Range.Bold` を調べたとき、これが混在していると、VBAは定数 `9999`(wdUndefined:未定義) を返す。
今回の判定関数(`IsEmphasis`)では、この「混在している状態(9999)」もしっかりと「強調が含まれている」とみなすように設計している。ここを見落とすと、「一部だけ太字の段落がスルーされてしまう」という現場でありがちなバグを踏むことになるんだ。
—
5. 陥りやすいエラーと対策
1. 「実行時エラー ‘424’: オブジェクトが必要です」が出る
- 原因: 変数の定義漏れや、`Set` キーワードの付け忘れ。
- 対策: モジュールの最上行(`Option Explicit`の下)に `Dim` で正しく変数が宣言されているか確認しよう。
2. 赤字判定がうまくヒットしない
- 原因: フォントの色が「テーマの色(アクセントカラーなど)」で赤っぽく設定されている場合、VBAからは純粋な `wdColorRed` として認識されないことがある。
- 対策: 必要に応じて `rng.Font.Color` の数値(RGB値)を直接デバッグプリント(`Debug.Print`)して、文書内で使われている正確な色コードを調査すると完璧だ。
—
まとめ:ここをクリアすればWord VBAは怖くない!
お疲れ様!ここまでコードの意味と背景を理解できたなら、君はもう「マクロの記録をポチポチ押すだけの人」ではない。立派なWord自動化エンジニアの扉を叩いている。
文書からデータを「読み取り」、加工して「別の文書にアウトプットする」という一連の流れは、ExcelだけでなくWordを自動化する上での黄金パターンだ。
このベースのコードを応用すれば、「特定のキーワードが含まれる段落だけを抽出する」「見出しスタイル(Heading 1など)ごとに目次を自動生成する」といった、さらなる高度な業務効率化へと発展させることができる。
日々の面倒なコピペ作業はVBAにすべて任せて、君はもっとクリエイティブで人間にしかできない仕事に時間を使おう。応援しているよ!
