Amazonで商品を見るセール会場へ

Excel│セルに画像をぴったり合わせる方法

excel-fit-image-cell

画像をセルの中に収めるには、横幅だけでなく高さも比べて縮尺を決めます。

縦横比を維持する場合、画像とセルの比率が違えば余白ができます。

セルいっぱいに引き伸ばす方法とは区別します。

このページの例は、個人情報を含まない練習データで試せます。

練習ブック・CSV・コードをまとめたZIPをダウンロードして、元ファイルとは別のコピーで操作してください。

目次

まずは1枚を手動で合わせる

Windows版Excelの作業コピーに画像を挿入し、浮動画像として選択します。

「図の形式」で縦横比を固定したままサイズを調整し、セルの枠内に置きます。

Altキーを押しながら移動・サイズ変更する操作はセル境界に合わせる補助になりますが、画像の比率を変えずに枠全体を埋めることを保証するものではありません。

行や列を変えたときも画像を連動させるには、画像の書式設定にあるプロパティで「セルに合わせて移動やサイズ変更をする」を選びます。

行や列の比率が変わった後も余白と画像の比率を見直します。

セル内画像機能やExcel for the webでは、下の浮動画像用VBAは対象外です。

選択した画像だけを縦横比を保って合わせるVBA

元ブックを残し、マクロ対応の作業コピーを作ります。

Alt+F11でVBEを開き、標準モジュールへ次のコードを貼り付けます。

ZIPのFitSelectedPictures.basも同じ内容です。

Option Explicit

Public Sub PreviewFitSelectedPictures()
    FitPictures False
End Sub

Public Sub ApplyFitSelectedPictures()
    FitPictures True
End Sub

Private Sub FitPictures(ByVal applyChanges As Boolean)
    Dim selected As ShapeRange, pic As Shape, box As Range
    Dim factor As Double, newWidth As Double, newHeight As Double
    Dim changed As Long
    If TypeName(ActiveSheet) <> "Worksheet" Then Exit Sub
    If ActiveWorkbook.ReadOnly Or ActiveSheet.ProtectDrawingObjects Then
        MsgBox "Use an editable, unprotected COPY of this workbook."
        Exit Sub
    End If
    On Error Resume Next
    Set selected = Selection.ShapeRange
    On Error GoTo Failed
    If selected Is Nothing Then
        MsgBox "Select floating pictures first."
        Exit Sub
    End If
    ' Preflight every selected object before making any changes.
    For Each pic In selected
        If pic.Type <> msoPicture Then
            MsgBox "Select pictures only; groups, charts and buttons are excluded."
            Exit Sub
        End If
        Set box = pic.TopLeftCell.MergeArea
        If box.Width <= 0 Or box.Height <= 0 Or pic.Width <= 0 Or pic.Height <= 0 Then
            MsgBox "A picture or target cell has zero size. No changes made."
            Exit Sub
        End If
    Next pic
    If applyChanges Then
        If MsgBox("Resize selected pictures in this COPY?", vbYesNo) <> vbYes Then Exit Sub
    End If
    For Each pic In selected
        Set box = pic.TopLeftCell.MergeArea
        factor = WorksheetFunction.Min(box.Width / pic.Width, box.Height / pic.Height)
        newWidth = pic.Width * factor
        newHeight = pic.Height * factor
        Debug.Print pic.Name, box.Address, newWidth, newHeight
        If applyChanges Then
            pic.LockAspectRatio = msoTrue
            pic.Width = newWidth
            pic.Left = box.Left + (box.Width - pic.Width) / 2
            pic.Top = box.Top + (box.Height - pic.Height) / 2
            pic.Placement = xlMoveAndSize
            changed = changed + 1
        End If
    Next pic
    MsgBox "Finished. Pictures changed: " & changed & ". Preview is in the Immediate window."
    Exit Sub
Failed:
    MsgBox "Stopped: " & Err.Description & ". Changes so far: " & changed & _
           ". If needed, close this COPY without saving and start from your backup."
End Sub

先に画像の左上を対象セルの内側に置きます。

通常の浮動画像だけを選択し、PreviewFitSelectedPicturesを実行します。

画像は変更せず、イミディエイトウィンドウに対象名・セル番地・予定サイズを出力します。

対象を確認してからApplyFitSelectedPicturesを実行し、確認ダイアログでYesを選びます。

グループ・グラフ・ボタン・リンク画像が選択されていたら、変更前に停止します。

保護されたシートや読み取り専用ブックも対象外です。

対象セルが結合されている場合は、その結合範囲全体を枠として使います。

幅や高さがゼロのセルでは処理を止めます。

確認結果と切り分け

条件結果
200×100の画像/100×60の枠100×50になり、上下に5ずつ余白
100×200の画像/100×60の枠30×60になり、左右に35ずつ余白
選んでいない画像変更しない
画像とボタンを一緒に選択すべての変更前に停止
プレビューだけ実行位置・サイズを変更しない
別のセルに入った実行前の画像左上と表示されたセル番地を確認する

計算は「セル幅÷画像幅」と「セル高さ÷画像高さ」の小さいほうを縮尺にします。

小さい画像は拡大するため、解像度によってはぼやけます。

画像を切り取らず中央に置き、xlMoveAndSizeでセルへの追従を設定します。

戻し方と検証範囲

VBAの実行は通常の元に戻すを前提にできません。

途中でエラーになった場合は、一部の画像だけ変更されている可能性があります。

変更件数を確認し、必要なら作業コピーを保存せず閉じ、バックアップから作り直します。

今回確認したのは縮尺・余白の独立計算と、TopLeftCell、LockAspectRatio、Placementの公式仕様です。

ExcelのVBAとしてのコンパイル・実行と、行列変更後の追従は未検証です。

まず練習画像1枚で確認してください。

関連記事・旧実装の参考資料

関連記事は用途の違いを確認して参照してください。

練習用ZIPのデータと、記事中のセル番地・コードをそろえています。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

仕事効率化のおすすめ書籍

仕事用PCの選び方

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次