• 締切済み

【エクセルのマクロ】クリップボードのbitmapをフォームに表示させたい

こんにちは! クリップボードにビットマップが入っていたとき、そのデータをフォームに表示させたりすることはできませんか?API関数にgetclipboarddata(cf_bitmap)というものがあり、これを使うことでデータは取得していると思うのですが、例えばImage1.Picture=GetClipBoardData(CF_BITMAP)というようにやっても〔オブジェクトが必要です〕というエラーが出てしまいます。 openclipboard(0)とかcloseclipboardとか、これらの宣言とか、概ね必要と思われるものはコードに組み込んであると思います。 正直申し上げて、完全な初心者です。どなたかお分かりになる方いらっしゃいますか? また、エクセルのグラフやシェイプをマクロを使い、bitmap形式で保存する方法はありませんか?VBの参考サイトで調べてみるとメタファイル形式で取得してやってらっしゃったのですが、エクセルのマクロではこれはできないでしょうか(自分が見たサイトではエクセルでサポートしていない関数を使っていました)? どなたか助けてください。よろしくお願いいたします。

みんなの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.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.html

  • luka3
  • ベストアンサー率74% (299/401)
回答No.1

こちらをご参照ください。 http://www.keep-on.com/excelyou/2003lng4/200302/03020119.txt ぱげさんのマクロをエクセルにコピーして、クリップボードの画像データがファイルに保存されることを確認しました。 このoPictureをImage1に直接コピーする方法はわかりませんが、保存されたビットマップファイルをLoadPictureすればImage1に表示されることは確認しました。

関連するQ&A

  • エクセルのマクロについて

    エクセルのマクロについて教えてください。 毎月、データをダウンロードし、VLOOKUP関数などを使って、 必要項目を入れ、ピポットテーブルで合計を出すという 作業をしています。マクロを使ったら、簡単にできるのでは ないかとやってみましたが、マクロで登録しても 毎月集計をするデータの件数が異なるため、 VLOOK関数で入力されるのが、そのマクロで登録したときの ものまでで、残りのセルが空欄になっていたり、 ピポットテーブルの集計は、データの範囲を選びなおしたり しないといけませんでした。 いい方法はないでしょうか。 マクロに作業を記録して、そのシートではなく、 ほかのファイルのシートで 実行する場合は、そのマクロを登録したときのファイル(シート)を 毎回開かなければならないのでしょうか。 基本的なことがわかっていません。 教えてください。

  • エクセルのマクロ

    エクセルのマクロ(VBA?)で、あるフォルダ内のファイル名を取得する(拡張子が.txtのもだけ)関数があれば教えてほしいのですが・・・

  • エクセルのマクロの使い方

    仕事でよくエクセルを使って計算などをしています。 はじめはエクセルの関数も知らず調べているうちに効率的だと思い、積極的に使うようになってきました。関数もいろいろ使い複雑に感じています。 そこでエクセルのマクロを使うともっと効率的なのかと思い始めています。 ただ、プログラムは全くの初心者でマクロを使うとどこがどう効率的になるのか、 調べてもいまいちピンときません。 今の仕事内容なら関数だけでなんとかなるのか、マクロを使ったほうがいいのか。 漠然としていて申し訳ないのですが、 (1)関数でもできるけどマクロの方が良い事。 (2)マクロを使わないとできない事。 これらの具体例を教えていただきたいです。 私がやっているのは例えば見込みに対して実際どれだけ売れたか、などの計算ですが、 いろいろ条件が絡んできて関数を使っています。 その他いろいろありますが、マクロを使えたらもっと良いのか判断できない状況です。 会社内では関数すら使う文化がなく聞ける方がいません。エクセルはみなさん使っていますが、私が率先していろいろ試している感じです。 その他アドバイスでも良いのですが、なんとなく感覚が掴めて必要性を感じたら書籍などで勉強したいと考えています。 宜しくお願いします。

  • エクセルマクロの使い方

    URLの短縮を一括で複数やりたいと思い検索したところ http://www.ka-net.org/office/of38.html http://www.kisnet.or.jp/nappa/sb/log/eid308.html の二つがでてきました。 グーグルAPIからAPIキーを取得して、 エクセル2007の開発⇒マクロでマクロの画面を開き、上記にあったコードを貼りつけました。 その後、どのような作業をすればURLを一括変換できるのかわかりません。 ご教授いただけますでしょうか?

  • EXCELグラフをPowerPointに貼り付ける作業のマクロ化

    EXCELで造ったグラフをコピーして、PowerPointで、形式を選択して貼り付けでピクチャ(拡張メタファイル)で貼り付ける作業のマクロ化を 行いたいと考えておりますが、PowerPoint側の操作をマクロ記録しても記録されません。何か良い方法はありますか? ※バージョンはOffice2000です。 よろしくお願いします。

  • エクセルマクロでDBのデータをエクセルに出力したい。

    エクセルマクロを初めてしています。 基本的な事で半日費やしてしまい恐縮なのですがアドバイス頂けたら助かります。 マクロの中身は大体こんな感じかな・・というかんじで分かるのですが、いざ自分が作るとなるとよく分からないでいます。 タイトル通りなのですが、エクセルマクロでDBのデータをエクセルに出力するには、どうしたらよいのでしょうか。なにか関数があるのでしょうか。 また何かサンプルがあるサイトがあれば教えてください。

  • ExcelのセルデータをPowerPointに表示したい

    Excelのセルに入力したデータを、PowerPointのオートシェイプに表示させたいと考えています。 たとえば、ExcelのToday関数の結果をPowerPointの吹き出しオートシェイプに表示させる、といったことです。 当然日付が変わればオートシェイプの日付の表示も変わる必要があります。 どなたか良い方法をご存知の方がいらっしゃればご教示いただければ幸いです。

  • エクセルのマクロについて教えてください。

    エクセルのマクロについて教えてください。 マクロでエクセルのセルから、PDFのデータを呼び出したいのですが、どのような設定をすればいいでしょうか?いろいろなサイトでみた設定を試してみているのですが、うまくいきません。ひょっとしたらPDFの名前を入力する部分か、データの置き場所等が違うのかとも思っています。できましたら下記の条件で、PDFの名前やデータの置き場所も入力して、教えていただけるとありがたいです。なお当方はマクロの素人なので、詳しく教えていただけるとありがたいです。 条件 1,エクセルは2010です。    2,PDF、エクセルシートともにデスクトップ上の1同じフォルダ内にあります。    3,PDFの名前は1234.pdfです。    4、フォルダ名は5678です。    5,エクセルシート名はtatai.xlsです。    6,ハイパーリンクはデザインの関係で使えません。    7,できあがったら基本的にUSB等で持ち運びたいです。 *またPDFについてはなんらかの関連付け等が必要なのでしょうか?

  • VBA エクセルの関して ボタンを表示させるマクロ

    マクロ初心者です。初心者過ぎて説明がわかりにくいかと思いますがよろしくお願いします。 今現在、データ入力のためにマクロを活用しようと考えております。そこで、ある特定のボタン(オートシェイプで作ったボタン)を表示させるボタンを作りたいのですが、そのためには、ある特定のボタンを表示させるマクロのコード?が必要かと思います。 どなたか詳しい方がいらっしゃったらご教授願いたいです。つたない説明ですみませんが、よろしくお願いします。

  • Excelマクロをずっと動かしていたら、ネットが止

    Excelマクロで数万個近くあるURLの、 サイトタイトルなどの情報を取得しています。 Excelマクロでずっと取得していたのですが、 途中で、ネットが止まったりします。 しばらく待っていたり、サーバーをリセットすると元に戻ります。 これは、やはりExcelマクロが原因となっているのでしょうか? また、このExcelマクロを動かしておくことで、 ネットが止まること以外の弊害はあるのでしょうか? よろしくお願いいたします。

専門家に質問してみよう