【入門編】【上級者向け】Word表内の画像や図形を動的に配置・リサイズする高度なマクロ – Word VBA解析バイブル

スポンサーリンク

Word VBAで「完璧なカタログ」を自動生成する――画像配置とリサイズの極意

こんにちは。自動化の世界へようこそ。
「マクロの記録」ボタンを押して生成された、あの冗長で不安定なコードに別れを告げる時が来ました。

Wordでカタログや報告書を作る際、最も頭を悩ませるのが「セルの中に画像を美しく収める」という作業です。手作業でリサイズし、中央に寄せ、配置を整える……。そんな不毛な時間は今日で終わりにしましょう。

今日は、Word VBAの深淵に触れ、「表のセルサイズを基準に、画像を動的にリサイズして配置する」という、実務で最も差がつくテクニックを伝授します。

—

1. なぜ「マクロの記録」では限界があるのか?

まず、大前提を共有しましょう。Wordの「マクロの記録」は、あくまで「人間が行った操作をなぞる」機能に過ぎません。しかし、プロの自動化エンジニアが書くコードは「文書の構造(DOM)を操作する」ものです。

画像を配置する際、以下の3つの壁に直面します。
1. アンカーの制御: 画像がどの段落に紐づいているかを見失う。
2. 座標の不確定性: セルの幅と高さに対し、画像がはみ出したり、小さすぎたりする。
3. 描画のタイミング: 連続処理で画像が重なったり、レイアウトが崩壊する。

これらを解決するための「設計思考」をコードに落とし込みます。

—

2. 実践:セル内に画像を自動配置するコード

以下のコードは、指定した表のセルに画像パスを渡すと、「セルの大きさに合わせてアスペクト比を維持したまま、中央配置で収める」という処理を実行します。

Sub InsertImageIntoCell(targetCell As Cell, imagePath As String)
Dim shp As Shape
Dim cellWidth As Single, cellHeight As Single
Dim imgRatio As Single, cellRatio As Single

‘ 1. セルのサイズを取得(余白を考慮し少し小さめに計算)
cellWidth = targetCell.Width – 4
cellHeight = targetCell.Height – 4

‘ 2. 画像を挿入(Shapeオブジェクトとして配置)
Set shp = targetCell.Range.ShapeRange.AddPicture( _
FileName:=imagePath, LinkToFile:=False, SaveWithDocument:=True)

‘ 3. 画像のプロパティを制御するために「行内配置」を解除
shp.RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
shp.RelativeVerticalPosition = wdRelativeVerticalPositionPage

‘ 4. アスペクト比を維持しつつ、セルに収まるようにリサイズ
‘ 画像がセルより大きい場合のみ縮小するロジック
imgRatio = shp.Width / shp.Height
cellRatio = cellWidth / cellHeight

If imgRatio > cellRatio Then
shp.Width = cellWidth
Else
shp.Height = cellHeight
End If

‘ 5. 中央揃え(セルの中心座標を算出)
shp.Left = targetCell.Range.Information(wdCellLeft) + (cellWidth – shp.Width) / 2 + 2
shp.Top = targetCell.Range.Information(wdCellTop) + (cellHeight – shp.Height) / 2 + 2

End Sub

—

3. このコードを「使いこなす」ための3つの知見

① `Shape` か `InlineShape` か?

Wordには2種類の画像が存在します。

  • InlineShape: 文字の一部として扱われる画像。安定していますが、位置調整が自由ではありません。
  • Shape: 文書の上に浮いている画像。自由自在ですが、アンカー(紐づき先)の管理が必須です。

今回は「配置を精密に制御したい」ため、あえて`Shape`オブジェクトを使用しています。

② `Information(wdCellLeft)` の魔法

初心者が最も苦労するのが「セルの正確な位置」の取得です。`targetCell.Range.Information` を使うことで、文書全体を基準とした正確な座標を取得できます。これを知っているだけで、あなたのマクロは一気にプロレベルになります。

③ 余白(パディング)という概念

`targetCell.Width – 4` としているのは、セル内の余白を考慮しているからです。ここを調整することで、カタログの「余白の美学」を守ることができます。

—

4. 陥りやすいエラーとその回避策

  • エラー:オブジェクトが見つかりません
  • 原因: セルが結合されている、あるいは表自体が存在しない可能性があります。`If targetCell Is Nothing Then Exit Sub` のようなガード節を入れる癖をつけましょう。
  • エラー:実行時エラー 5
  • 原因: 指定した画像パスが間違っているか、ファイルがロックされています。`Dir(imagePath)` でファイルが存在するか事前にチェックするのが鉄則です。

—

最後に:自動化は「道具」ではなく「思考」である

Word VBAは、単に作業を短縮するためのツールではありません。あなたが「どう文書を構成したいか」を論理的に語るための言語です。

今日学んだ「セルのサイズを取得し、計算して画像を配置する」というロジックは、カタログ作成だけでなく、請求書のロゴ配置や、動的な帳票作成にも応用可能です。

まずは、このコードをあなたの手元のWordに貼り付け、適当な表を作って実行してみてください。画像がスッと中央に収まった瞬間、あなたのエンジニアとしての視界が少し広がるはずです。

もし分からないことがあれば、いつでも聞いてください。壁を越えるまで、私はここにいますから。

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