Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12502 / 76734 ←次へ | 前へ→

【69750】Re:エクセルに貼りつけてある画像をコピーしたい
発言  かみちゃん E-MAIL  - 11/8/26(金) 6:16 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> 別面でjpeg保存する部分まで、vbaではできないのでしょうか?

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=57318;id=excel
で、kanabunさんが紹介されていた

>> シート上の図や画像をjpgファイルとして保存するには
>>
>> SaveCBPictureAs
>>
>> というshiraさんという方の関数

を利用すると、以下のような感じてできませんか?

なお、
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=69743;id=excel
の質問と何が違うのかよくわかりませんが、
以下のコードは、アクティブシートのすべての
msoPicture をファイルに保存する方法です。

すべてのシートの特定のセルにある msoPicture であれば、これをベースに修正すればできると思います。

Option Explicit

'http://www4.ocn.ne.jp/~outfocus/gdip/pic2bmp2.html

Private Type FLTIMAGE
  StructSize As Integer
  Type As Byte
  Reserved1(0 To 8) As Byte
  hImage As Long
  Reserved3(0 To 19) As Byte
End Type
Private Type FLTFILE
  Reserved1 As Integer
  Ext As String * 4
  Reserved2 As Integer
  Path As String * 260
  Reserved3 As Currency
End Type

'ここで出力形式を選択する
#Const FLT_MODE = -1

#If FLT_MODE = -1 Then 'PNG
  Private Declare Function GetFilterInfo Lib _
   "C:\Program Files\Common Files\Microsoft Shared\Grphflt\PNG32.FLT" _
    (ByVal Ver As Integer, ByVal Reserved As Long, _
    phMem As Long, ByVal flags As Long) As Long
  Private Declare Function ExportGr Lib "PNG32.FLT" _
    (ff As FLTFILE, fi As FLTIMAGE, ByVal hMem As Long) As Long
  Private Const SaveExt As String = "PNG保存,*.png"
#ElseIf FLT_MODE = 1 Then 'JPEG
  Private Declare Function GetFilterInfo Lib _
   "C:\Program Files\Common Files\Microsoft Shared\Grphflt\JPEGIM32.FLT" _
    (ByVal Ver As Integer, ByVal Reserved As Long, _
    phMem As Long, ByVal flags As Long) As Long
  Private Declare Function ExportGr Lib "JPEGIM32.FLT" _
    (ff As FLTFILE, fi As FLTIMAGE, ByVal hMem As Long) As Long
  Private Const SaveExt As String = "Jpeg保存,*.Jpg"
#ElseIf FLT_MODE = 2 Then 'TIFF
Private Declare Function GetFilterInfo Lib _
 "C:\Program Files\Common Files\Microsoft Shared\Grphflt\TIFFIM32.FLT" _
    (ByVal Ver As Integer, ByVal Reserved As Long, _
     phMem As Long, ByVal flags As Long) As Long
 Private Declare Function ExportGr Lib "TIFFIM32.FLT" _
   (ff As FLTFILE, fi As FLTIMAGE, ByVal hMem As Long) As Long
 Private Const SaveExt As String = "TIFF保存,*.Tif"
#Else '         GIF
  Private Declare Function GetFilterInfo Lib _
   "C:\Program Files\Common Files\Microsoft Shared\Grphflt\GIFIMP32.FLT" _
    (ByVal Ver As Integer, ByVal Reserved As Long, _
    phMem As Long, ByVal flags As Long) As Long
  Private Declare Function ExportGr Lib "GIFIMP32.FLT" _
    (ff As FLTFILE, fi As FLTIMAGE, ByVal hMem As Long) As Long
  Private Const SaveExt As String = "GIF保存,*.Gif"
#End If

Private Declare Function OpenClipboard Lib "user32" _
    (ByVal hWndNewOwner As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
    (ByVal uFormat As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Const CF_ENHMETAFILE = 14
Private Declare Function CopyEnhMetaFile Lib "gdi32" _
    Alias "CopyEnhMetaFileA" _
    (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long
Private Declare Function DeleteEnhMetaFile Lib "gdi32" _
    (ByVal hemf As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" _
    (ByVal hMem As Long) As Long

Function SaveCBPictureAs(ByVal SavePath As String) As Boolean
' クリップボードにコピーされたEMFイメージを _
       定数 FLT_MODE で指定された形式で保存
 Dim fi  As FLTIMAGE
 Dim ff  As FLTFILE
 Dim hemf As Long
 Dim hMem As Long

 If OpenClipboard(0) Then
   hemf = CopyEnhMetaFile( _
       GetClipboardData(CF_ENHMETAFILE), vbNullString)
   CloseClipboard
 End If
 If hemf = 0 Then Exit Function
 ' パラメータ設定
 ff.Path = SavePath & vbNullChar
 With fi
   .StructSize = LenB(fi)
   .Type = 1
   .hImage = hemf
 End With
 ' フィルタ呼び出し
 If GetFilterInfo(3, 0, hMem, &H10000) And &H10 Then
   If ExportGr(ff, fi, hMem) = 0 Then
     SaveCBPictureAs = True
   End If
 End If
 If hMem Then GlobalFree hMem
 DeleteEnhMetaFile hemf
End Function

Sub 動作テスト()
 Dim AWorksheet As Worksheet
 Dim wShape As Shape
 Dim myW As Double, myH As Double, myRatio As Double
 Dim oW As Double, oH As Double
 Dim strPath As String
 Dim lngCount As Long
 
 Application.ScreenUpdating = False
   
 Set AWorksheet = ActiveSheet
 For Each wShape In AWorksheet.Shapes
  If wShape.Type = msoPicture Then
   With wShape
    myW = .Width
    myH = .Height
    '図を元の大きさに変更
    .ScaleHeight 1, msoTrue
    .ScaleWidth 1, msoTrue
    oH = .Height
    oW = .Width
    .Copy
    '縮小後のサイズに戻す
    .Width = myW
    .Height = myH
   End With
   Application.ScreenUpdating = True
   myRatio = WorksheetFunction.Round(myW / oW * 100, 0)
   
   lngCount = lngCount + 1
'   strPath = ThisWorkbook.Path & "\testABC_" & Format(lngCount, "000") & ".jpg"
   strPath = "C:\tpic\testABC_" & Format(lngCount, "000") & ".jpg"
   
   Call SaveCBPictureAs(strPath)
  End If
 Next
End Sub

5 hits

【69742】エクセルに貼りつけてある画像をコピーしたい takataka 11/8/25(木) 18:50 質問
【69745】Re:エクセルに貼りつけてある画像をコピー... かみちゃん 11/8/25(木) 20:37 発言
【69747】Re:エクセルに貼りつけてある画像をコピー... takataka 11/8/25(木) 21:56 発言
【69748】Re:エクセルに貼りつけてある画像をコピー... かみちゃん 11/8/25(木) 22:25 発言
【69749】Re:エクセルに貼りつけてある画像をコピー... takataka 11/8/25(木) 22:41 発言
【69750】Re:エクセルに貼りつけてある画像をコピー... かみちゃん 11/8/26(金) 6:16 発言
【69756】Re:エクセルに貼りつけてある画像をコピー... takataka 11/8/26(金) 14:05 発言
【69764】Re:エクセルに貼りつけてある画像をコピー... Abyss 11/8/27(土) 17:57 発言
【69772】Re:エクセルに貼りつけてある画像をコピー... takataka 11/8/28(日) 6:33 質問

12502 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free