プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。VBAの初心者です。

エクセル2003のVBAを使って、シートに読み込んだ縦横24ピクセルの2つの画像(picA、picB)を比較したいと考えています。VBなどのページを参考に、APIのGetPixel関数を使えばなんとかなりそうだというところまではたどり着いて、以下のコードを組んでみたのですが、うまく動きません。

Private Declare Function GetPixel Lib "gdi32" _
(ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Private Sub CommandButton1_Click()

Dim picA As Image
Dim picB As Image
Dim p1 As Integer
Dim p2 As Integer
Dim ScreenhDC As Long

For x = 1 To 24
For y = 1 To 24
p1 = picA.GetPixel(ScreenhDC, x, y)
p2 = picB.GetPixel(ScreenhDC, x, y)
If p1 <> p2 Then
MsgBox "違う画像です"
Exit Sub
End If
Next
Next
MsgBox "同じ画像です"

End Sub

「p1 = picA.GetPixel(ScreenhDC, x, y)」のところで「実行時エラー'91': オブジェクト変数またはWithブロック変数が設定されていません。」というメッセージが出て止まってしまいます。解決法をご教示いただけませんでしょうか。

そもそもエクセルのVBAではAPIは使えないなどということはありますか?

A 回答 (2件)

この文法ではエラーですね


ImageオブジェクトにGetPixelといったメソッドはありませんし、Imageオブジェクト自体を生成していません

Windows操作するのに必要なウィンドウハンドルを公開していませんのでWinAPIのGetPixelにはデバイスコンテキストハンドルが必要ですがこのハンドルを取得する術がありません

適切なデバイスコンテキストハンドルを取得して
dim p1 as long, p2 as long
p1 = GetPixel(hDC1, x, y)
p2 = GetPixel(hDC2, x, y)
といった使い方をします … GetPixelは32ビット長の整数を返しますので受ける変数はLong型にします

ExcelVBAでやるとするとBITMAPとして扱うことになると思います
LoadPictureでstdPictureオブジェクトを取得します
このオブジェクトを利用してWinAPIのGetObjectをつかってBITMAP構造体を取得します
この構造体のデータからイメージバッファの大きさを計算して
GetBitmapBitsを使用してイメージ本体を取得します
取得したイメージバッファの比較
といった流れになろうかと思います
    • good
    • 0
この回答へのお礼

ご回答有難うございます。

なにぶん初心者なもので難解ですが、頂いたアドバイスに沿って調べてみます。

お礼日時:2008/01/08 20:22

PicA,PicBに画像が設定されていないからでしょう。


このコードではただ宣言しているだけですが。

この回答への補足

ご回答有難うございます。

予め2つの画像をエクセルのシート上に読み込んであり、それぞれの名前を「名前ボックス」で「picA」、「picB」と設定しました。

補足日時:2008/01/08 20:06
    • good
    • 0

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