VBAからGDI+を使う資料集
inet上の達人の方々から御教示いただいたコードを少しアレンジさせてもらっています(切り貼りとも言います)。
  1. ホーム
  2. GDI+
  3. 画像をリサイズ、回転しクリップボードに複写


画像をリサイズ、回転してクリップボードにコピー【XL2010 CBにcopy失敗->対応code部屋】

画像をリサイズ、回転してクリップボードにコピー→別途ActiveCellに貼り付け
設定がおかしいと、直前のデータが残ってしまうが、エラー処理できていない


Private Sub LoadPictureScaledandRotated( _
              ByVal FileName As String, _
              Optional ByVal scalerate As Long = 100, _
              Optional ByVal InterpolationMode As InterpolationMode = InterpolationModeBilinear, _
              Optional ByVal angle As Single = 0 _
              )

    Dim IID_IDispatch As GUID
    Dim pd As PICTDESC
    Dim udtInput  As GdiplusStartupInput
    Dim objPicture As Object
    Dim hBmp As Long
    Dim lngToken  As Long
    Dim pGraphics As Long
    Dim pSrcBmp   As Long
    Dim pDstBmp   As Long
    Dim lngWidth  As Long
    Dim lngHeight As Long
    Dim lngStatus As Long
    Dim pImageTemp As Long
    Dim hBrush As Long
    
    ' 初期化
    udtInput.GdiplusVersion = 1
    If GdiplusStartup(lngToken, udtInput, ByVal 0&) <> 0 Then
        Exit Function
    End If
    ' 画像の読みこみ
    If GdipCreateBitmapFromFile(ByVal StrPtr(FileName), pSrcBmp) <> 0 Then
        GdiplusShutdown lngToken
        Exit Function
    End If
    '画像の回転
    Call RotateImage(pSrcBmp, pImageTemp, angle, &HFFFFFFFF)
'    pImageTemp = pSrcBmp 'for debug
    ' 元画像サイズの取得
    GdipGetImageWidth pImageTemp, lngWidth
    GdipGetImageHeight pImageTemp, lngHeight
    ' サイズの変更
    lngWidth = lngWidth * scalerate \ 100
    lngHeight = lngHeight * scalerate \ 100
    If GdipGetImageGraphicsContext(pImageTemp, pGraphics) = 0 Then
        ' コピー先Bitmap作成
        lngStatus = GdipCreateBitmapFromGraphics(lngWidth, lngHeight, pGraphics, pDstBmp)
        GdipDeleteGraphics pGraphics
        If lngStatus = 0 Then
            ' コピー用Graphics作成
            If GdipGetImageGraphicsContext(pDstBmp, pGraphics) = 0 Then
                ' 補間方法の設定
                GdipSetInterpolationMode pGraphics, InterpolationMode
                '縁が出来てしまうので白で塗りつぶしておく
                GdipCreateSolidFill &HFFFFFFFF, hBrush
                GdipFillRectangle pGraphics, hBrush, 0, 0, lngWidth, lngHeight
                GdipDeleteBrush hBrush
                ' イメージのコピー
                GdipDrawImageRectI pGraphics, pImageTemp, 0, 0, lngWidth, lngHeight
                GdipDeleteGraphics pGraphics
                ' GDIのビットマップ作成
                GdipCreateHBITMAPFromBitmap pDstBmp, hBmp, 0
            End If
            GdipDisposeImage pDstBmp
        End If
    End If
    GdipDisposeImage pImageTemp
    GdiplusShutdown lngToken
    If hBmp = 0 Then Exit Sub
    '画像をクリップボードにコピー
    If OpenClipboard(0) <> 0 Then
        EmptyClipboard
        SetClipboardData CF_BITMAP, hBmp
        CloseClipboard
    End If
End Sub