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

Excel VBA で、ユーザーフォームをクリックしたときのポインタのクライアント座標を取得し、フォーム上のラベルに表示するというスクリプトを作ろうと思っています。

ウェブで探し当てたVBのソースなどを参考にして、スクリーン座標を取得するところまではうまくいきましたが、「ScreenToClient」関数の書式がVB のソースと同じでは動かないようで、「コンパイルエラー:メソッドまたはデータメンバがみつかりません」というエラー表示が出て止まってしまいます(「Me」を「UserForm1」に代えても結果は同じでした)。

以下は実際のVBAソースです。どのようにすれば動くようになるのか、ご教示頂けませんでしょうか。宜しくお願いします。


'カーソルの位置座標をスクリーン座標で取得するAPI関数
Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINT) As Long
'カーソルの位置座標をスクリーン座標からクライアント座標へ変換するAPI関数
Private Declare Function ScreenToClient Lib "user32" _
(ByVal hWnd As Long, lpPoint As POINT) As Long

'カーソルの位置座標用変数
Private CuP As POINT

'位置座標を受け取る構造体
Private Type POINT
x As Long
y As Long
End Type


Private Sub UserForm_Click()
'スクリーン座標を取得
GetCursorPos CuP
Label1.Caption = "クリック位置のスクリーン座標 X=" & CuP.x & " Y=" & CuP.y

'↑ここまではうまく動いています

'クライアント座標に変換
ret = ScreenToClient(Me.hWnd, CuP)
Label2.Caption = "クリック位置のクライアント座標 X=" & CuP.x & " Y=" & CuP.y

End Sub

A 回答 (1件)

UserFormにはhWndプロパティはありません


ウィンドウハンドルを独自に取得しなければいけません

FindWindowで探すことにより ScreenToClientを使用出来ます

Private Declare Function FindWindow Lib "user32" alias "FindWindowA" _
(ByVal sClass as String, ByVal sTitle as String) as Long
とAPIを定義して

Dim hWndForm as Long
' ユーザーフォームのCaptionをsTitleに渡す
hWNdForm = FindWindow( vbNullString, "UserForm1" )
ret = ScreenToCLient( hWndForm, CuP )

といった具合にします
    • good
    • 0
この回答へのお礼

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

そういうことだったんですね。思っていた通りの動きをしてくれました!
本当に助かりました。有難うございました。

お礼日時:2008/01/24 19:01

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

このQ&Aを見た人はこんなQ&Aも見ています