画像をセルの中に収めるには、横幅だけでなく高さも比べて縮尺を決めます。
縦横比を維持する場合、画像とセルの比率が違えば余白ができます。
セルいっぱいに引き伸ばす方法とは区別します。
このページの例は、個人情報を含まない練習データで試せます。
練習ブック・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のデータと、記事中のセル番地・コードをそろえています。



