- ベストアンサー
シングルクリックとダブルクリックのイベントについて
皆さん、こんばんは。 ちょっと疑問に感じたものがありましたので質問させてください。 今日のある質問、 内容はセルをシングルクリックした場合と ダブルクリックした場合のイベントの違い。 その質問に対する次の回答について。 (1)両方のイベントを機能させるとSelectionChangeが先になり その後、同セルWクリックでDoubleClickイベントが機能します (2)SelectionChange のシングル・クリックとBeforeDoubleClickの ダブル・クリックとはダブル・クリックの過程にシングル・クリック があるので、論理的に、そのイベントは重なってシングル・クリックに 取られるはずです」 (1)はたぶん回答者の勘違いだろうと思うのでそれはいいのですが、 疑問に感じたのは(2)の方です。 (2)の意味は、ダブルクリックすると必ずシングルクリック 即ちSelectionChangeイベントのみが発生し、 BeforeDoubleClickは発生しないということでしょうか いままでBeforDoubleClickも発生する場合があると思っていましたので質問しました。 回答者がVBA熟知の方なので当方が何か勘違いしているのかも知れませんが・・・。 以上宜しくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
StudyVBAさん、こんばんは。 私の書いた内容では、納得されなかったようですね。 シングルクリックのイベントは、ワークシート上では、SelectionChangeになりますが、そのイベントが発生して、ダブルクリック・イベントまでには至らない、ということで、別の言葉で表現すれば、同時に起動することはない、ということだったのですが。 論より証拠です。 私の考えた簡単なサンプル '----------------------------------------------- Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "SelectionChange" End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) MsgBox "DoubleClick" Cancel = True End Sub '----------------------------------------------- ただし、SelectionChangeが発生しない条件が1つありますね。 それは、マウスカーソルを同じ場所で動かさないままで、DoubleClickをすれば、DoubleClickイベントが発生します。それを、あえて知って行うかどうかは、そのユーザーの判断になりますが、例えば、SelectionChangeのイベントを一旦、発生させてしまって、それをキャンセルさせて、さらに、もう一度、マウスカーソルを動かさないで、ダブルクリックで、DoubleClickイベントを発生させるのは、私は、それを実用度としては、かなり低いのではないと思いましたので、特に、取り上げはしませんでした。 ふつう、SelectionChangeと、BeforeDoubleClickとは、併記はしないと、私は思っています。 もちろん、キーボードなどの状態を取って、それで、分岐させる方法はありますが、それは、この件とは内容が違ってきますね。
その他の回答 (4)
- ja7awu
- ベストアンサー率62% (292/464)
あれっ、どっかで見た内容ですが、もしかして当方のものかな? >(1)はたぶん回答者の勘違いだろうと思うのでそれはいいのですが、 これは、当方が提示した2つのイベントのことですよ。 「シングルクリックイベント」ではありませんよ。 コードを実行してみましたか。 A1がアクティブセルだったのを、B1をWクリックすると、先にSelectionChangeが、 実行されます。その次にそのB1でWクリックすると初めてSheetBeforeDoubleClick イベントが実行されるという意味ですよ。 違っていますか? ちょっと、目についたので・・・ 他の方のレスは、見ていません。 当方に関係なかったら、無視してください。
お礼
ja7awuさん、何とお詫びしていいやら、I've no words です。(^^;;; 当方の次のコードでテストしました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "Single" End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MsgBox "Double" End Sub これでアクティブセルをクリックすると"Double"が表示され、 またアクティブセル以外をダブルクリックすると"Single"が表示され、 そのmsgbox のOKボタンを押しても、"Double"が表示されないので アクティブセル以外をダブルクリックしても SelectionChange > BeforDouble と2つのイベントは起こらないと勝手に判断し、その点は無視したような質問になりました。 今回、papayukaさんのコードで、msgbox を debug.printにしてあるコードで試してみたところ、 仰るように2つのイベントが順に発生していました。 Msgboxの時はSelectionChangeのみ発生し、 Debug.printの時は2つのイベントが発生しているのはなぜか今思案中です。 ja7awuさんを始め幾人かの回答は必ず見るように心がけておりますので、 これからも宜しくご指導くださるようお願いいたします。 ●今回はほんとに無礼な発言になり、申し訳ありませんでした●
補足
どなたの回答も為になる回答でしたので、ポイントは回答順に付けさせて頂くことをお許し願います。
- Wendy02
- ベストアンサー率57% (3570/6232)
なるほどね。#2 のpapayukaさんの >A1を選択した状態で、C1をダブルクリックすると、SelectionChange → >BeforeDoubleClick の順にイベントが発生します。 一応、Debug.Print に、時間を表示するように入れてみました。 ちょっと不安に感じたので、papayukaさんのコードに加えて、別の仕事をさせてみました。 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Worksheet_SelectionChange(ByVal Target As Range) Debug.Print "Selection: " & Target.Address & _ " " & Mid$(Format(Time, "hh:mm:ss"), 4) Beep Sleep 1000 'Application.Wait Now + TimeValue("00:00:01") 'こういうのは、API関数でないと私のPCではうまく行かない。 End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True Debug.Print "DoubleClick: " & Target.Address & _ " " & Mid$(Format(Time, "hh:mm:ss"), 4) For i = 1 To 2 Beep Sleep 1000 Next i End Sub Debug.Print の内容 Selection: $A$1 45:17 ↓(SelectionChange) Selection: $C$1 45:18 DoubleClick: $C$1 45:19 正しく、C1で、チャイムが3回鳴りました。 こういうことがあるのですね。私の前言を訂正しなくてはいけませんね。私の知っている範囲では、同時にはイベントは動かないから併用はしない、ということでしたから。この働きは、正確には、Selection は、クリックではなく、移動によって到着点のC1 でイベントが一回発生し、次に、同じ場所でダブルクリックすれば、BeforeDoubleClickイベントが発生するっていうことですね。
お礼
Wendy02さん、2回も親切な回答、感謝します。 papayukaさんのお礼にも書きましたが、 当方のテストコード、Msgbox と papayukaさんのコード、Debug.Print これで違いが出るのが分からず、今思案中です。 これからも宜しくお願いいたします。
- hana-hana3
- ベストアンサー率31% (4940/15541)
SelectionChange イベントは、ワークシートイベントの一つであり、「アクティブなセルの位置が変更された」のを検出します。 なので、通常のマウス操作のクリックイベント(シングルクリック、ダブルクリック)とは意味が違います。 つまり、本当のクリックイベントではなくて、ワークシートイベントを応用したクリックの代用機能でしかありません。 イベントが操作する意味を知って、使い分けないと思い通りの機能を得られません。 1.アクティブなセルでクリック(もどき)は使えない。 2.(SelectionChange併用の場合)アクティブなセル以外では、ダブルクリックは使えない。
お礼
hana-hana3さん、分かり易い回答ありがとうございます。 クリックもどき、まさにその通りですね。 今回は(毎度のことですが)勉強させていただきました。 これからも宜しくお願いいたします。
補足
どなたの回答も為になる回答でしたので、ポイントは回答順に付けさせてもらうことをお許し願います。
- papayuka
- ベストアンサー率45% (1388/3066)
VBAに精通してませんが、、、 そもそも、SelectionChange は シングルクリックを拾う処理では無いですよね? Selection が Change していなければ、クリックしても発生しませんから。 A1を選択した状態で、A1をクリックしても SelectionChange は呼ばれません。 A1を選択した状態で、A1をダブルクリックをするとBeforeDoubleClickが呼ばれます。 A1を選択した状態で、C1をダブルクリックすると、SelectionChange → BeforeDoubleClick の順にイベントが発生します。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Debug.Print "Selection: " & Target.Address End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Debug.Print "DoubleClick: " & Target.Address End Sub
お礼
papayukaさん、的を射た回答ありがとうございます。 当方のテストの仕方が悪かったみたいです。次のコードでテストしました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "Single" End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MsgBox "Double" End Sub これでアクティブセルをクリックすると"Double"が表示され、 またアクティブセル以外をダブルクリックすると"Single"が表示され、 そのmsgbox のOKボタンを押しても、"Double"が表示されないので アクティブセル以外をダブルクリックしても SelectionChange > BeforDouble と2つのイベントは起こらないと勝手に判断し、その点は無視したような質問になりました。 今回、papayukaさんのコードで試してみたところ、2つのイベントが発生していました。 Msgboxの時はSelectionChangeのみ発生し、 Debug.printの時は2つのイベントが発生しているのはなぜか今思案中です。 今回の質問したことにより、2つのイベントについてはちゃんと理解できたと思います。 今回は貴重な時間を割いていただきありがとうございました。 これからも宜しくお願いいたします。
お礼
いつも丁寧な回答ありがとうございます。 >マウスカーソルを同じ場所で動かさないままで、DoubleClickをすれば、DoubleClickイベントが発生します これで疑問を持ったので質問しました。 アクティブセルをダブルクリックすれば、BeforeDoubleClickイベントが発生するのになぁ、と。 >ふつう、SelectionChangeと、BeforeDoubleClickとは、併記はしないと、私は思っています。 この意味はよーく分かります。 懇切丁寧な回答にほんの数行のレスで申し訳ありませんが、今回の質問をして非常に勉強になりました。 これからも宜しくお願いいたします。