Article

【Word VBA】文書内の画像を一括でサイズ変更するマクロ

この記事で分かること

Word VBAで本文中の行内画像を一括でサイズ変更する方法。縦横比を維持したまま幅を揃えるマクロをコピペ用に掲載。cm指定やパーセント指定、浮動画像やヘッダー画像への対処も解説します。

報告書やマニュアルに貼った画像のサイズがバラバラで、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 Sub

CentimetersToPoints(10)10 がリサイズ後の幅です。cm 単位で指定できます。A4 用紙の標準余白(左右各 2.5cm)では本文領域が約 16cm なので、10〜15cm 程度が実用的です。幅を変えたいときはこの数値だけを書き換えてください。

このマクロは ActiveDocument.InlineShapes(本文中の行内画像)を処理します。テキストの折り返しが「行内」に設定されている画像が対象です。浮動配置やヘッダー/フッター内の画像については、この記事の後半で対処法を説明します。

マクロの使い方

Word で VBA マクロを実行する手順は次のとおりです。

手順

  1. 画像を含む Word ファイルを開く
  2. Alt + F11 キーを押して VBE(Visual Basic Editor)を開く
  3. メニューの「挿入」→「標準モジュール」をクリック
  4. 表示されたコードウィンドウに、上のコードを貼り付ける
  5. CentimetersToPoints(10) の数値を目的の幅(cm)に変更する
  6. F5 キーを押す、またはメニューの「実行」→「Sub/ユーザーフォームの実行」をクリック

VBEでマクロを貼り付けた画面

「標準モジュール」の中に 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 = msoTrueWidth の変更より前に書くことです。

順序を逆にすると、幅だけが変更されて高さが元のまま残り、画像が歪みます。

' NG:Width を先に変更してからロック
shp.Width = targetWidth
shp.LockAspectRatio = msoTrue    ' この時点では高さは変わらない
' OK:先にロックしてから Width を変更
shp.LockAspectRatio = msoTrue
shp.Width = targetWidth           ' 高さが自動で計算される

下の画像は、順序を間違えた場合の結果です。幅は揃っていますが、高さが元のまま残っているため画像の比率が崩れています。

LockAspectRatioの順序を間違えた結果:画像の縦横比が崩れている

幅ではなくパーセントで縮小したい場合

すべての画像を同じ幅に揃えるのではなく、各画像を元のサイズから一定の比率で縮小したいときは ScaleWidthScaleHeight を使います。

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 Sub

ScaleWidthScaleHeight には、元のサイズに対するパーセンテージを指定します。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.FootersRange.InlineShapes を個別に処理するコードを書く必要があります。

画像の比率が崩れている

コード内で LockAspectRatio = msoTrueWidth の変更より前に書いているか確認してください。順序が逆だと、幅だけが変わって高さは元のまま残るため画像が歪みます。詳しくはこの記事の「コードの解説」を参照してください。

実行前に戻したい

マクロ実行直後であれば、Ctrl + Z で元のサイズに戻せます。Word はマクロによる変更も通常の操作と同じように「元に戻す」の履歴に記録します。

まとめ

  • ActiveDocument.InlineShapes をループして Width を指定すれば、本文中の行内画像の幅を一括で揃えられる
  • cm で指定するには CentimetersToPoints() を使う
  • LockAspectRatio = msoTrue必ず Width の変更より前に書く。順序を間違えると画像が歪む
  • パーセントで縮小するには ScaleWidth / ScaleHeight を使う
  • 折り返しが「行内」以外の画像は Shapes コレクションを別途処理する
  • ヘッダー/フッター内の画像は別ストーリーのため、別途処理が必要
  • 実行後に Ctrl + Z で元に戻せる

コメント