こんにちは。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件)
- 最新から表示
- 回答順に表示
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を使用してイメージ本体を取得します
取得したイメージバッファの比較
といった流れになろうかと思います
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルマクロエラー「'Cells'...
-
VBAで既に開いている別アプリケ...
-
エクセルのVBAの標準モジュール...
-
PowerPointVBAでスライドマスタ...
-
Excelでフィルタをかけると警告...
-
エクセルVBAでcode128のバー...
-
sheetsメソッドの失敗
-
テキストボックス中の文字列の...
-
ある文字列が全て数字であるか...
-
VBAで Set wb = Sheets(1).Cop...
-
コンパイルすると「メソッドま...
-
VBAからPDFファイルにパスワー...
-
[VBA]CDOメッセージ送信エラー
-
オブジェクトが見つかりません
-
実行時エラー 3265「要求された...
-
AccessVBA NULLについて
-
Shell.ApplicationのNameSpace...
-
ExcelVBAでのNZ関数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
実行時エラー 3265「要求された...
-
Excelでフィルタをかけると警告...
-
VBAで既に開いている別アプリケ...
-
エクセルマクロエラー「'Cells'...
-
テキストボックス中の文字列の...
-
VBAで Set wb = Sheets(1).Cop...
-
ある文字列が全て数字であるか...
-
VBAからPDFファイルにパスワー...
-
VBScriptでファイルの日時順(降...
-
EXCEL VBA オートシェイプナン...
-
[VBA]CDOメッセージ送信エラー
-
エクセルVBAで2つの画像を比較...
-
PowerPointVBAでスライドマスタ...
-
UserForm1.Showでエラーになり...
-
上下の位置揃えについて
-
VBAについてです。 初心者です...
-
VBAで作成するメール(開封確認...
おすすめ情報