やあ、Wordの自動化の世界へようこそ。
「マクロの記録」ボタンを押すだけの世界から一歩踏み出し、自分の指先でWordを自在に操る楽しさを知ろうとしている君を、私は心から歓迎するよ。
今日は、Word VBAの登竜門にして、実務で最も頻繁に必要となる「文書内の特定のスタイルをカウントする」という作業をテーマに解説しよう。
ただコードを写すだけじゃない。なぜそう動くのか、メモリの中で何が起きているのか。その「本質」を理解すれば、君はもう初心者じゃない。一歩先のエンジニアとしての視点を授けよう。
—
1. なぜ「スタイル」を操作するのか?
Word文書において、段落(Paragraph)は単なる文字の塊ではない。それは「スタイル」という設計図によって制御されている。
見出し、本文、引用…。これらを一つずつ目で数えるのは時間の無駄だ。VBAを使えば、数千ページの文書でも一瞬で解析できる。これが自動化の第一歩だ。
2. 実践:スタイルカウント・ツール
まずは、以下のコードを標準モジュールにコピーして動かしてみよう。
Sub CountSpecificStyle()
‘ 変数の宣言:メモリを効率的に使うための第一歩
Dim doc As Document
Dim para As Paragraph
Dim targetStyleName As String
Dim count As Long
‘ 集計したいスタイル名を指定(正確に入力すること!)
targetStyleName = “見出し 1”
Set doc = ActiveDocument
count = 0
‘ 文書内の全段落をループしてチェック
‘ For Each は「全部なめる」ための最も安全で速い構文だ
For Each para In doc.Paragraphs
‘ 段落のスタイル名がターゲットと一致するか判定
If para.Style = targetStyleName Then
count = count + 1
End If
Next para
‘ 結果をイミディエイトウィンドウに出力(Ctrl + G で確認)
Debug.Print “【解析完了】”
Debug.Print “スタイル「” & targetStyleName & “」の出現回数: ” & count & “箇所”
End Sub
このコードの「本質」を解説する
- `Dim`(ディム)による宣言: 変数に名前と「型」を与えているね。`Long`型は整数を扱う型だ。メモリを最適化する上で、適した型を選ぶことはプロの作法だよ。
- `For Each` ループ: `For i = 1 to 10` のような数え方よりも、`For Each` を使うほうがWordのオブジェクト構造には適している。Wordが内部で持っているリストを先頭から順番に読み取っていく、非常に効率的な書き方なんだ。
- `Debug.Print`: 画面にメッセージボックスを出すのはうっとうしい時がある。`イミディエイトウィンドウ`に出力するのは、エンジニアがデバッグ(修正)をする際の基本中の基本だ。
—
3. 初心者が陥る「3つの罠」
コードを書くとき、君を悩ませるエラーがいくつかある。あらかじめ知っておけば怖くないよ。
① スタイル名の不一致
Wordのスタイル名には「見出し 1」のようにスペースが含まれることがある。全角・半角のミスや、余計なスペースがあると判定されない。「正確に」入力すること。
② 文書内の「見えない段落」
Wordの段落は、改行記号の数だけ存在する。表の中の段落や、テキストボックス内の段落は、通常の `ActiveDocument.Paragraphs` ではカウントできないことがある。もし「あれ、数が合わない?」と思ったら、それは文書の構造が複雑な証拠だよ。
③ オブジェクトの解放
今回は短いコードだから大丈夫だが、大きなオブジェクトを操作した後は `Set doc = Nothing` と書く癖をつけておくと、メモリリーク(PCが重くなる原因)を防げる。意識高い系エンジニアへの第一歩だ。
—
4. さあ、次のステージへ
このコードを理解できたら、君はもう「文書全体を制御するコマンド」を手に入れたことになる。
次は、これを応用して「見出し1の段落を赤色にする」「特定のスタイルが含まれる箇所に自動で目次を入れる」といった拡張ができるようになるはずだ。
VBAは、君が抱えている「面倒な作業」を「秒速で終わる快感」に変える魔法の杖だ。
もし詰まったら、いつでも聞きに来てほしい。エンジニアとして、君の成長を全力でサポートするよ。
さあ、エディタを開いて、自分の手で自動化を体感してみよう!
