はじめに
Excelのシートに画像を表示させるには、
ActiveSheet.Pictures.Insertを使う方法と、
ActiveSheet.Shapes.AddPictureを使う方法があります。
両者とも、シートオブジェクトから指定しなければいけません。
Shape全般にそうですが、画像を扱うときには、
Top 上の位置
Left 左の位置
Width 幅
Height 高さ
の4つの要素で扱います。
ActiveSheet.Pictures.Insertは、ファイル名だけ指定すれば読み込む事ができます。表示位置は、現在選択されているセルの位置になります。また、画像へのリンクを保存する設定になります。
ActiveSheet.Shapes.AddPictureの方は、Top,Left,Width,Heightなど細かく指定します。
Top はシート上部を 0 として、下に行くにしたがって値が増えていきます。
Left はシート左部分を 0 として、右に行くにしたがって値が増えていきます。
数値の単位ですが、単位の無い相対的なものとして捉えた方が良いかもしれません。
セルに合わせたい時は、Range(“B2”).Top などとすれば位置を合わせる事ができて便利です。
ファイルダイアログ
まず、準備としてファイル名を取得するための、ファイルダイアログを表示させるコードを示します。 キャンセルした場合は空白を返します。
Function getMyFileName() As String
Dim vfilename As Variant
vfilename = Application.GetOpenFilename
If vfilename = False Then
getMyFileName = ""
Exit Function
End If
getMyFileName = vfilename
End Function
以降、この関数を使って画像のパスとファイル名を取得する事にします。
画像を表示させる(Insert)
Pictures.Insertでは、オプションの設定なしにお手軽に画像の挿入が出来ます。貼り付け位置は現在選択されているセルの位置。画像はリンクが保存される設定になります。
Sub InsertPictureTest()
Dim str As String
'ファイル名を取得する
str = getMyFileName
If str = "" Then Exit Sub
'画像の挿入
ActiveSheet.Pictures.Insert str
'位置とサイズの調整
Dim sp As Shape
Set sp = ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
sp.Top = Range("B2").Top '高さの位置を指定
sp.Left = Range("B2").Left '左の位置を指定
sp.Width = Range("B2:E2").Width '幅を指定
End Sub
まず、ファイルダイアログを呼び出してファイル名を取得します。
空白なら終了します。
ActiveSheet.Pictures.Insert ファイル名
これだけでもシートに画像を表示させることが出来ます。
表示位置は、現在選択しているセルの位置で、原寸大で表示されます。
画像の位置とサイズ
ここでは変数で受け取って、その後、Top, Left, Width を変更しています。
今回は、B2セルのTop, Left を起点にしています。
Width(幅)に関しては、B2:E2 の幅に合わせています。
尚、標準では縦横比固定なので、Height(高さ)を指定しなくてOKです。
Width ではなく Height を基準にしたければ、Width をやめて Height を指定します。
もし両方書いた場合は、後から書いた方が適用されます。
今回は、セルの値を使いましたが、数値指定でもOKです。

結果は上のようになりました。B2セルを起点にして、B列~E列の幅で表示されています。高さに関しては、縦横比の関係から自動的に決まります。
画像はリンクが保存されますので、読み込んだファイルパスが移動してしまうと以下のようなエラー表示となってしまいます。

画像をリンク保存する場合、このようにファイルパスが狂うとエラーとなりますが、画像ファイルをExcel中に保存しないため、ファイルサイズが小さくて済みます。大量の画像ファイルを扱う場合にはリンク保存とする場合があります。
Pictures.Insertの例2
オブジェクト変数を使わない書き方もできます。内容は上のプログラムと全く同じです。
Sub InsertPictureTest2()
Dim str As String
str = getMyFileName
If str = "" Then Exit Sub
'画像の挿入
ActiveSheet.Pictures.Insert str
'位置とサイズの調整
With ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
.Top = Range("B2").Top '高さの位置を指定
.Left = Range("B2").Left '左の位置を指定
.Width = Range("B2:E2").Width '幅を指定
End With
End Sub
画像を表示させる(AddPicture)
Shapes.AddPictureの例を示します。
Sub AddPictureTest()
Dim str As String
str = getMyFileName
If str = "" Then Exit Sub
'画像の追加
ActiveSheet.Shapes.AddPicture _
Filename:=str, _
LinkToFile:=False, _
SaveWithDocument:=True, _
Left:=330, _
Top:=40, _
Width:=-1, _
Height:=-1
'位置とサイズの調整
With ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
.ScaleWidth 0.75, msoTrue
.ScaleHeight 0.75, msoTrue
End With
End Sub
冒頭のファイル名を取得する部分は同じです。
画像の追加部分の引数は、以下のようになります。
ActiveSheet.Shapes.AddPicture(Filename, LinkToFile, SaveWithDocument, Left, Top, Width, Height )
引数名 | 値 |
---|---|
Filename | 追加したい画像ファイル名 |
LinkToFile | 画像をリンク(True)にするか貼り付ける(False)か |
SaveWithDocument | 保存する(True)か、リンク保存する(False)か |
Left | 左の位置 |
Top | 上の位置 |
Width | 幅 |
Height | 高さ |
Width と Height を ‐1 にした場合は原寸大で読み込みます。
画像ファイルの保存とリンク保存
画像挿入する場合、Excelファイル内部に保存する場合と、リンク保存にする場合があります。
リンク保存にすると、画像のファイルパスが保存されるため、画像ファイルのパスが移動したり、削除されると正常に読み込めなくなりエラー表示が出ます。
Excel内部に保存する場合は、そのような事は起こりませんが、Excel自体のファイルサイズが大きくなってしまいます。大量の画像を扱うような場合は、リンク保存を使用する事が多いようです。
画像の位置とサイズ
画像の位置とサイズ以降は、前のコードと今回のコードで互いに使う事ができます。
スケールでのサイズ変更
画像のサイズのスケール比率で貼り付ける場合は、.ScaleWidth を使います。
第一引数は、1 を基準としたスケール比率。
第二引数は、原寸での比率(msoTrue)か、現在の大きさの比率(msoFalse)かを選択します。
第三引数は省略可能で、図形の拡縮時に位置を保持する図形の部分を指定します。
今回の例では、一旦原寸大で読み込んでから75% に縮小しています。
縦横比の固定と解除
LockAspectRatio を使うと、縦横比の固定(msoTrue)と、解除(msoFalse)ができます。例を示します。
Sub InsertPictureTest3()
Dim str As String
str = getMyFileName
If str = "" Then Exit Sub
'画像の挿入
ActiveSheet.Pictures.Insert str
'位置とサイズの調整
With ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
.Top = Range("B2").Top '高さの位置を指定
.Left = Range("B2").Left '左の位置を指定
.LockAspectRatio = msoFalse '縦横比を解除
.Width = Range("B2:E2").Width '幅を指定
.Height = Range("B2:E5").Height '高さを指定
End With
End Sub
結果は以下の通りです。縦横比が解除され、B2:E5セルの範囲に表示されています。

まとめ
シートに画像を表示させる2つ関数の使い方を紹介しました。
画像をどのように貼り付けたいかによって使い分ければ良いと思います。
尚、画像を読み込んでからの位置とサイズの変更は、
コード中のコメントの「‘位置とサイズの調整」以降を共通で使えますので試してみてください。
その他に、必要な部分のみ、切り抜く事もできますが、別ページにまとめたいと思います。
コメント