こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

マウスイベントが動かない

エクセルシートのダブルクリック イベントで 
Call マウス左クリック 
とします。

ret = SetCursorPos(929, 12) カーソル移動と
SendKeys " 12345"
は動くのですが
mouse_event 2, 0, 0, 0, 0 '左ダウン
mouse_event 4, 0, 0, 0, 0 '左アップ
この二つが 動いてくれません。

遅延させるタイマー入れたり、するのですが同じです。
MODULE の中に入れたり、シートの中に入れても 同じです。

どこが、問題なのでしょうか
よろしくどうぞ


Sub タイミング()
stime = gettickcount
Do While gettickcount - stime < 1000
DoEvents
Loop

Sub マウス左クリック()
ret = SetCursorPos(929, 12)
mouse_event 2, 0, 0, 0, 0 '左ダウン
mouse_event 4, 0, 0, 0, 0 '左アップ
ret = SetCursorPos(309, 282)
SendKeys " 12345"
ret = SetCursorPos(309, 320)
SendKeys " 12345"
SendKeys " {ENTER}"
SendKeys " %(RY)", True


Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Type POINTAPI
X As Long
Y As Long
End Type  ’位置取得
'------------------------------------------------------------------
Private Declare Sub mouse_event Lib "user32" _
(ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As _
Long, ByValcButtons As Long, ByVal dwExtraInfo As Long)

Public Declare Function SetCursorPos Lib "user32" _
(ByVal X As Long, ByVal Y As Long) As Long

投稿日時 - 2011-10-10 19:55:37

QNo.7063440

暇なときに回答ください

質問者が選んだベストアンサー

すべてを標準モジュールに書いてみました。
実行開始はシート1に置いた「角丸四角形」にマクロの登録をして、これをクリックします。

Option Explicit

Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Type POINTAPI
X As Long
Y As Long
End Type '位置取得
'------------------------------------------------------------------
Private Declare Sub mouse_event Lib "user32" _
(ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As _
Long, ByValcButtons As Long, ByVal dwExtraInfo As Long)

Public Declare Function SetCursorPos Lib "user32" _
(ByVal X As Long, ByVal Y As Long) As Long

Public Declare Function GetTickCount Lib "kernel32" () As Long

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Sub 角丸四角形1_Click()
Call タイミング
Call マウス左クリック
End Sub

Sub タイミング()
'ここはわずらわしいのでSleepに変えました。
'Dim stime As Long
'stime = GetTickCount
'Do While GetTickCount - stime < 1000
'DoEvents
'Loop
Sleep 1000
End Sub

Sub マウス左クリック()
Dim ret As Long

ret = SetCursorPos(929, 12)
mouse_event 2, 0, 0, 0, 0 '左ダウン
mouse_event 4, 0, 0, 0, 0 '左アップ
'ret = SetCursorPos(309, 282)
Sleep 500
SendKeys " 12345"
ret = SetCursorPos(309, 320)
SendKeys " 12345"
SendKeys " {ENTER}"
SendKeys " %(RY)", True
DoEvents: DoEvents: DoEvents

End Sub

これでペイントの右上のボタンをクリックさせ
セルに12345を2回表示させました。
2010版のせいかSendKeys " %(RY)", Trueは校閲らしいのですがYがわかりませんでした。
Excelのどの版でも正常に動作すると思いますので、理解を進めてください。

なおシートのセルをダブルクリックして開始させる場合は
上記の角丸四角形・・のところを変えます。
(あるいはそのまま残しておけばどちらからでも実行できます。)
Worksheet_BeforeDoubleClickイベントを使い下記のようにします。

Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Call タイミング
Call マウス左クリック
End Sub

投稿日時 - 2011-10-11 13:02:30

お礼

ありがとうございます。

クリックイベントの前に少し 時間を入れてやると OKでした。
お世話様でした。感謝

投稿日時 - 2011-10-11 16:19:16

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

SetCursorPos(929, 12)
この座標は正しいですか。
古いXP機の1024x800モニターで、該当のWindowが最大化されている状態の時の
「最小化」か「最大化:元に戻す」あたりだと思いますが・・・。
(スクリーン座標とOfficeのピクセル座標の関係はかなり難しいので、メニューだけ表示させるとか最大化しておくとかしないとちょっとしたことでうまく動作させられなくなります。)

プログラムは最初の部分以外を標準モジュールに書いてあるみたいなので無関係と思いますが
Private Declare Sub mouse_event Lib ・・・・・
これだけprivate宣言してあるのは間違えやすいので他とそろえるようにしたほうがいいです。

投稿日時 - 2011-10-11 07:47:31

お礼

ありがとうございます。
座標軸は間違っていないと思います(で、座標軸取り込む部分も記載しました)
現状、マウスがとんだ状態で、クリックすれば予定通りですので、

で、ぶっちゃけ、いろいろなところからのコピペゆえ

Private Declare Sub mouse_event Lib ・・・・・
これだけprivate宣言してあるのは・・・

どう直せばいいでしょ?? 恐縮ですが

置く場所を 間違ったかな?

投稿日時 - 2011-10-11 10:58:11

あなたにオススメの質問