皆さん、こんばんは。
ちょっと疑問に感じたものがありましたので質問させてください。
今日のある質問、
内容はセルをシングルクリックした場合と
ダブルクリックした場合のイベントの違い。
その質問に対する次の回答について。
(1)両方のイベントを機能させるとSelectionChangeが先になり
その後、同セルWクリックでDoubleClickイベントが機能します
(2)SelectionChange のシングル・クリックとBeforeDoubleClickの
ダブル・クリックとはダブル・クリックの過程にシングル・クリック
があるので、論理的に、そのイベントは重なってシングル・クリックに
取られるはずです」
(1)はたぶん回答者の勘違いだろうと思うのでそれはいいのですが、
疑問に感じたのは(2)の方です。
(2)の意味は、ダブルクリックすると必ずシングルクリック
即ちSelectionChangeイベントのみが発生し、
BeforeDoubleClickは発生しないということでしょうか
いままでBeforDoubleClickも発生する場合があると思っていましたので質問しました。
回答者がVBA熟知の方なので当方が何か勘違いしているのかも知れませんが・・・。
以上宜しくお願いいたします。
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とは、併記はしないと、私は思っています。
もちろん、キーボードなどの状態を取って、それで、分岐させる方法はありますが、それは、この件とは内容が違ってきますね。
いつも丁寧な回答ありがとうございます。
>マウスカーソルを同じ場所で動かさないままで、DoubleClickをすれば、DoubleClickイベントが発生します
これで疑問を持ったので質問しました。
アクティブセルをダブルクリックすれば、BeforeDoubleClickイベントが発生するのになぁ、と。
>ふつう、SelectionChangeと、BeforeDoubleClickとは、併記はしないと、私は思っています。
この意味はよーく分かります。
懇切丁寧な回答にほんの数行のレスで申し訳ありませんが、今回の質問をして非常に勉強になりました。
これからも宜しくお願いいたします。
No.5
- 回答日時:
あれっ、どっかで見た内容ですが、もしかして当方のものかな?
>(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さんを始め幾人かの回答は必ず見るように心がけておりますので、
これからも宜しくご指導くださるようお願いいたします。
●今回はほんとに無礼な発言になり、申し訳ありませんでした●
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イベントが発生するっていうことですね。
Wendy02さん、2回も親切な回答、感謝します。
papayukaさんのお礼にも書きましたが、
当方のテストコード、Msgbox と
papayukaさんのコード、Debug.Print
これで違いが出るのが分からず、今思案中です。
これからも宜しくお願いいたします。
No.3
- 回答日時:
SelectionChange イベントは、ワークシートイベントの一つであり、「アクティブなセルの位置が変更された」のを検出します。
なので、通常のマウス操作のクリックイベント(シングルクリック、ダブルクリック)とは意味が違います。
つまり、本当のクリックイベントではなくて、ワークシートイベントを応用したクリックの代用機能でしかありません。
イベントが操作する意味を知って、使い分けないと思い通りの機能を得られません。
1.アクティブなセルでクリック(もどき)は使えない。
2.(SelectionChange併用の場合)アクティブなセル以外では、ダブルクリックは使えない。
hana-hana3さん、分かり易い回答ありがとうございます。
クリックもどき、まさにその通りですね。
今回は(毎度のことですが)勉強させていただきました。
これからも宜しくお願いいたします。
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
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が見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
都道府県穴埋めゲーム
都道府県の名前を1人1つずつ投稿してください。全ての都道府県が出たら締め切ります!
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
VBA:結合されたセルに対する「Target」について
Access(アクセス)
-
シートのクリックイベントは拾えないのか?
Excel(エクセル)
-
(エクセルVBA)セルを左クリックしたら実行させるには?
Excel(エクセル)
-
-
4
エクセルマクロ セルをクリックするたびに記号を入力
Excel(エクセル)
-
5
EXCEL(VBA) セルをクリックしたときの処理
Excel(エクセル)
-
6
Excelの入力規則で2列表示したい
Excel(エクセル)
-
7
【EXCEL VBA】オートシェイプをクリックした時にそのオートシェイプの名前を取得したい
Visual Basic(VBA)
-
8
VBAでセルをクリックする回数で表示が変わる
その他(プログラミング・Web制作)
-
9
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
10
エクセルVBAで選択状態を解除のしかた
Excel(エクセル)
-
11
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
12
XL:BeforeDoubleClickが動かない
その他(プログラミング・Web制作)
-
13
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
14
Excelでセルをクリックするたびに表示を切り替えるには?
Excel(エクセル)
-
15
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
16
エクセルでセルをクリックすると“○”と入力
Excel(エクセル)
-
17
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
18
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
19
特定の名前のオートシェイプの有無を知りたい(エクセルVBA)
Excel(エクセル)
-
20
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access レポート印刷するときに...
-
ACCESS VBA でのエラー解決の根...
-
Access Error3061 パラメータが...
-
Accessレポートのチェックボッ...
-
access クエリ yes/no型のクエ...
-
access2021 強制終了してしまう
-
accessでlaccdbファイルが削除...
-
Accessでセレクタをダブルクリ...
-
access2019の起動が遅い
-
access2021 VBA メソッドまたは...
-
実行時エラー3131 FROM 句の構...
-
access2021 コンパイルエラーの...
-
Access runtimeでのオプション...
-
【Access】Dcount関数の複数条...
-
Accessでフォームに自動入力し...
-
Access VBA [リモートサーバー...
-
【至急・画像あり】建物or住所...
-
Microsoft365にAccessってあり...
-
Accessのスプレッドシートエク...
-
テキストボックスの値をテーブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access レポート印刷するときに...
-
access2021 強制終了してしまう
-
Accessのクエリで、replace関数...
-
accessでlaccdbファイルが削除...
-
【Access】Dcount関数の複数条...
-
Access Error3061 パラメータが...
-
Accessのスプレッドシートエク...
-
ACCESS VBA でのエラー解決の根...
-
Accessレポートのチェックボッ...
-
実行時エラー3131 FROM 句の構...
-
access2019の起動が遅い
-
Vba Userformを前面に出すについて
-
Microsoft365にAccessってあり...
-
教えてください! アクセスの書...
-
Access 複数条件検索の設定が上...
-
【至急・画像あり】建物or住所...
-
Access VBA [リモートサーバー...
-
access2021 レコードロックの使...
-
Access VBA を利用して、フォル...
-
Accessのリンクテーブルのパス...
おすすめ情報