【入門編】Word文書内の全画像を抽出・リサイズする:InlineShapeとShapeの境界線を意識した画像管理術 – Word VBA解析バイブル

スポンサーリンク

こんにちは!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)の構造がスッキリ見えてきているはずです。

ぜひ、ご自身の業務文書で試してみてくださいね。あなたの自動化ライフが、ここからさらに加速することを応援しています!

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