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に貼り付け、適当な表を作って実行してみてください。画像がスッと中央に収まった瞬間、あなたのエンジニアとしての視界が少し広がるはずです。
もし分からないことがあれば、いつでも聞いてください。壁を越えるまで、私はここにいますから。
