VBAサンプル集
写真をサムネイルに変換して取り込む(Shapes.AddPicture)

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
公開日:2013-06-19 最終更新日:2020-06-11

写真をサムネイルに変換して取り込む(Shapes.AddPicture)


写真を取り込んだ場合、リンクすると元のファイルが無いと画像が見られず、
リンクせずに取り込むとファイルサイズが巨大化してしまいます。


そこで、サムネイルを作成しそれをセルに貼り付け、元のファイルへのハイパーリンクを付けておくようにします。

写真の取込方法の基本については以下をご覧ください。
写真の取込方法について(Pictures.Insert,Shapes.AddPicture)
・Pictures.Insertメソッド ・Shapes.AddPictureメソッド ・Shapesに関連する記事

写真をサムネイルに変換して取り込むVBA

Sub sample()
  Dim ws As Worksheet
  Dim FileName As Variant
  Dim sp As Shape
  Dim i As Long
  Dim j As Long
  Dim dblScal As Double
  
  FileName = Application.GetOpenFilename( _
    FileFilter:="画像ファイル,*.bmp;*.jpg;*.gif", _
    MultiSelect:=True)
  If Not IsArray(FileName) Then
    Exit Sub
  End If
  
  Application.ScreenUpdating = False
  Set ws = ActiveSheet
  
  'B列の画像を全て削除
  For Each sp In ws.Shapes
    If sp.TopLeftCell.Column = 2 Then
      sp.Delete
    End If
  Next
  
  j = 1
  For i = LBound(FileName) To UBound(FileName)
    'ファイル名にハイパーリンク
    ws.Hyperlinks.Add Anchor:=ws.Cells(j, 1), _
            Address:=FileName(i), _
            TextToDisplay:=FileName(i)
    '画像の取り込み
    With ws.Shapes.AddPicture( _
        FileName:=FileName(i), _
        LinkToFile:=False, _
        SaveWithDocument:=True, _
        Left:=Selection.Left, _
        Top:=Selection.Top, _
        Width:=0, _
        Height:=0)
      '一旦、元のサイズに戻す
      .ScaleHeight 1, msoTrue
      .ScaleWidth 1, msoTrue
      'サイズ調整、セル内に収める
      If ws.Cells(j, 2).Width / .Width < ws.Cells(j, 2).Height / .Height Then
        dblScal = WorksheetFunction.RoundDown(ws.Cells(j, 2).Width / .Width, 2)
      Else
        dblScal = WorksheetFunction.RoundDown(ws.Cells(j, 2).Height / .Height, 2)
      End If
      .Width = .Width * dblScal
      .Height = .Height * dblScal
      .Cut
    End With
    
    'サムネイルの作成
    ws.PasteSpecial Format:="図 (JPEG)", Link:=False, DisplayAsIcon:=False
    With ws.Shapes(ws.Shapes.Count)
      .Top = ws.Cells(j, 2).Top
      .Left = ws.Cells(j, 2).Left
      ws.Hyperlinks.Add Anchor:=ws.Shapes(ws.Shapes.Count), Address:=FileName(i)
    End With
    j = j + 1
  Next
  
  ws.Select
  ws.Range("A1").Activate
  Application.CutCopyMode = False
  Application.ScreenUpdating = True
End Sub

写真をサムネイルに変換して取り込むVBAの解説

A列に写真ファイルのフルパス、
B列に写真をハイパーリンク付きで入れています。

写真を取り込んだ後に、
切り取って(Cut)、
形式を選択して貼り付けて(PasteSpecial)
を行っています。

理屈としては、シート上で画像のサイズを縮小しただけでは解像度は変わりません。、
そこで、切り取り&貼り付けし直すことで、画像の解像度を落としています。

アクティブシート以外でも動作するようにしました。
ただし、最期の写真が選択状態のままになってしまうので、
指定シートに移動して、A1セルをSelectするようにしています。

Shapesに関連する記事

図形オートシェイプ(Shape)|VBA入門
・図形オートシェイプ(Shape)関連のオブジェクト群 ・図形オートシェイプ(Shape)の追加 ・図形オートシェイプ(Shape)の削除 ・図形オートシェイプ(Shape)の編集 ・図形オートシェイプ(Shape)の全選択 ・図形オートシェイプ(Shape)の扱い方を工夫する ・オートシェイプ(Shape)を扱う実践例 ・図形オートシェイプ(Shape)に関連する記事
写真の取込方法について(Pictures.Insert,Shapes.AddPicture)
・Pictures.Insertメソッド ・Shapes.AddPictureメソッド ・Shapesに関連する記事
オートシェイプを他ブックの同じ位置に貼り付ける(Shapes,DrawingObjects)
コメントでリクエストを頂きました。「1つのシートにバラバラにあるオートシェープを一度に選択して、コピーし、ほかのブックのあるシートの同じ位置にペーストしたい」というもの。これには色々な問題が含まれています。
図形オートシェイプ(Shape)の複数選択
・ワークシートの全てのShapeを選択する場合 ・ShapeオブジェクトのSelectメソッド ・ShapeRangeオブジェクト ・シート内の指定名称の図形を選択
ShapesとDrawingObjectsの相違点と使い方
・Shapes コレクション ・DrawingObjects コレクション ・ShapesとDrawingObjectsの相違点 ・DrawingObjectsの便利な使い道 ・最後に ・図形オートシェイプ(Shape)に関連する記事



同じテーマ「マクロVBAサンプル集」の記事

図を確認しながら消していく(Shape)
オートシェイプを他ブックの同じ位置に貼り付ける(Shapes,DrawingObjects)
全シートの画面キャプチャを取得する(keybd_event)
写真の取込方法について(Pictures.Insert,Shapes.AddPicture)
写真をサムネイルに変換して取り込む(Shapes.AddPicture)
円グラフの色設定(Chart,SeriesCollection)
棒グラフ・折れ線グラフのサンプルマクロ
人口ピラミッドのグラフをマクロで作成
グラフで特定の横軸の色を変更し基準線を引くマクロ
グラフのデータ範囲を自動拡張するマクロ
画像のトリミング(PictureFormat,Crop)


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ