- 締切済み
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 '--------------------------------------------------------------- 型が一致しません と言われ動きません。 以上です、よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- zawax
- ベストアンサー率50% (3/6)
まちがい、、で終わらせては申し訳ないのでちょっと検証。 当初のクリップボードから直接取る回答にはなっていませんが、 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)
>KenKen_SPさん、 hdc、たしかにコンテキストですね。 まちがいでした。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんばんは。 GetPixel の第一引数は hDc という変数名が示すとおり、デバイス コンテキストのハンドルです。これは、Win32Api、GDI ともにそう。 ウインドウハンドルではありませんよ。
- okormazd
- ベストアンサー率50% (1224/2412)
>型が一致しません GetPixel(CB, 100, 200) CBが配列になっています。 ここはlongじゃないとだめでしょう。
- zawax
- ベストアンサー率50% (3/6)
マニアックなことやってますね。好きですこう言うの。 CBをVariantで宣言してクリップボードの中身を入れていますが、 GetPixelではウィンドウハンドルを要求していますので、 たぶんダメだろう、というのはソースを見てわかります。 (ウィンドウハンドルとは表示領域のIDだとおもっていただければ。。) なので、イメージが乗っている表示領域を作成し、そのウィンドウハンドルを取得できれば、 GelPixelが使えるということになります。 Excel内で画像を表示できる、制御しやすい表示領域はシェイプ系ですが、 シェイプのウィンドウハンドルを取ってこれるか、、が鍵でしょうね。 試したわけではありませんし、明確な答えではないので参考意見です。。