dポイントプレゼントキャンペーン実施中!

皆さん、こんばんは。
ちょっと疑問に感じたものがありましたので質問させてください。

今日のある質問、
内容はセルをシングルクリックした場合と
ダブルクリックした場合のイベントの違い。
その質問に対する次の回答について。

(1)両方のイベントを機能させるとSelectionChangeが先になり
 その後、同セルWクリックでDoubleClickイベントが機能します

(2)SelectionChange のシングル・クリックとBeforeDoubleClickの
 ダブル・クリックとはダブル・クリックの過程にシングル・クリック
 があるので、論理的に、そのイベントは重なってシングル・クリックに
 取られるはずです」


(1)はたぶん回答者の勘違いだろうと思うのでそれはいいのですが、
疑問に感じたのは(2)の方です。
(2)の意味は、ダブルクリックすると必ずシングルクリック
即ちSelectionChangeイベントのみが発生し、
BeforeDoubleClickは発生しないということでしょうか

いままでBeforDoubleClickも発生する場合があると思っていましたので質問しました。
回答者がVBA熟知の方なので当方が何か勘違いしているのかも知れませんが・・・。
以上宜しくお願いいたします。

A 回答 (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とは、併記はしないと、私は思っています。

もちろん、キーボードなどの状態を取って、それで、分岐させる方法はありますが、それは、この件とは内容が違ってきますね。
    • good
    • 0
この回答へのお礼

いつも丁寧な回答ありがとうございます。

>マウスカーソルを同じ場所で動かさないままで、DoubleClickをすれば、DoubleClickイベントが発生します

これで疑問を持ったので質問しました。
アクティブセルをダブルクリックすれば、BeforeDoubleClickイベントが発生するのになぁ、と。

>ふつう、SelectionChangeと、BeforeDoubleClickとは、併記はしないと、私は思っています。

この意味はよーく分かります。

懇切丁寧な回答にほんの数行のレスで申し訳ありませんが、今回の質問をして非常に勉強になりました。

これからも宜しくお願いいたします。

お礼日時:2005/05/01 15:45

あれっ、どっかで見た内容ですが、もしかして当方のものかな?



>(1)はたぶん回答者の勘違いだろうと思うのでそれはいいのですが、

これは、当方が提示した2つのイベントのことですよ。
「シングルクリックイベント」ではありませんよ。

コードを実行してみましたか。 

A1がアクティブセルだったのを、B1をWクリックすると、先にSelectionChangeが、
実行されます。その次にそのB1でWクリックすると初めてSheetBeforeDoubleClick
イベントが実行されるという意味ですよ。
違っていますか?

ちょっと、目についたので・・・ 他の方のレスは、見ていません。

当方に関係なかったら、無視してください。

この回答への補足

どなたの回答も為になる回答でしたので、ポイントは回答順に付けさせて頂くことをお許し願います。

補足日時:2005/05/01 16:46
    • good
    • 0
この回答へのお礼

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さんを始め幾人かの回答は必ず見るように心がけておりますので、
これからも宜しくご指導くださるようお願いいたします。
●今回はほんとに無礼な発言になり、申し訳ありませんでした●

お礼日時:2005/05/01 16:35

なるほどね。

#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イベントが発生するっていうことですね。
    • good
    • 0
この回答へのお礼

Wendy02さん、2回も親切な回答、感謝します。

papayukaさんのお礼にも書きましたが、
当方のテストコード、Msgbox と
papayukaさんのコード、Debug.Print
これで違いが出るのが分からず、今思案中です。

これからも宜しくお願いいたします。
 

お礼日時:2005/05/01 16:40

SelectionChange イベントは、ワークシートイベントの一つであり、「アクティブなセルの位置が変更された」のを検出します。



なので、通常のマウス操作のクリックイベント(シングルクリック、ダブルクリック)とは意味が違います。

つまり、本当のクリックイベントではなくて、ワークシートイベントを応用したクリックの代用機能でしかありません。

イベントが操作する意味を知って、使い分けないと思い通りの機能を得られません。

1.アクティブなセルでクリック(もどき)は使えない。
2.(SelectionChange併用の場合)アクティブなセル以外では、ダブルクリックは使えない。

この回答への補足

どなたの回答も為になる回答でしたので、ポイントは回答順に付けさせてもらうことをお許し願います。

補足日時:2005/05/01 16:43
    • good
    • 0
この回答へのお礼

hana-hana3さん、分かり易い回答ありがとうございます。

クリックもどき、まさにその通りですね。
今回は(毎度のことですが)勉強させていただきました。

これからも宜しくお願いいたします。

お礼日時:2005/05/01 16:19

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
    • good
    • 0
この回答へのお礼

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つのイベントについてはちゃんと理解できたと思います。
今回は貴重な時間を割いていただきありがとうございました。
これからも宜しくお願いいたします。

お礼日時:2005/05/01 16:13

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

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


このQ&Aを見た人がよく見るQ&A