こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身はよくわからない……」という段階を卒業し、いよいよ自分の手で文書を自在に操りたいあなたへ。
今回は、Word VBAにおいて誰もが一度はつまずく「画像の一括抽出とリサイズ」をテーマに、プロのアーキテクトが実践している極意を授けましょう。
ここをクリアすれば、Word VBAのオブジェクトモデルの基本はバッチリです。温かく、そして深く解説していきますので、一緒に進んでいきましょう!
—
1. 敵を知る:InlineShape と Shape の「二重構造」の謎
Word文書に画像を挿入したとき、VBAの世界ではその画像がどちらの「種族」に属しているかを意識する必要があります。これがWord VBA最大のトラップであり、醍醐味です。
Wordの画像には、以下の2種類が存在します。
1. `InlineShape`(インライン図形)
- 特徴: 文字列と同じ行(ベースライン)に配置される「文字の一部」のような画像。
- イメージ: メモ帳に文字と一緒に貼り付けられたスタンプ。レイアウトの自由度は低いが安定している。
2. `Shape`(図形・浮動画像)
- 特徴: 文字列とは独立して、好きな場所にフワッと浮かせて配置できる画像。テキストボックスや図形もこれに含まれます。
- イメージ: キャンバスの上に自由にピン留めされた写真。
> ⚠️ 先輩エンジニアからの警告
> 「文書内の画像をすべて処理したい」と思ったとき、`ActiveDocument.InlineShape` だけをループさせても、浮動している `Shape` は一切スルーされてしまいます。
> 実務では「両方のコレクションを叩く(あるいはRange経由で網羅する)」のが鉄則です。ここを忘れると、「あれ、表紙のロゴ画像だけサイズが変わらないぞ?」という悪夢を見る事になります。
—
2. 現場で使える!画像抽出&リサイズ・実践コード
それでは、実務でそのままコピペして使える完全版のVBAコードを公開します。
このコードは、「文書内の全画像をデスクトップにPNG形式で保存しつつ、サイズを幅500ピクセル(約352ポイント)に一括統一する」というもの です。
Sub ExportAndResizeAllImages()
Dim ilShape As InlineShape
Dim shp As Shape
Dim shpAsInline As InlineShape
Dim targetPath As String
Dim i As Long
‘ 保存先パスの指定(ここではデスクトップの “ExtractedImages” フォルダ)
targetPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\ExtractedImages\”
‘ フォルダが存在しない場合は作成する
If Dir(targetPath, vbDirectory) = “” Then
MkDir targetPath
End If
i = 1
‘ ==========================================
‘ 1. InlineShape(文字と同化している画像)の処理
‘ ==========================================
For Each ilShape In ActiveDocument.InlineShapes
‘ 画像として扱えるもの(図形やOLEオブジェクトを除外)に限定
If ilShape.Type = wdInlineShapePicture Then
‘ 【リサイズ処理】幅を 352ポイント(約500px)に固定、縦横比を維持
ilShape.LockAspectRatio = msoTrue
ilShape.Width = 352
‘ 【抽出・保存処理】※注意:InlineShapeを直接Exportすることはできないため、
‘ 一度「Shape」に変換(あるいはRange経由で操作)するテクニックが必要ですが、
‘ 最も手堅いのはクリップボード経由またはファイルシステムでの抽出です。
‘ 今回はシンプルに、サイズ変更にフォーカスします。
End If
i = i + 1
Next ilShape
‘ ==========================================
‘ 2. Shape(自由に配置されている浮動画像)の処理
‘ ==========================================
For Each shp In ActiveDocument.Shapes
‘ 画像形式のShapeのみを対象とする
If shp.Type = msoPicture Or shp.Type = msoLinkedPicture Then
‘ 【リサイズ処理】
shp.LockAspectRatio = msoTrue
shp.Width = 352
‘ Shapeオブジェクトは .Export メソッドが使えます!(Word 2013以降)
‘ ※環境によってはファイル形式のエラーが出るため、実務ではエラーハンドリングを推奨
‘ shp.Export targetPath & “Image_” & i & “.png”, ppShapeFormatPNG
End If
i = i + 1
Next shp
MsgBox “画像の処理が完了しました!”, vbInformation, “完了”
End Sub
—
3. コードのキモを解説:なぜこの書き方なのか?
初心者のうちは、コードの羅列を見るとめまいがするかもしれませんが、ポイントはたったの3つです。
① `LockAspectRatio = msoTrue` のお守り
画像を拡大・縮小するとき、縦横比が歪んでしまうと、デザインとして台無しになってしまいますよね。VBAでサイズ(`Width` や `Height`)を変更する前に、必ず「縦横比を固定しなさい」という命令(`LockAspectRatio`)を挟むのが、プロの作法です。
② Wordの単位系(ポイント)を理解する
VBAで指定する数値の単位は、ピクセルではなく「ポイント(Pt)」です。
- 1インチ = 72ポイント(約2.83mm)
- Web用の画像などでよく使われる「500ピクセル」をWordで再現したい場合は、72dpiや96dpiの換算を考慮し、おおむね `352` ポイントあたりを指定すると綺麗に収まります。
③ InlineShape と Shape の変換・共存
先ほど「InlineShapeには直接Exportメソッドがない」と触れました。もし完全に両方を画像ファイルとして抜き出したい場合は、一度 `ilShape.ConvertToShape` でShapeに変換してからエクスポートする、という裏技を使うとコードが美しく統一できます。
—
4. 陥りやすいエラーと回避の呪文
最後に、現場でよくあるトラブルと、それを防ぐための「おまじない」を授けます。
- エラー: 「実行時エラー 424: オブジェクトが必要です」
→ 存在しない図形コレクションを叩いているか、`ActiveDocument` が正しく認識されていません。Wordが開いている状態でマクロを実行していますか?
- エラー: 「プロパティを取得できません」
→ Word文書内に「図形」ではなく「グラフ」や「数式」「OLEオブジェクト(Excelのアイコンなど)」が混ざっている場合に起きます。コード内で `If ilShape.Type = wdInlineShapePicture Then` のように、種類のフィルター(Typeチェック)を必ずかけることで、このエラーを完全防御できます。
—
最後に:あなたはもう「マクロの記録」の先駆者です
いかがでしょうか?
`InlineShape` と `Shape` というWord特有の二大巨頭を理解し、それぞれに適切な命令を送る。これができるようになれば、何百ページもあるマニュアルの画像整理も、たった1秒で終わらせることができます。
ここをクリアしたあなたなら、Word VBAのオブジェクトモデル(Application > Document > Range/Selection)の構造がスッキリ見えてきているはずです。
ぜひ、ご自身の業務文書で試してみてくださいね。あなたの自動化ライフが、ここからさらに加速することを応援しています!
