| 
    
     |  | ▼ゆらり さん: 
 >画像ファイルを開いた後に、表示ファイルがアクティブの状態でSendkeyステートメントを使用して回転させるつもりでしたが、不可能ですか?
 
 そういう手段は安定性がないのであまり考えない方がよいと思います。
 
 外部ソフトに複数ファイルを一括Rotateするバッチ機能があれば、
 ExcelVBAでマクロを組む必要はない。---これは前回のアドバイスですが、
 もしそういう機能が無いのなら、
 このスレッドの最初のぼくの(要件をかんちがいした)処理方法に戻って
 こちらの方法を考えてもいいんじゃないかと思います。
 
 というのも、
 Excelで画像をシートに貼り付けて回転まではできるのですから、
 あとはこれを元の画像形式で保存すればいいだけですので。。。
 
 幸い shira さんが2005年にmougに投稿された(これ以前にもあったかも
 知れませんが、ぼくが教えてもらったのはこのときでした)GDI の機能を使う
 図の保存コードがあるので、それを使わせていただくことにすれば
 話は簡単になります。
 
 以下を新規モジュールに貼り付け、下のほうの
 > Sub 画像ファイル回転保存90()
 を実行してみてください。
 このプロシージャは 画像を90°回転させ、元のファイル名に#90を
 追加して保存し直すものです。
 
 '--------
 Option Explicit
 Private Type GUID
 Data1 As Long
 Data2 As Integer
 Data3 As Integer
 Data4(0 To 7) As Byte
 End Type
 Private Type GdiplusStartupInput
 GdiplusVersion      As Long
 DebugEventCallback    As Long
 SuppressBackgroundThread As Long
 SuppressExternalCodecs  As Long
 End Type
 Private Declare Function GdiplusStartup Lib "gdiplus" _
 (token As Long, pInput As GdiplusStartupInput, _
 pOutput As Any) As Long
 Private Declare Sub GdiplusShutdown Lib "gdiplus" _
 (ByVal token As Long)
 Private Declare Function GdipDisposeImage Lib "gdiplus" _
 (ByVal Image As Long) As Long
 Private Declare Function GdipCreateBitmapFromHBITMAP Lib "gdiplus" _
 (ByVal hbm As Long, ByVal hPal As Long, _
 bitmap As Long) As Long
 Private Declare Function GdipSaveImageToFile Lib "gdiplus" _
 (ByVal Image As Long, filename As Any, _
 clsidEncoder As GUID, encoderParams As Any) As Long
 Private Declare Function CLSIDFromString Lib "ole32" _
 (lpsz As Any, pClsid As GUID) As Long
 Const CLSID_PNG_CODEC = "{557CF406-1A04-11D3-9A73-0000F81EF32E}"
 Const CLSID_JPG_CODEC = "{557CF401-1A04-11D3-9A73-0000F81EF32E}"
 Const CLSID_BMP_CODEC = "{557cf400-1a04-11d3-9a73-0000f81ef32e}"
 Const CLSID_GIF_CODEC = "{557cf402-1a04-11d3-9a73-0000f81ef32e}"
 
 Private Declare Function OpenClipboard Lib "user32" _
 (ByVal hWndNewOwner As Long) As Long
 Private Declare Function CloseClipboard Lib "user32" () As Long
 Private Declare Function GetClipboardData Lib "user32" _
 (ByVal uFormat As Long) As Long
 Const CF_BITMAP = 2
 
 Private Declare Function CopyImage Lib "user32" _
 (ByVal hImage As Long, ByVal uType As Long, _
 ByVal cxDesired As Long, ByVal cyDesired As Long, _
 ByVal fuFlags As Long) As Long
 Const IMAGE_BITMAP = 0
 Const LR_COPYRETURNORG = &H4
 Private Declare Function DeleteObject Lib "gdi32" _
 (ByVal hObject As Long) As Long
 
 '--------------------------------------------------------------------------------
 
 '// クリップボードにコピーされたBMP を 元の形式で保存
 Function SaveBmpClipAs(ByVal savePath As String, _
 Style As String) As Boolean
 
 Dim udtInput As GdiplusStartupInput
 Dim EncoderId As GUID
 Dim lngToken As Long
 Dim pBitmap  As Long
 Dim hbmp   As Long
 Dim ClsID   As String
 
 If OpenClipboard(0) Then
 hbmp = CopyImage(GetClipboardData(CF_BITMAP), _
 IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
 CloseClipboard
 End If
 If hbmp = 0 Then MsgBox "Failed to get hBmp": Exit Function
 
 udtInput.GdiplusVersion = 1
 If GdiplusStartup(lngToken, udtInput, ByVal 0&) = 0 Then
 If GdipCreateBitmapFromHBITMAP(hbmp, 0, pBitmap) = 0 Then
 Select Case LCase$(Style)
 Case "jpg", "jpeg"
 ClsID = CLSID_JPG_CODEC
 Case "png"
 ClsID = CLSID_PNG_CODEC
 Case "bmp"
 ClsID = CLSID_BMP_CODEC
 End Select
 CLSIDFromString ByVal StrPtr(ClsID), EncoderId
 If GdipSaveImageToFile( _
 pBitmap, ByVal StrPtr(savePath & ""), _
 EncoderId, ByVal 0&) = 0 Then
 SaveBmpClipAs = True
 End If
 GdipDisposeImage pBitmap
 End If
 GdiplusShutdown lngToken
 End If
 DeleteObject hbmp
 
 End Function
 
 
 '--------
 Sub 画像ファイル回転保存90()
 Dim myPicFiles
 Dim saveFormat As String
 Dim m As Long
 
 '回転する画像ファイルの指定(複数可)
 myPicFiles = Application.GetOpenFilename( _
 "BMP or JPGファイル,*.Bmp;*.jpg;*.jpeg;*.Png", _
 MultiSelect:=True)
 If VarType(myPicFiles) = vbBoolean Then Exit Sub
 
 Dim picName
 Range("A1").Select
 Application.ScreenUpdating = False
 For Each picName In myPicFiles
 With ActiveSheet.Pictures.Insert(picName)
 .ShapeRange.IncrementRotation 90#
 .CopyPicture Format:=xlBitmap
 m = InStrRev(picName, ".")
 saveFormat = Mid$(picName, m + 1)
 SaveBmpClipAs Replace(picName, ".", "#90."), _
 Style:=saveFormat
 .Delete
 End With
 Next
 Application.ScreenUpdating = True
 
 End Sub
 
 |  |