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


Chartの機能を用いてリサイズ・JPEG保存・コメントに貼付

ExcelのChartの機能を生かして画像のリサイズ、JPEG保存ができる事に気づきました。
JPEG保存は、MS Officeのグラフィックフィルターの機能によりますが、かねてから不満を持っていたJPEG保存時の
Qualityをレジストリの値変更で改善できる事も分かりました。

Sub pastePic2Comment()
  Dim myComment As Comment
  Dim myWidth As Double, myHeight As Double
  Dim picPath As String
  Dim myPic As StdPicture
  Dim myRatio As Double
  Dim myChartObj As ChartObject
  Const longSideLength As Double = 300
 
  Application.ScreenUpdating = False
  picPath = Application.GetOpenFilename("画像ファイル , *.*")
  If picPath = "False" Then Exit Sub
  Set myPic = LoadPicture(picPath)
  myRatio = myPic.Width / myPic.Height
  Set myPic = Nothing
  If myRatio >= 1 Then
    myWidth = longSideLength: myHeight = longSideLength / myRatio
  Else
    myWidth = longSideLength * myRatio: myHeight = longSideLength
  End If
  'Sheet(2)のところはアクティブでないシートを指定して下さい。
  Set myChartObj = Sheets(2).ChartObjects.Add(0, 0, myWidth, myHeight)
  myChartObj.Chart.ChartArea.Fill.UserPicture PictureFile:=picPath
  myChartObj.Chart.Export "c:\temp.jpg"
  myChartObj.Delete
  ActiveCell.ClearComments
  Set myComment = ActiveCell.AddComment
  With myComment.Shape
    .Fill.Visible = msoTrue
    .Fill.UserPicture "C:\temp.jpg"
    .Width = myWidth
    .Height = myHeight
  End With
  Application.ScreenUpdating = True
End Sub

レジストリはRegEditによるか、下記URLのコードを利用させていただき、標準の75(0x4B)→一般的な設定の85に変更します。
レジストリのデータの在処は下記コードをご参照下さい。
'http://www31.ocn.ne.jp/~heropa/vb13.htm
Sub setRegistry()
    Debug.Print RegSetValue(HKEY_LOCAL_MACHINE, _
                            "SOFTWARE\Microsoft\Shared Tools\Graphics Filters\Export\JPEG\Options", _
                            "Quality", _
                            REG_DWORD, _
                            85)
End Sub

おまけ : JPEGファイルをリサイズしてJPEG保存するプロシージャ
(長辺のpixel数を渡す - ぴったりサイズにはならないのが難)

Private Sub resizeJpegFile(srcPicPath As String, destPicPath As String, longSideLength As Long)
  Dim myWidth As Double, myHeight As Double
  Dim myPic As StdPicture
  Dim myRatio As Double
  Dim myChartObj As ChartObject
  
  longSideLength = longSideLength * 72 / 96
  Application.ScreenUpdating = False
  Set myPic = LoadPicture(srcPicPath)
  myRatio = myPic.Width / myPic.Height
  Set myPic = Nothing
  If myRatio >= 1 Then
    myWidth = longSideLength: myHeight = longSideLength / myRatio
  Else
    myWidth = longSideLength * myRatio: myHeight = longSideLength
  End If
  Set myChartObj = ActiveSheet.ChartObjects.Add(0, 0, myWidth, myHeight)
  myChartObj.Chart.ChartArea.Fill.UserPicture PictureFile:=srcPicPath
  myChartObj.Chart.Export destPicPath
  myChartObj.Delete
  Application.ScreenUpdating = True
End Sub