報告書やマニュアルに貼った画像のサイズがバラバラで、1 枚ずつ手作業で揃えていませんか。Word VBA を使えば、本文中の行内画像を指定した幅に一括変更できます。
この記事では、縦横比を維持したまま画像の幅を揃えるマクロをコピペ用に掲載します。cm 単位での指定方法やパーセントでの縮小、元のサイズに戻す方法、動かないときの原因と対処も紹介します。
完成イメージ
画像の幅がバラバラな文書にマクロを実行すると、本文中の行内画像が指定幅(ここでは 10cm)に揃います。縦横比は自動で維持されるため、画像が歪むことはありません。
実行前

画像ごとに幅が異なり、ページ全体の見た目が不揃いです。
実行後

行内画像がすべて同じ幅に揃い、文書全体がきれいに整いました。
マクロの全文(コピペ用)
以下のコードをコピーして、次のセクションの手順で実行してください。
Sub ResizeAllImages()
Dim shp As InlineShape
Dim targetWidth As Single
targetWidth = CentimetersToPoints(10) '← 幅を cm で指定
For Each shp In ActiveDocument.InlineShapes
If shp.Type = wdInlineShapePicture Or _
shp.Type = wdInlineShapeLinkedPicture Then
shp.LockAspectRatio = msoTrue
shp.Width = targetWidth
End If
Next shp
End SubCentimetersToPoints(10) の 10 がリサイズ後の幅です。cm 単位で指定できます。A4 用紙の標準余白(左右各 2.5cm)では本文領域が約 16cm なので、10〜15cm 程度が実用的です。幅を変えたいときはこの数値だけを書き換えてください。
このマクロは ActiveDocument.InlineShapes(本文中の行内画像)を処理します。テキストの折り返しが「行内」に設定されている画像が対象です。浮動配置やヘッダー/フッター内の画像については、この記事の後半で対処法を説明します。
マクロの使い方
Word で VBA マクロを実行する手順は次のとおりです。
手順
- 画像を含む Word ファイルを開く
- Alt + F11 キーを押して VBE(Visual Basic Editor)を開く
- メニューの「挿入」→「標準モジュール」をクリック
- 表示されたコードウィンドウに、上のコードを貼り付ける
CentimetersToPoints(10)の数値を目的の幅(cm)に変更する- F5 キーを押す、またはメニューの「実行」→「Sub/ユーザーフォームの実行」をクリック

「標準モジュール」の中に Module1 が追加され、そこにコードを貼り付けます。左側のプロジェクトツリーで Module1 が選択されていることを確認してから実行してください。
結果が意図と違った場合は、Ctrl + Z(元に戻す)で実行前の状態に戻せます。
コードの解説
| コード | 意味 |
|---|---|
Dim shp As InlineShape | 行内配置の画像を 1 枚ずつ処理する変数 |
CentimetersToPoints(10) | cm をポイント(pt)に変換する関数。Word 内部ではサイズをすべて pt で管理している |
wdInlineShapePicture | 文書に埋め込まれた画像(Type = 3) |
wdInlineShapeLinkedPicture | 外部ファイルにリンクされた画像(Type = 4)。Or で両方を対象にしている |
shp.LockAspectRatio = msoTrue | 縦横比をロックする。必ず Width の変更より前に書く |
shp.Width = targetWidth | 幅を指定値に変更する。LockAspectRatio が有効なら高さは自動で計算される |
LockAspectRatio は Width より先に書く
このコードで最も注意すべき点は、LockAspectRatio = msoTrue を Width の変更より前に書くことです。
順序を逆にすると、幅だけが変更されて高さが元のまま残り、画像が歪みます。
' NG:Width を先に変更してからロック shp.Width = targetWidth shp.LockAspectRatio = msoTrue ' この時点では高さは変わらない
' OK:先にロックしてから Width を変更 shp.LockAspectRatio = msoTrue shp.Width = targetWidth ' 高さが自動で計算される
下の画像は、順序を間違えた場合の結果です。幅は揃っていますが、高さが元のまま残っているため画像の比率が崩れています。

幅ではなくパーセントで縮小したい場合
すべての画像を同じ幅に揃えるのではなく、各画像を元のサイズから一定の比率で縮小したいときは ScaleWidth と ScaleHeight を使います。
Sub ScaleAllImages()
Dim shp As InlineShape
For Each shp In ActiveDocument.InlineShapes
If shp.Type = wdInlineShapePicture Or _
shp.Type = wdInlineShapeLinkedPicture Then
shp.ScaleWidth = 50 '元のサイズの 50% に縮小
shp.ScaleHeight = 50
End If
Next shp
End SubScaleWidth と ScaleHeight には、元のサイズに対するパーセンテージを指定します。50 なら半分、75 なら 75% のサイズになります。
この方法では画像ごとの元サイズを基準にするため、全画像が同じ幅にはなりません。大きい画像は大きいまま、小さい画像は小さいまま、全体的に縮小されます。
画像を元のサイズに戻したい場合
マクロや手作業でサイズを変更した画像を、挿入時の元のサイズに戻すには、スケールを 100% にリセットします。
Sub ResetAllImages()
Dim shp As InlineShape
For Each shp In ActiveDocument.InlineShapes
If shp.Type = wdInlineShapePicture Or _
shp.Type = wdInlineShapeLinkedPicture Then
shp.ScaleWidth = 100
shp.ScaleHeight = 100
End If
Next shp
End Sub元の画像サイズが用紙幅より大きい場合、リセット後に画像が余白をはみ出すことがあります。その場合はメインのマクロで適切な幅を指定し直してください。
うまく動かないときの確認ポイント
一部の画像だけサイズが変わらない ― 折り返し設定を確認
Word には画像の配置方法が 2 種類あり、マクロが操作するコレクションが異なります。
- 行内(InlineShape)― テキストの行の中に配置される。上のマクロはこの形式を処理する
- 浮動配置(Shape)― 「四角形」「前面」「背面」など、テキストの折り返しが設定されている画像。
ActiveDocument.Shapesという別のコレクションに入る
変わらない画像を右クリックして「文字列の折り返し」を確認してください。「行内」以外が設定されている場合は、以下のように Shapes コレクションも処理するコードを使います。
Sub ResizeIncludingFloating()
Dim iShp As InlineShape
Dim fShp As Shape
Dim targetWidth As Single
targetWidth = CentimetersToPoints(10)
'行内の画像(埋め込み+リンク)
For Each iShp In ActiveDocument.InlineShapes
If iShp.Type = wdInlineShapePicture Or _
iShp.Type = wdInlineShapeLinkedPicture Then
iShp.LockAspectRatio = msoTrue
iShp.Width = targetWidth
End If
Next iShp
'浮動配置の画像(埋め込み+リンク)
For Each fShp In ActiveDocument.Shapes
If fShp.Type = msoPicture Or _
fShp.Type = msoLinkedPicture Then
fShp.LockAspectRatio = msoTrue
fShp.Width = targetWidth
End If
Next fShp
End Sub浮動配置の画像に縦長のものがある場合、幅を広げると高さが極端に大きくなることがあります。実行後は文書全体をスクロールして結果を目視確認してください。
ヘッダーやフッターの画像が変わらない
ActiveDocument.InlineShapes は本文(メインストーリー)の画像だけを返します。ヘッダーやフッターに挿入した画像は別のストーリーとして管理されるため、上のマクロでは処理されません。
ヘッダー/フッターの画像を変更する必要がある場合は、手動でサイズを調整するか、Section.Headers / Section.Footers の Range.InlineShapes を個別に処理するコードを書く必要があります。
画像の比率が崩れている
コード内で LockAspectRatio = msoTrue を Width の変更より前に書いているか確認してください。順序が逆だと、幅だけが変わって高さは元のまま残るため画像が歪みます。詳しくはこの記事の「コードの解説」を参照してください。
実行前に戻したい
マクロ実行直後であれば、Ctrl + Z で元のサイズに戻せます。Word はマクロによる変更も通常の操作と同じように「元に戻す」の履歴に記録します。
まとめ
ActiveDocument.InlineShapesをループしてWidthを指定すれば、本文中の行内画像の幅を一括で揃えられる- cm で指定するには
CentimetersToPoints()を使う LockAspectRatio = msoTrueは必ず Width の変更より前に書く。順序を間違えると画像が歪む- パーセントで縮小するには
ScaleWidth/ScaleHeightを使う - 折り返しが「行内」以外の画像は
Shapesコレクションを別途処理する - ヘッダー/フッター内の画像は別ストーリーのため、別途処理が必要
- 実行後に Ctrl + Z で元に戻せる
コメント