
皆さん、こんばんは。
ちょっと疑問に感じたものがありましたので質問させてください。
今日のある質問、
内容はセルをシングルクリックした場合と
ダブルクリックした場合のイベントの違い。
その質問に対する次の回答について。
(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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- Excel(エクセル) 余計なお世話的な「入力規則」?対策は? 2 2023/01/14 12:39
- 教えて!goo 教えて!gooについてです。質問をさせてもらったのですが、初心者で補足とお礼、ベストアンサーの仕方が 1 2022/08/23 08:48
- 写真・ビデオ iphoneからPCへ写真をインポート、保存先がわかりません。 2 2022/09/29 02:06
- Excel(エクセル) 写真を読んで表示したい。 1 2023/04/20 11:24
- 教えて!goo 今日初めて教えてgooで質問し、それに回答してくれた方がいるのですが、お礼?の仕方が分かりません。マ 1 2022/08/06 14:07
- Excel(エクセル) 【Excel】hyperlink関数を解除してもハイパーリンクが活きるようにできますか? 3 2023/05/22 11:22
- ホテル・旅館 ホテルの厚意でのアップグレードの場合 5 2023/06/10 13:18
- インターネットビジネス Google によりアカウントは閉鎖されました 復活させるにはどうすれば? 基本的に無理ですか? 1 2023/08/18 17:04
- 教えて!goo 質問者にブロックされているので、回答することはできません。 18 2022/04/29 13:59
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAでセルをクリックする回数で表示が変わる
その他(プログラミング・Web制作)
-
マクロ1があります。 A1のセルをダブルクリックすると、 マクロ1が動くような仕組みを 作成したいの
その他(Microsoft Office)
-
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
-
4
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
5
クリックイベントなのに、2回クリックしないとフォー
Access(アクセス)
-
6
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
7
リストビューの項目の内容を変更する方法は?
Visual Basic(VBA)
-
8
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
9
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
10
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
11
ListView 項目の選択/選択解除について
Visual Basic(VBA)
-
12
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
13
Excel VBA ListViewサブアイテムの文字色
その他(プログラミング・Web制作)
-
14
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
15
Excel VBAでマウスの左クリックのイベントを検知するには
Visual Basic(VBA)
-
16
VBA:結合されたセルに対する「Target」について
Access(アクセス)
-
17
セルをクリック⇒そのセルに入力された文字を○で囲む
Excel(エクセル)
-
18
VBAでユーザーフォームの表示を確認
Visual Basic(VBA)
-
19
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
-
20
VBA ListViewの選択Itemを削除する
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのクエリで、replace関数...
-
Microsoft 365 Basic サブスク...
-
ACCESS VBA でのエラー解決の根...
-
access2021 VBA メソッドまたは...
-
Accessのスプレッドシートエク...
-
access2021 強制終了してしまう
-
Access VBA [リモートサーバー...
-
列が255以上のCSVファイルをAcc...
-
Accessのレポートについて
-
アクセス レポートを開いたとき...
-
Accessでレポートを印刷する時...
-
Access Error3061 パラメータが...
-
Microsoft365にAccessってあり...
-
アクセス 意図せずサブプロシー...
-
Accessのクエリの結果を、既存...
-
実行時エラー3131 FROM 句の構...
-
Access VBA を利用して、フォル...
-
Accessのリンクテーブルのパス...
-
VBA。リストボックスの値を別の...
-
MS.Access でサブフォーム付の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Microsoft 365 Basic サブスク...
-
Accessのクエリで、replace関数...
-
access2021 強制終了してしまう
-
ACCESS VBA でのエラー解決の根...
-
Access VBA [リモートサーバー...
-
Accessのスプレッドシートエク...
-
Accessのレポートについて
-
access2021 VBA メソッドまたは...
-
Access Error3061 パラメータが...
-
access2019 チェックボックスと...
-
Accessのクエリの結果を、既存...
-
accessでlaccdbファイルが削除...
-
Access VBA を利用して、フォル...
-
accessデータを指定したExcel、...
-
Accessのリンクテーブルのパス...
-
列が255以上のCSVファイルをAcc...
-
Accessのクエリの印刷設定
-
Accessでレポートを印刷する時...
-
Accessフォームの配色テーマを...
-
Accessデータベースに含まれる...
おすすめ情報