シートに画像を表示させる

中級VBA

はじめに

 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つ関数の使い方を紹介しました。
 画像をどのように貼り付けたいかによって使い分ければ良いと思います。
 
 尚、画像を読み込んでからの位置とサイズの変更は、
 コード中のコメントの「‘位置とサイズの調整」以降を共通で使えますので試してみてください。

 その他に、必要な部分のみ、切り抜く事もできますが、別ページにまとめたいと思います。

コメント

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