こんにちは! Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身はチンプンカンプン…」という状態から一歩抜け出し、自分の手で文書を自在に操りたい中級者のあなたへ。
今回は、実務で本当によくある「あのイライラする現象」をスマートに解決する技術をお伝えします。
ここをクリアすれば、Wordの段落構造やオブジェクトの扱い方がグッと身近になり、VBAの基本はバッチリと言えるようになりますよ。さあ、一緒に扉を開けましょう!
—
現場で頻発する悲劇:画像と行間トラブルの正体
Wordで報告書やマニュアルを作っていて、こんな絶望感を味わったことはありませんか?
- 「きれいに画像を挿入したはずなのに、上下の行と重なって見切れてしまう……」
- 「原因を調べたら、段落の行間が『固定値』になっていて、大きな画像が収まりきっていなかった」
- 「かといって、数十枚ある画像の段落を一つずつマウスで選択して直すなんて、発狂しそう……!」
Wordのデフォルトでは、段落の行間が「1行」や「固定値」に設定されていると、そこに挿入された画像(インライン図形)の高さに関わらず、文字サイズ基準の狭い空間に閉じ込めようとしてしまいます。結果、画像の上部や下部がプツッと切り取られてしまうのです。
「じゃあ、画像がある段落だけ、行間を『自動(または十分な広さ)』に一発で書き換えるマクロを作ろう!」
これが今回のミッションです。世界をちょっと便利にするコードを、一緒に組み立てていきましょう。
—
Word VBAの心臓部:「段落」と「インライン図形」の関係を理解する
コードを書く前に、Wordの内部構造(オブジェクトモデル)を少しだけ覗いてみましょう。ここが本質です。
Wordの文書(Document)の中には、段落(Paragraphs)が並んでいます。
そして、段落の中には「文字」だけでなく、「画像(InlineShape)」が含まれていることがあります。
中級者へのステップアップとして、以下の構造を頭に焼き付けてください。
1. 文書内のすべての段落を上から順に見ていく(ループ処理)
2. 「この段落の中に、画像は入っているか?」をチェックする
3. もし入っていたら、その画像の高さを取得する
4. 段落の行間を、画像の高さに合わせて「広がれ!」と命令する
これだけです。言葉にするとシンプルですよね。これをVBAの言葉に翻訳していきます。
—
【実戦】画像サイズに連動して行間を自動拡張するマクロ
それでは、開発の現場でそのままコピペして使える実用コードを公開します。VBE(Visual Basic Editor)を開き、標準モジュールに貼り付けて実行してみてください。
Sub AutoFitImageParagraphs()
Dim rngDoc As Document
Set rngDoc = ActiveDocument
Dim para As Paragraph
Dim ils As InlineShape
Dim targetHeight As Single
Dim countModified As Long
countModified = 0
‘ 画面のちらつきを抑えて処理速度を爆上げするお呪い
Application.ScreenUpdating = False
‘ 文書内のすべての段落をひとつずつ巡回
For Each para In rngDoc.Paragraphs
‘ 「もし、この段落の中にインライン図形(画像)が1つ以上あったら」
If para.Range.InlineShapes.Count > 0 Then
‘ 段落内にある最初の画像を取得
Set ils = para.Range.InlineShapes(1)
‘ 画像の高さを取得(単位はポイント:1ポイント = 約0.35mm)
targetHeight = ils.Height
‘ 【重要】Wordの行間設定を「倍率/固定値」から「最小値」に変更し、
‘ 画像の高さ(ポイント単位)を行間として強制指定する
With para
.LineSpacingRule = wdLineSpaceMultiple ‘ または wdLineSpaceAtLeast
‘ 確実に画像が収まるよう、少し余裕(例: +10ポイント)を持たせるのがプロの技
.LineSpacing = targetHeight + 10
End With
countModified = countModified + 1
End If
Next para
‘ 画面描画を復活
Application.ScreenUpdating = True
‘ 完了メッセージ
MsgBox “処理が完了しました!” & vbCrLf & _
“調整した段落数: ” & countModified & ” 箇所”, vbInformation, “自動整形完了”
End Sub
—
コードの注目ポイントと「知っておくべき罠」
先輩エンジニアとして、このコードのキモと、初心者が陥りがちな「罠」について解説しておきますね。
1. 画面のちらつき防止(`ScreenUpdating = False`)
ページ数が多い文書でこれをやると、画面が猛烈な勢いでスクロールして処理が遅くなります。処理の最初に `False` にし、最後に `True` に戻す。これは実務マクロの絶対的な鉄則です。
2. なぜ「余白(+10ポイント)」を入れているのか?
コード内で `targetHeight + 10` としている部分があります。
実は、画像の高さピッタリに行間を設定すると、画像と上下の文章がピタッとくっついてしまい、見た目が非常に窮屈になります。少しの「遊び(余白)」を持たせることで、プロが作ったような美しいレイアウトに仕上がるのです。こういう気配りがエンジニアの価値を決めます。
3. 【陥りやすいエラー】「浮動オブジェクト(Shape)」との違い
今回のコードで対象にしているのは、文字と同じ行に配置される「インライン図形(InlineShape)」です。
もし、文書のレイアウトで画像を「前面」や「背面」、あるいは「四角」などで自由に配置している場合、それは「図形(Shape)」という別のオブジェクト扱いになります。Shapeは段落の中に所属していないため、上記のコードでは検知できません。
「画像が検知されない!」というときは、大半がこのインライン図形と通常図形の混同が原因です。まずはシンプルなインライン図形から攻略していきましょう。
—
ここをクリアすれば、Word VBAは怖くない!
お疲れ様でした!
「段落をループする」「中にあるオブジェクトを判定する」「プロパティを書き換える」というWord VBAの王道パターンを、今回のコードで一通り体験できました。
最初は難しく感じたオブジェクトの階層構造も、文書 > 段落 > 画像、という親子関係さえ見えてしまえば、もう迷うことはありません。
このマクロをベースに、「表(Table)の高さに合わせて行の高さを変える」など、あなたの業務に合わせた応用へどんどん広げていってください。あなたの自動化ライフが、ここからさらに加速することを応援しています!
