dポイントプレゼントキャンペーン実施中!

こんにちは!

クリップボードにビットマップが入っていたとき、そのデータをフォームに表示させたりすることはできませんか?API関数にgetclipboarddata(cf_bitmap)というものがあり、これを使うことでデータは取得していると思うのですが、例えばImage1.Picture=GetClipBoardData(CF_BITMAP)というようにやっても〔オブジェクトが必要です〕というエラーが出てしまいます。

openclipboard(0)とかcloseclipboardとか、これらの宣言とか、概ね必要と思われるものはコードに組み込んであると思います。

正直申し上げて、完全な初心者です。どなたかお分かりになる方いらっしゃいますか?

また、エクセルのグラフやシェイプをマクロを使い、bitmap形式で保存する方法はありませんか?VBの参考サイトで調べてみるとメタファイル形式で取得してやってらっしゃったのですが、エクセルのマクロではこれはできないでしょうか(自分が見たサイトではエクセルでサポートしていない関数を使っていました)?

どなたか助けてください。よろしくお願いいたします。

A 回答 (2件)

こんばんは。



> クリップボードにビットマップが入っていたとき、そのデータをフォームに
> 表示させたりすることはできませんか?

クリップボードから直接 Picture オブジェクトを生成します。内容が内容なので
どうしても Excel 単体だと難しいですね。API だらけで難易度は高めですけど、
頑張って下さい。

' // 標準モジュール
' // Declareations --------------------------------------------------
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" ( _
    ByVal wFormat As Long) As Long
Private Declare Function OpenClipboard Lib "user32.dll" ( _
    ByVal hWnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32.dll" ( _
    ByVal wFormat As Long) As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" ( _
    ByRef lpPictDesc As PictDesc, _
    ByRef RefIID As GUID, _
    ByVal fPictureOwnsHandle As Long, _
    ByRef IPic As IPicture) As Long
' // Types ----------------------------------------------------------
Private Type PictDesc
    cbSizeofStruct As Long
    picType    As Long
    hImage     As Long
    Option1    As Long
    Option2    As Long
End Type
Private Type GUID
    Data1     As Long
    Data2     As Integer
    Data3     As Integer
    Data4(7)    As Byte
End Type
' // Constants ------------------------------------------------------
Private Const CF_BITMAP   As Long = 2
Private Const CF_PALETTE   As Long = 9

' // クリップボードのビットマップデータから Picture オブジェクトを作成
Public Function CreatePictureFromClipboard() As StdPicture
  
  Dim hImg   As Long
  Dim hPalette As Long
  Dim uPictDesc As PictDesc
  Dim uGUID   As GUID
  
  Set CreatePictureFromClipboard = Nothing
  
  ' 終了条件:: クリップボードに該当データが無い
  If IsClipboardFormatAvailable(CF_BITMAP) = 0 Then Exit Function
  ' 終了条件:: クリップボードからイメージハンドルが取得できない
  If OpenClipboard(0&) <> 0 Then
    hImg = GetClipboardData(CF_BITMAP)
    hPalette = GetClipboardData(CF_PALETTE)
    Call CloseClipboard
  End If
  If hImg = 0 Then Exit Function
  
  With uPictDesc
    .cbSizeofStruct = Len(uPictDesc)
    .picType = 1
    .hImage = hImg
    .Option1 = hPalette
  End With
  With uGUID
    .Data1 = &H20400
    .Data4(0) = &HC0
    .Data4(7) = &H46
  End With
  Call OleCreatePictureIndirect(uPictDesc, _
                 uGUID, _
                 0&, _
                 CreatePictureFromClipboard)

End Function

とこんな感じの関数を作成して、ビットマップデータを Picture オブジェクト
に変換してやります。例えばユーザーフォームの Image1 なら、

Private Sub CommandButton1_Click()
  Set Image1.Picture = CreatePictureFromClipboard()
End Sub

で呼び出します。

> エクセルのグラフやシェイプをマクロを使い、bitmap形式で保存する方法は
> ありませんか?

グラフなら Chart オブジェクトに Export メソッドがあるので、それを使って
Bitmap とか Gif で保存できたと思います。

  Worksheets("Sheet1").ChartObjects(1).Chart.Export _
  FileName:="Sample.bmp", FilterName:="BMP"

シェープも一度コピーしたものを Chart オブジェクトの ChartArea にペースト
することで同様に保存できます。ただ、余計な余白などができたりして、あまり
お勧めできません。

Image コントロール経由でもよければ、

Private Sub CommandButton2_Click()
  stdole.SavePicture Image1.Picture, "C:\sample.bmp"
End Sub

とか。この場合、Bitmap 限定です。

以上の方法なら VBA 標準の機能で済みますが、きめ細かな制御が必要なら
どうしても API を使うか、GdiPlus などを使うことになります。GdiplusStartup
などをキーワードで調べてみて下さい。

なお、GdiPlus を使った場合、ファイル形式を Jpeg や Png などに変更することも
可能です。

また、明熊さんがフリーで公開されている SaveJPG.DLL も割と簡易なコードで
Jpeg 保存が可能で大変便利です。
http://www.vector.co.jp/soft/win95/prog/se093621 …
    • good
    • 3

こちらをご参照ください。


http://www.keep-on.com/excelyou/2003lng4/200302/ …

ぱげさんのマクロをエクセルにコピーして、クリップボードの画像データがファイルに保存されることを確認しました。
このoPictureをImage1に直接コピーする方法はわかりませんが、保存されたビットマップファイルをLoadPictureすればImage1に表示されることは確認しました。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A