【先着1,000名様!】1,000円分をプレゼント!

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

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

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

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


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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL(VBA) セルをクリックしたときの処理

何度もお世話になります。

A5:A20のどれかをクリックしたときに
クリックしたセルが値が入力済みか確認してから
ファイルを名前を付けて保存したいのですが
クリックしたという情報(イベント?)の取得方法が
わかりません。

(1)どのようにチェックすればよいのでしょうか?
(2)また、皆さんはどのようにしてこのような問題を解決してるのでしょうか?

よろしくお願いします。

Aベストアンサー

Sheet1だとして、
Sheet1のマクロで

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
If Target.Column = 1 And Target.Row >= 5 And Target.Row <= 20 Then
If Target.Value <> "" Then MsgBox "入力済み"
End If
'
End Sub

と入れると、クリックしたセルがA5からA20のどれかで
かつセルに値が入っているときのみ”入力済み”とメッセージが表示されます。
このメッセージ表示の部分を、「名前を付けて保存」の処理に置き換えてはいかがでしょうか。

QExcel VBAでマウスの左クリックのイベントを検知するには

お世話になります。

ExcelのVBAを利用して、マウスが左クリックされた際、そのイベントを
検知する方法はありますでしょうか?

使用しているExcelは2003です。

よろしくお願いします。

Aベストアンサー

■ マウスやキーボードのイベントを取得する
http://home.att.ne.jp/zeta/gen/excel/c04p07.htm

こちらが参考になりそうです。

Qエクセル2007で あるセルをクリックするとチェックマークが入るように

エクセル2007で あるセルをクリックするとチェックマークが入るように出来ますか?

探しては見ましたがわかりませんでした。

どなたか お分かりになる方いましたら 教えてください。

Aベストアンサー

VBAは大丈夫ですか?
シートラベルを右クリックし、メニューの「コードの表示」でVBEが表示されます。
コードウインドウに下記コードをコピペしてください。
A1:A10で空白セルをダブルクリックすればチェック記号が表示されます。
チェック記号が表示されたセルをダブルクリックすれば消去されます。
対象セル範囲は実際に合わせて書き換えてください。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("A1:A10")) Is Nothing = False Then
Cancel = True
If Target.Value = ChrW(10003) Then
Target.ClearContents
Else
Target.Value = ChrW(10003)
End If
End If
End Sub

VBAは大丈夫ですか?
シートラベルを右クリックし、メニューの「コードの表示」でVBEが表示されます。
コードウインドウに下記コードをコピペしてください。
A1:A10で空白セルをダブルクリックすればチェック記号が表示されます。
チェック記号が表示されたセルをダブルクリックすれば消去されます。
対象セル範囲は実際に合わせて書き換えてください。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("A1:A10")) Is Nothing = Fal...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QエクセルVBAでテキストボックスの値の取得と変更について

エクセルのVBAを使ってシート上のテキストボックスのテキストを取得・変更するマクロを作成したいと思っていますがうまく行きませんので、お知恵を拝借したいとおもいます。

環境:WindowsXPでオフィス2002
状況:
エクセルブックa.xlsのシートに「コントロールツールボックス」のテキストボックスを配置(オブジェクト名はTEXTBOX_C)
エクセルブックb.xlsにコードを書き、a.xlsのTEXTBOX_CのプロパティのValueかTextを取りだしたい

試した事:
コントロールを配置したシートに次のマクロ
TEXTBOX_C.Text = "これはコントロールのテキストボックス"
を書くとテキストボックスに文字を入れ込めますが、別のエクセルブックからだと上手く行きません。

また、オートシェイプのテキストボックスの場合は簡単に出きるのですが、コントロールツールボックスではどうしても上手く行きませんので、対象法などご存知の方いらっしゃいましたら教えてください

Aベストアンサー

エクセルを新規に開きました。
そのSheet1に(コントロールツールボックスの)TextBoxを貼りつけました。
そのBook1から、ファイル-開くで別ブックを開きました。
別ブックのMojule1側に下記を書いて
Sub test02()
MsgBox Workbooks("book1").Worksheets("sheet1").textbox1.Text
End Sub
を実行すると、Book1のTextBoxに入れた文字列が表示
されました。
がそんな質問ではないのですか。

QExcelVBAでセルをクリックしてユーザーフォームを表示するには

OfficeExcel2003を使用しています。
ユーザーフォームのテキストボックスやコンボボックスに文字や数値を入力し、OKボタンを押せばエクセルのセルに記入できるようにしようと思ってます。
フォームはなんとか(形だけですが..)作成できたのですが、そのフォームを呼び出す方法として、入力したい行のA列のセルをクリックすればユーザーフォームが表示されるようにしたいのです。
ネット上でいろいろ検索してみましたがなかなか見つけることができませんでした。
初歩的な質問かもわかりませんが、教えて頂けないでしょうか。
宜しくお願い致します。

Aベストアンサー

シートモジュールに下記を入れる。
A列をダブルクリックするとユーザーフォームが起動
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column <> 1 Then Exit Sub
UserForm1.Show
End Sub

QExcelで、「特定のセルの値が変わったらマクロを実行する」という設定はできないでしょうか。

タイトルの通りです。
Excelで、「特定のセルの値が変わったらマクロを実行する」という設定はできないでしょうか。
ご存知の方がいらっしゃいましたら教えて下さい。

Aベストアンサー

WorksheetのChangeイベントで出来ます。
イベントの引数で値の変わったセルのRangeオブジェクトがわたってくるので、マクロを実行させることができます。

QエクセルVBAでOptionButtonのオンオフ取得

ワークシート上に貼り付けてあるオプションボタンの状態の取得ですが、フォームのオプションボタンなら
例えば、
MsgBox ActiveSheet.OptionButtons("Option Button 44").Value で、オンなら1、オフなら-4146が返ります。
またActiveSheet.OptionButtons("Option Button 44").Value=xlOnで オンに出来ます。

ところがフォームじゃないコントロールツールボックスのオプションボタンは
MsgBox ActiveSheet.Shapes("OptionButton30").Valueでも
MsgBox ActiveSheet.Controls("OptionButton30").Valueでもエラーになります。
どうやって取得すればいいのでしょうか?
どうやてOn Off を指示すればいいのでしょうか?

Aベストアンサー

同一ワークシート内にオプションボタン1つ、コマンドボタン一つを配置して、コマンドボタンに、現在のオプションボタンの値をMSGBOXで表示させ、その後OFF(False)にするようなサンプルを作って、Excel2000で試してみました。

Private Sub CommandButton1_Click()
MsgBox OptionButton1.Value
OptionButton1.Value= False
End Sub

というコードです。
とりわけ問題なく動作しました。
LinkCellを指定するかどうか、複数配置かどうかで微妙に動作が異なるようです。

参考までに。

Qセルをマクロのボタンにしたい。

VBA初心者です。
いつもボタンを作って、マクロを起動させていますが、たしか、エクセルシートのセルそのものをボタンにする方法があったと思います。

教えてください。

Aベストアンサー

>セルそのものをボタンにする方法
表現があいまいですが
(1)クリック(結果的に(4)と同じ。正確にはこのイベントなし)
(2)ダブルクリック
(3)右クリック
(4)選択
のイベントを捉えて、指定したモジュールを実行できます。
一般の操作とと紛らわしい(1)、(4)は避けて(2)ぐらいが適当かと思います。セルの背景色。値(Captionの代わり)でもはっきり目立たせる方が適当。
ーー
そのセルに、ダブルクリック効果を限定するために、Targetセルの番地のをチェックして、それ以外はパスする。
ーー
D1セルをボタンの代用にする例
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not (Target.Row = 1 And Target.Column = 4) Then Exit Sub
shori
End Sub
Sub shori()
MsgBox "処理 しました "
End Sub

>セルそのものをボタンにする方法
表現があいまいですが
(1)クリック(結果的に(4)と同じ。正確にはこのイベントなし)
(2)ダブルクリック
(3)右クリック
(4)選択
のイベントを捉えて、指定したモジュールを実行できます。
一般の操作とと紛らわしい(1)、(4)は避けて(2)ぐらいが適当かと思います。セルの背景色。値(Captionの代わり)でもはっきり目立たせる方が適当。
ーー
そのセルに、ダブルクリック効果を限定するために、Targetセルの番地のをチェックして、それ以外はパ...続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?


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

このカテゴリの人気Q&Aランキング