• 締切済み

エクセルVBAで2つの画像を比較したい

こんにちは。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は使えないなどということはありますか?

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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を使用してイメージ本体を取得します 取得したイメージバッファの比較 といった流れになろうかと思います

DoPunk
質問者

お礼

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

  • 6dou_rinne
  • ベストアンサー率25% (1361/5264)
回答No.1

PicA,PicBに画像が設定されていないからでしょう。 このコードではただ宣言しているだけですが。

DoPunk
質問者

補足

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

関連するQ&A

専門家に質問してみよう