• ベストアンサー

シングルクリックとダブルクリックのイベントについて

皆さん、こんばんは。 ちょっと疑問に感じたものがありましたので質問させてください。 今日のある質問、 内容はセルをシングルクリックした場合と ダブルクリックした場合のイベントの違い。 その質問に対する次の回答について。 (1)両方のイベントを機能させるとSelectionChangeが先になり  その後、同セルWクリックでDoubleClickイベントが機能します (2)SelectionChange のシングル・クリックとBeforeDoubleClickの  ダブル・クリックとはダブル・クリックの過程にシングル・クリック  があるので、論理的に、そのイベントは重なってシングル・クリックに  取られるはずです」 (1)はたぶん回答者の勘違いだろうと思うのでそれはいいのですが、 疑問に感じたのは(2)の方です。 (2)の意味は、ダブルクリックすると必ずシングルクリック 即ちSelectionChangeイベントのみが発生し、 BeforeDoubleClickは発生しないということでしょうか いままでBeforDoubleClickも発生する場合があると思っていましたので質問しました。 回答者がVBA熟知の方なので当方が何か勘違いしているのかも知れませんが・・・。 以上宜しくお願いいたします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

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とは、併記はしないと、私は思っています。 もちろん、キーボードなどの状態を取って、それで、分岐させる方法はありますが、それは、この件とは内容が違ってきますね。

StudyVBA
質問者

お礼

いつも丁寧な回答ありがとうございます。 >マウスカーソルを同じ場所で動かさないままで、DoubleClickをすれば、DoubleClickイベントが発生します これで疑問を持ったので質問しました。 アクティブセルをダブルクリックすれば、BeforeDoubleClickイベントが発生するのになぁ、と。 >ふつう、SelectionChangeと、BeforeDoubleClickとは、併記はしないと、私は思っています。 この意味はよーく分かります。 懇切丁寧な回答にほんの数行のレスで申し訳ありませんが、今回の質問をして非常に勉強になりました。 これからも宜しくお願いいたします。

その他の回答 (4)

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.5

あれっ、どっかで見た内容ですが、もしかして当方のものかな? >(1)はたぶん回答者の勘違いだろうと思うのでそれはいいのですが、 これは、当方が提示した2つのイベントのことですよ。 「シングルクリックイベント」ではありませんよ。 コードを実行してみましたか。  A1がアクティブセルだったのを、B1をWクリックすると、先にSelectionChangeが、 実行されます。その次にそのB1でWクリックすると初めてSheetBeforeDoubleClick イベントが実行されるという意味ですよ。 違っていますか? ちょっと、目についたので・・・ 他の方のレスは、見ていません。 当方に関係なかったら、無視してください。

StudyVBA
質問者

お礼

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

StudyVBA
質問者

補足

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

なるほどね。#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イベントが発生するっていうことですね。

StudyVBA
質問者

お礼

Wendy02さん、2回も親切な回答、感謝します。 papayukaさんのお礼にも書きましたが、 当方のテストコード、Msgbox と papayukaさんのコード、Debug.Print これで違いが出るのが分からず、今思案中です。 これからも宜しくお願いいたします。  

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

SelectionChange イベントは、ワークシートイベントの一つであり、「アクティブなセルの位置が変更された」のを検出します。 なので、通常のマウス操作のクリックイベント(シングルクリック、ダブルクリック)とは意味が違います。 つまり、本当のクリックイベントではなくて、ワークシートイベントを応用したクリックの代用機能でしかありません。 イベントが操作する意味を知って、使い分けないと思い通りの機能を得られません。 1.アクティブなセルでクリック(もどき)は使えない。 2.(SelectionChange併用の場合)アクティブなセル以外では、ダブルクリックは使えない。

StudyVBA
質問者

お礼

hana-hana3さん、分かり易い回答ありがとうございます。 クリックもどき、まさにその通りですね。 今回は(毎度のことですが)勉強させていただきました。 これからも宜しくお願いいたします。

StudyVBA
質問者

補足

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

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

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

StudyVBA
質問者

お礼

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

関連するQ&A

  • シートのクリックイベントは拾えないのか?

    ExcelのVBAに関する質問です。 さきほど「セルをクリック、またはダブルクリックしたときに○○したい」という質問に回答したのですが、「セルをクリックした」というイベントを拾う方法がわからず、ダブルクリックのパターンで回答しました。 Worksheetのイベントには BeforeDobuleClick や BeforeRightClick はあるのに Click や onClick というイベントがありません。オートシェイプなどのオブジェクトやフォーム上のオブジェクトには Click イベントがあるのですが、Worksheet になぜかありません。 これまでも同様のケースがあり、ネットで検索したりしたのですが、どれも SelectionChange で代用するものでした。それだと確かにマウスで別セルを選択したときにイベントが発生しますが、 ・キーボード操作でセルを移動してもイベントが発生する ・現在選択しているセルをクリックしてもイベントが発生しない と、厳密はマウスでクリックしたときと同じ動作になりません。 確か以前の質問で「あるセルをクリックするたびに、他のセルの値をカウントアップしたい」というようなものもありました。このような場合には、やはり Click に相当するようなイベントで処理したいです。 どうにかしてWorksheetでクリックイベントを拾うことはできないのでしょうか?

  • 《VBA》セルをダブルクリックしたときのイベント

    Worksheet/BeforeDoubleClickを使用して、 フォームを表示するという処理を行っています。 エクセルのセルにリストボックスが設定されているセルがあるのですが、 リストボックスのセルをダブルクリックした時にはイベントが動作しません。 通常のセルをダブルクリックした時にはイベントは正常に動作します。 リストボックスが設定されているセルでは動作することができないのでしょうか。

  • ダブルクリックイベント

    シート数がかなり多数のエクセルファイルがあるのですが、全てのシートにダブルクリックイベントを適用させたいと思っています。 Worksheet_BeforeDoubleClickのコードを、全シート分まとめて記述することは可能でしょうか?

  • TextAreaのダブルクリックイベントを発生させるには

    PersonalJavaでPDA(WinCE)用のプログラムを書いて遊ぼうかと考えています。 従ってJDK1.1.8を使うので、Swingは使えません。 VisualBasicではTextBoxをマウスでダブルクリックすることでイベント発生できるのですが、TextAreaには標準ではイベント発生機能が無いようです。 どうプログラミングすれば、TextAreaのダブルクリックイベントを発生させる、もしくは同等の機能を持たせることができるでしょうか?

    • ベストアンサー
    • Java
  • Excelのセルをダブルクリックした時のマクロ

    BeforeDoubleClickイベントで、特定のセルをクリックした場合にマクロを実行する方法についての質問です。 例えば セルC1をダブルクリックするとマクロAが実行 セルC2ををダブルクリックするとマクロBが実行 セルC3ををダブルクリックするとマクロCが実行 と、複数のイベントにそれぞれのマクロを実行させたい場合はどうすればよいのでしょうか。 詳しい方がいましたらアドバイス頂けないでしょうかm(_ _ )m

  • ダブルクリックイベントで良いのかどうか?

    お世話になります。 ダブルクリックイベントで、そのセルを赤く色を塗り、尚且つ、 そのセルをダブルクリックした事により、別のワークブックを開き、 また、開いたワークブックのシートの中からある単語を検索して その属性を現在アクティブにしている、ブックのシートに記入しよう としていますが、 まず、下記の様に、ダブルクリックイベントで、セルを赤く塗るまではうまくいったのですが、別のブックを開く事がうまく出来ません。 記述が悪いのか、または標準モジュールに記述するべきなのか分からなく困っています。 どなたかご教授頂きたく宜しくお願い申し上げます。        記 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim Rng As Range, myRng As Range Set Rng = Range("c2:d2,f2") Set myRng = Intersect(Target, Rng) If myRng Is Nothing Then Exit Sub Rng.Interior.ColorIndex = xlColorIndexNone myRng.Interior.ColorIndex = 3 Cancel = True If Intersect(Target, Range("c2")) Then Workbooks.Open Filename:="C:\Documents and Settings\Owner\デスクトップ\台帳.xls" End If End Sub

  • ダブルクリックをシングルクリックで?

    皆さんいつもありがとうございます。 またアドバイスをお願い致します。 以前こちらで「セルをダブルクリックする度に○→/→×→空白と変更できる」 コードをアドバイスして頂きました。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Select Case Target.Cells(1).Value Case "" Target = "○" Case "○" Target = "/" Case "/" Target = "×" Case "×" Target.ClearContents Case Else Exit Sub End Select Cancel = True End Sub と言うコードですが、これをシングルクリックで変更可能にする事は出来るのでしょうか? 是非アドバイスをお願い致します。

  • エクセル マクロ ダブルクリックのイベント

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As range) というマクロをしても動きません。どうしてでしょうか? 他のsheetchaneとかのマクロは動くのですが・・ (ダブルクリックしてもセルが入力可能な状態になるだけです)

  • ダブルクリック → シングルクリック 

    はじめまして、よろしくお願いします。 質問タイトル ダブルクリック→シングルクリック への変更。  フォルダオプション 全般タブ項目 で  クリック方法で選択しますが、 ポイントで選択し、シングルクリックで開く の項目は、 存在してるが、そこをクリックできません。 シングルクリックへ変更したいのです。 どなた様か、ご存知の方、お教え頂けないでしょうか。 よろしくお願いします。 Dell1300 Inspiron OSXP 

  • ダブルクリックとシングルクリック

    OSはWjondowsXPです。 パソコンを買ったばかりの友人から質問されたのですが、 ダブルクリックとシングルクリックってどうやってみわけるのって聞かれました。 今まで意識したことはなかったのですが、なにか規則制とかポイントをさした時点で判別できるとかあるのでしょうか?

専門家に質問してみよう