Excel VBA質問箱 IV

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

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


2133 / 13645 ツリー ←次へ | 前へ→

【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 質問[未読]

【69742】エクセルに貼りつけてある画像をコピーし...
質問  takataka  - 11/8/25(木) 18:50 -

引用なし
パスワード
   沢山のエクセルファイルがあって、すべてが特定のシート(仮に"sheet1")のE5セルに画像が貼りつけてあります。
この画像は縮小や拡大がされていますが、その%をmsgboxで表示し、確認後、エンターキーを押すと、100%にして、コピー(ctl+c)処理をするようなプログラムはできないでしょうか?
その後は、フォトショップに、その大きさでペイストしたいと思っています。
(こちらは、手作業で考えています)
どなたか、教えていただけませんか?
よろしくお願いします。

【69745】Re:エクセルに貼りつけてある画像をコピ...
発言  かみちゃん  - 11/8/25(木) 20:37 -

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

>どなたか、教えていただけませんか?

以下の質問と何が違うのですか?
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=69598;id=excel

【69747】Re:エクセルに貼りつけてある画像をコピ...
発言  takataka  - 11/8/25(木) 21:56 -

引用なし
パスワード
   かみちゃんさん
早速ありがとうございます。
当初は、フォトショップで開いてペーストと思っていましたが、同じ作業を1000回程繰り返すこととがわかり、クリップボードにある画像をjpg等で特定のホルダーに保存できないか試行錯誤を試みています。
そこで、色々つなぎ合わせて、このようなところまできています。
いかがでしょうか?
どうぞ、よろしくお願いします。


▼かみちゃん さん:
>こんにちは。かみちゃん です。
>
>>どなたか、教えていただけませんか?
>
>以下の質問と何が違うのですか?
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=69598;id=excel

【69748】Re:エクセルに貼りつけてある画像をコピ...
発言  かみちゃん  - 11/8/25(木) 22:25 -

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

>当初は、フォトショップで開いてペーストと思っていましたが、同じ作業を1000回程繰り返すこととがわかり、クリップボードにある画像をjpg等で特定のホルダーに保存できないか試行錯誤を試みています。
>そこで、色々つなぎ合わせて、このようなところまできています。

何がしたいのか意味がわかりません。
以下の質問と関連があるのですか?
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=69743;id=excel

この質問をした趣旨は何でしょうか?

【69749】Re:エクセルに貼りつけてある画像をコピ...
発言  takataka  - 11/8/25(木) 22:41 -

引用なし
パスワード
   あまりサイトに慣れていなくて、過去の質問を見るのも結構手間取ってしまいすみません。
基本、同じ案件ですが、おかげさまで、教えていただいたり、調べたりして、多くの目標が達成できました。
ただ、
wShape.CopyPicture
TempObject.GetFromClipboard
TempObject.Export Filename:="C:\tpic\testABC.jpg"'ここがエラーになります。
この3行目がうまくいかないか、そもそも間違っているかもしれないと思います。
1行目では、選択している画像をコピーしている
2行目では、データオブジェクトに持って行っている(そもそもあまり理解できてません)
3行目で、指定ホルダー内にjpegとして保存できないかと思っていました。

多分、僕自身が理解できていないと思いますが、如何でしょうか?
現状、エラーの後、エクセル上でCTL+Vをすれば、シート状にペイストできます。
だから、そこでフォトショップを開いて、ペイストすればいいのかもしれませんが、そのペイストして、別面でjpeg保存する部分まで、vbaではできないのでしょうか?
初心者で、申し訳ありません。
教えて頂けませんか?


▼かみちゃん さん:
>こんにちは。かみちゃん です。
>
>>当初は、フォトショップで開いてペーストと思っていましたが、同じ作業を1000回程繰り返すこととがわかり、クリップボードにある画像をjpg等で特定のホルダーに保存できないか試行錯誤を試みています。
>>そこで、色々つなぎ合わせて、このようなところまできています。
>
>何がしたいのか意味がわかりません。
>以下の質問と関連があるのですか?
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=69743;id=excel
>
>この質問をした趣旨は何でしょうか?

【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

【69756】Re:エクセルに貼りつけてある画像をコピ...
発言  takataka  - 11/8/26(金) 14:05 -

引用なし
パスワード
   どうもありがとうございます。
非常に難しそうですが、できそうです。
前回に引き続き、色々ありがとうございます。
お伺いしたことをベースに
今週末、なんとかチャレンジして克服してみます。
これからもどうぞよろしくお願いします。


▼かみちゃん さん:
>こんにちは。かみちゃん です。
>
>> 別面で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

【69764】Re:エクセルに貼りつけてある画像をコピ...
発言  Abyss  - 11/8/27(土) 17:57 -

引用なし
パスワード
   Excelシート上の「写真」をコピーすると、
(CopyPictureメソッドではなく、Copyメソッド)

OSクリップボードには何種類かの形式の画像が
置かれます。

「拡張メタファイル」、「ピクチャ」、「PNG」、
「JFIF」、「GIF」など。。。

その中から「JFIF」形式(Jpeg)のストリームを
ファイルとして保存する方法がファイルサイズ面でも、
スピード面でも有利だと思います。

ただ、VB(A)はIDataObject、IStreamインターフェースを
直接サポートしていないので、少し厄介ですが。

【69772】Re:エクセルに貼りつけてある画像をコピ...
質問  takataka  - 11/8/28(日) 6:33 -

引用なし
パスワード
   Abyssさん
どうもありがとうございます。
非常に参考になります。
こちらのサイトで質問させていただき、
すごく勉強になると感動しています。
これからもお世話になりたいと思っています。

ありがとうございます。

▼Abyss さん:
>Excelシート上の「写真」をコピーすると、
>(CopyPictureメソッドではなく、Copyメソッド)
>
>OSクリップボードには何種類かの形式の画像が
>置かれます。
>
>「拡張メタファイル」、「ピクチャ」、「PNG」、
>「JFIF」、「GIF」など。。。
>
>その中から「JFIF」形式(Jpeg)のストリームを
>ファイルとして保存する方法がファイルサイズ面でも、
>スピード面でも有利だと思います。
>
>ただ、VB(A)はIDataObject、IStreamインターフェースを
>直接サポートしていないので、少し厄介ですが。

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