VBAからGDI+を使う資料集
inet上の達人の方々から御教示いただいたコードを少しアレンジさせてもらっています(切り貼りとも言います)。
  1. ホーム
  2. Other
  3. XLの機能でサムネイル


エクセルの機能を用いてサムネイル画像を生成

エクセルの機能を用いて、縮小画像を作成し、ワークシートに貼り付けます。
縮小画像には元画像へのハイパーリンクを設定します。
ブラウザが立ち上がってしまうのが難ですが、一覧からコピーして、他のワークブックに移しても機能するのがメリットです。
初めてアドイン化してみました。マクロブックから、アクティブブックを操作するのを会得していれば、話は簡単です。
設定データなどをアドインファイルに属する非表示の(勝手に非表示になる)ワークシートに保存する事ができます。


'縮小率設定を求める
Private Sub setScale()
    Dim buf As Double
    
    buf = Application.InputBox(Prompt:="縮小倍率%を入力して下さい。", Type:=1)
    If buf <= 0 Then
      MsgBox "99~1の数値を入力して下さい"
      Exit Sub
    End If
    ThisWorkbook.Sheets(1).Range("A1").Value = buf
End Sub

'サムネイル作成&ハイパーリンク設定
Private Sub pasteThumbnail()
  Dim FSO As Object
  Dim fileList As Object
  Dim myfile As Object
  Dim i As Long, j As Long
  Dim targetFolder As String
  Dim tempSheet As Worksheet, currentSheet As Worksheet
  Dim myRatio As Double
  
  'Activesheetが空か判別
  If ActiveSheet.UsedRange.Cells.Count > 1 Then Exit Sub
  If Not IsEmpty(ActiveSheet.Range("A1")) Then Exit Sub
  On Error Resume Next
  targetFolder = myGetFolder
    If Err.Number <> 0 Then
    MsgBox "Error " & CStr(Err.Number) & ":" & Err.Description
    Exit Sub
  End If
  On Error GoTo 0
  If targetFolder = "" Then
    MsgBox "フォルダーを指定してください"
    Exit Sub
  End If
  With ThisWorkbook.Sheets(1).Range("A1")
    If (.Value = "") Or (.Value <= 0) Then Call setScale
    myRatio = .Value / 100
  End With
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Set currentSheet = ActiveSheet
  Set FSO = CreateObject("Scripting.FileSystemObject")
  With FSO.GetFolder(targetFolder)
    Set fileList = .Files
  End With
  i = 1: j = 1
  Set tempSheet = currentSheet.Parent.Sheets.Add
  For Each myfile In fileList
    If UCase(FSO.GetExtensionName(myfile.Path)) = "JPG" Then
      tempSheet.Activate
      tempSheet.Pictures.Insert(myfile.Path).Select
      Selection.ShapeRange.LockAspectRatio = msoTrue
      'このへんのサイズ、縮小率はお好みで
'      If Selection.ShapeRange.Height > Selection.ShapeRange.Width Then
'        Selection.ShapeRange.Height = 40
'        Selection.ShapeRange.Width = 30
'      Else
'        Selection.ShapeRange.Height = 30
'        Selection.ShapeRange.Width = 40
'      End If
       Selection.ShapeRange.ScaleWidth myRatio, msoFalse, msoScaleFromTopLeft
       Selection.ShapeRange.ScaleHeight myRatio, msoFalse, msoScaleFromTopLeft
      Selection.Copy
      currentSheet.Activate
      Cells(i + 1, j).Select
      ActiveSheet.PasteSpecial Format:="図 (JPEG)", Link:=False, DisplayAsIcon:=False
      ActiveSheet.Hyperlinks.Add Anchor:=Selection.ShapeRange.Item(1), Address:=myfile.Path
      ActiveCell.Offset(-1, 0).Value = FSO.getbasename(myfile.Path)
      tempSheet.Activate
      tempSheet.Shapes(1).Delete
      i = i + 2
      If i > 20 Then
        i = 1
        j = j + 1
      End If
    End If
  Next myfile
  Set FSO = Nothing
  Application.DisplayAlerts = False
  tempSheet.Delete
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
End Sub

'==================================================================================
'ダイアログを表示して、フォルダー名を取得
Private Function myGetFolder() As String

    Dim objShell  As Object 'Shell
    Dim objFolder As Object 'Shell32.Folder
    Const strTitle = "フォルダを選択してください。"

    Set objShell = CreateObject("Shell.Application")
    'フォルダー参照に設定
    Const lngRef = &H1
    'ルートフォルダーをデスクトップに設定
    '5でMy Documents、6でFavoritesなど
    Const fldRoot = &H0
    Set objFolder = _
            objShell.BrowseForFolder(0, _
                strTitle, lngRef, fldRoot)
    Set objShell = Nothing
    
    Dim strMSG
    If objFolder Is Nothing Then
        myGetFolder = ""
    Else
        If objFolder.ParentFolder Is Nothing Then
            myGetFolder = ""
        Else
            myGetFolder = objFolder.Items.Item.Path
        End If
    End If
End Function