• 締切済み

Excel2003VBAでクリップボードにあるビットマップの操作について

Excel2003VBAにおいてクリップボードにあるビットマップの画像の任意の1pxの色を、 ペイントのスポイトツールのように取得するマクロを作成したいのですが GetPixelという関数で画像の任意1pxの色を取得できる所までは調べられたのですが、 それをクリップボードの画像で使用することができませんでした。 以下は、GetPixel関数を試してみた時のソースになります。 '------------------------------------------------------------------ Option Explicit Declare Function GetDesktopWindow Lib "user32" () As Long Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long Sub ピクセル色獲得() Dim hwnd As Long Dim hdc As Long hwnd = GetDesktopWindow() hdc = GetWindowDC(hwnd) Debug.Print Hex(GetPixel(hdc, 100, 200)) End Sub '------------------------------------------------------------------ 上記ソースで任意1pxの色を取得できたため クリップボードの画像の色を取得するマクロを下記のように作成しました。 '--------------------------------------------------------------- Option Explicit Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long Sub クリップボードピクセル色獲得() Dim CB As Variant Dim i As Long CB = Application.ClipboardFormats Debug.Print Hex(GetPixel(CB, 100, 200)) End Sub '--------------------------------------------------------------- 型が一致しません と言われ動きません。 以上です、よろしくお願いいたします。

みんなの回答

  • zawax
  • ベストアンサー率50% (3/6)
回答No.5

まちがい、、で終わらせては申し訳ないのでちょっと検証。 当初のクリップボードから直接取る回答にはなっていませんが、 UserFormを作って、そこから値を取得する方法です。 シェイプのhwnd,hdcをとるのは難しそうだったので。 これならなんとかなるか。。 UserFormにイメージを貼り付けるロジックは別途必要です。 Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Declare Function GetActiveWindow Lib "user32" () As Long Private Sub UserForm_Click() Dim hwnd As Long Dim hdc As Long hwnd = GetActiveWindow hdc = GetDC(hwnd) Debug.Print Hex(GetPixel(hdc, 100, 200)) End Sub

  • zawax
  • ベストアンサー率50% (3/6)
回答No.4

>KenKen_SPさん、 hdc、たしかにコンテキストですね。 まちがいでした。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんばんは。 GetPixel の第一引数は hDc という変数名が示すとおり、デバイス コンテキストのハンドルです。これは、Win32Api、GDI ともにそう。 ウインドウハンドルではありませんよ。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

>型が一致しません GetPixel(CB, 100, 200) CBが配列になっています。 ここはlongじゃないとだめでしょう。

  • zawax
  • ベストアンサー率50% (3/6)
回答No.1

マニアックなことやってますね。好きですこう言うの。 CBをVariantで宣言してクリップボードの中身を入れていますが、 GetPixelではウィンドウハンドルを要求していますので、 たぶんダメだろう、というのはソースを見てわかります。 (ウィンドウハンドルとは表示領域のIDだとおもっていただければ。。) なので、イメージが乗っている表示領域を作成し、そのウィンドウハンドルを取得できれば、 GelPixelが使えるということになります。 Excel内で画像を表示できる、制御しやすい表示領域はシェイプ系ですが、 シェイプのウィンドウハンドルを取ってこれるか、、が鍵でしょうね。 試したわけではありませんし、明確な答えではないので参考意見です。。