〖ExcelVBA〗画像をセルに自動配置するマクロ|サイズ調整・中央配置を完全自動化

ExcelVBA

Excel に画像を貼り付けると、大きすぎたり位置がズレたりして整えるのが大変… という経験はありませんか? 特に、名簿の写真・商品画像・検査画像などをセルに合わせて貼りたい場合、手作業ではとても面倒です。

そこで今回は、ExcelVBA で画像をセルに自動配置するマクロ をご紹介します。

  • セルにぴったり収まるように縮小
  • 縦横比を保ったまま調整
  • セルの中央にきれいに配置
  • 複数画像をまとめて自動貼付

スポンサーリンク
スポンサーリンク

画像データの置き場所について

今回はCドライブ直下に「Images」というフォルダに画像データを保存しており、このフォルダを指定するようにコードを作成しております。
任意のフォルダを指定したい場合はコードを変更してください。

※コードを変更することにより、任意のフォルダを指定できます。

今回のシート構成(シート名:画像貼付)

次のように、画像を貼りたいファイル名をセルを A 列に入力します。
シート名は「画像貼付」としてください。

画像は、フォルダ内に格納された JPG / PNG / GIF などに対応しています。


画像をセルにきれいに自動配置するマクロ(コピペOK)

以下のコードを 標準モジュール に貼り付けて使います。

Option Explicit

Sub InsertImagesToCells()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim imgPath As String
    Dim folderPath As String
    Dim i As Long
    Dim pic As Picture
    Dim cell As Range
    Dim ratio As Double

    ' ★画像フォルダのパス(必要に応じて変更)
    folderPath = "C:\Images\"   ' ←最後の \ を忘れない

    Set ws = Worksheets("画像貼付")   ' シート名は変更可能
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' ★サムネイルとして表示したいサイズ(ポイント単位)
    '   数字を大きくすると画像も大きくなります
    Const ThumbWidth As Double = 200
    Const ThumbHeight As Double = 200

    For i = 2 To lastRow

        imgPath = folderPath & ws.Cells(i, 1).Value
        Set cell = ws.Cells(i, 2)

        If Dir(imgPath) <> "" Then

            ' 既存の画像があれば削除(同じセルに何度も貼らないように)
            DeletePicturesInCell cell

            ' 画像を挿入
            Set pic = ws.Pictures.Insert(imgPath)

            ' ★縦横比を保ったまま「サムネイルサイズ」に合わせて縮小
            ratio = Application.Min(ThumbWidth / pic.Width, ThumbHeight / pic.Height)

            ' 必要なら、あまりに小さくなり過ぎないように下限を決めてもOK
            ' If ratio > 1 Then ratio = 1   ' 拡大はしたくない場合
            pic.Width = pic.Width * ratio
            pic.Height = pic.Height * ratio

            ' ★セルより画像の方が大きい場合は、セルも少し広げてあげる(お好み)
            If cell.Width < pic.Width Then
                cell.ColumnWidth = cell.ColumnWidth * (pic.Width / cell.Width)
            End If

            If cell.RowHeight < pic.Height Then
                cell.RowHeight = pic.Height + 4
            End If

            ' セルの中央に配置
            pic.Left = cell.Left + (cell.Width - pic.Width) / 2
            pic.Top = cell.Top + (cell.Height - pic.Height) / 2

        Else
            ws.Cells(i, 2).Value = "画像なし"
        End If

    Next i

    MsgBox "画像の貼り付けが完了しました!", vbInformation

End Sub

' 指定セルの範囲内にある画像だけ削除する(貼り直し用)
Private Sub DeletePicturesInCell(ByVal targetCell As Range)

    Dim shp As Shape
    Dim ws As Worksheet
    Set ws = targetCell.Worksheet

    For Each shp In ws.Shapes
        If shp.Type = msoPicture Then
            If shp.Top >= targetCell.Top _
               And shp.Top < targetCell.Offset(1, 0).Top _
               And shp.Left >= targetCell.Left _
               And shp.Left < targetCell.Offset(0, 1).Left Then
                shp.Delete
            End If
        End If
    Next shp

End Sub

コード解説(初心者向け)

① セルではなく「サムネイルサイズ」を基準に縮小

画像をセルに合わせるのではなく、 見やすい固定サイズ(200×200)で画像を整えるため、 小さくなりすぎる問題がなくなります。

② セルの側を画像に合わせて適度に拡張

cell.ColumnWidth = cell.ColumnWidth * (pic.Width / cell.Width)

画像のほうが大きい場合は、セル幅・行高さを自動調整します。

③ 画像をセル中央に配置してきれいに整列

pic.Left = cell.Left + (cell.Width - pic.Width) / 2

応用:もっと大きく表示したい場合

以下の数値を変えるだけで、画像サイズを自由に調整できます。

Const ThumbWidth As Double = 150
Const ThumbHeight As Double = 150

まとめ:画像一覧の作成が驚くほど簡単に

今回のマクロを使えば、

  • 画像の縮小サイズが極端に小さくなる問題が解決
  • 見やすいサムネイルサイズで一覧化できる
  • セルにきれいに中央配置される
  • たくさんの画像でも一括処理できる

写真付き名簿、商品カタログ、検査画像一覧など、幅広い用途に活用できます。 カスタマイズ版(枠線追加・セル自動拡大など)も作成できますので、お気軽にご相談ください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

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