• ベストアンサー
  • 暇なときにでも

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

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

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数1878
  • ありがとう数5

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

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

ham_kamo様、こんにちは。Wendy02です。 いろいろ過去の資料をひっくり返して、もう一度検討してみましたが、やっぱりうまくいきませんね。ある程度の目算はあったのですが……。(内容は言いません、だめでしたから(^^;) >「ヘルプのサンプルなのになぜ?」 あのヘルプの内容は、VB6側にも収録されていますから、やっぱり手を抜いているのでしょうね。まあ、あの文章では、あってもなくても同じですけれどね。あれじゃあ、さっぱり理解できません。 ここでのクラスは、あくまでも、与えられている種類のイベント(WithEvents)の範囲内であって、私も、Worksheetのオブジェクト自体の基底クラスに継承することなら不可能だと思います。 なお、もう特に知る必要性はないと思いますが、MS-Office のRaiseEvent についての詳しい説明は、MSDNにありますから、そのURLを置いておきます。Office2000の『プログラマーズガイド』の第9章の「カスタムクラスとオブジェクト」の「カスタムクラスにイベントを追加する」という項目に載っています。できないのに、「能書き」を書いてもしょうがありませんので、とりあえず、お返事まで。

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/modcore/html/deovrunderstandingcustomevents.asp

共感・感謝の気持ちを伝えよう!

質問者からのお礼

わざわわざ調べていただき、ありがとうございました。 Wendy02様が調べても無理なのであれば、やはり無理なんでしょうね。 > ここでのクラスは、あくまでも、与えられている種類の > イベント(WithEvents)の範囲内であって、私も、Worksheetの > オブジェクト自体の基底クラスに継承することなら不可能だと思います。 やはりそうなんですよね。仕組みとしてユーザに与えられていない部分には手を出しようがないのですね。 参考URLもありがとうございます。これを読んで自分でもいろいろ試してみようと思います。

関連するQ&A

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

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

  • SelectionChangeとChangeの違い

    エクセルのシートイベントには、 ・Worksheet_Change ・Worksheet_SelectionChange がありますが、違いはなんでしょうか? ・Worksheet_Changeはセルの値が変わったら発動 ・Worksheet_SelectionChangeは、 セルの選択が変わったら発動なおかつセルの値が変わったら発動 と言うことでしょうか? ・セルの値が変わったら、Changeイベントの方が先に発動する。 であってますか?ご回答よろしくお願いします。

  • すでにコピーした情報を貼り付けたらイベントを発生

    セル番地は指定せず、どのセルでも、 すでにコピーした情報を貼り付けたらイベントを発生する ってことはできないでしょうか? ワークシートのイベントの一覧を見てみましたが ないようです。 イベントの一覧はこちらです。 Activate BeforeDoubleClick BeforeRightClick Calculate Change Deactivate FollowHyperlink PivotTableAfterValueChange PivotTableBeforeAllocateChanges PivotTableBeforeCommitChanges PivotTableBeforeDiscardChanges PivotTableChangeSync PivotTableUpdate SelectionChange この中に、Pasteと言うイベントがないことから、 そのような動作は無理なのでしょうか?

その他の回答 (4)

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

Kasouken様、 割り込み失礼します。 >Helpにあったと思います。 まず、ExcelのRaiseEvent のHelpにあるサンプルコードは、Excelのものではないようですね。動作は、VBでは確認できましたが、コードをVBA用に手直ししてみましたが、全面的に変えないとExcelではできないようですね。私自身は、RaiseEvent 自体は理解しているつもりです。 単純に、Class モジュールをオブジェクトとして、イベントを設け、その中に、RaiseEvent で、呼び出しコードを書けば済む内容だとも思えないのです。 ヘルプの中の、 #イベントが宣言されると、RaiseEvent ステートメントを使って、イベントを発行できます。 とは書かれていますが、それに該当するロジックが必要だと思うのです。 それを、どのようにして、セルのクリックに対するイベントを応用させるのでしょうか?私にはわかりません。私が、#2で書いたように、(左)クリックイベントは、Application側で、Selection として働くわけですね。 RaiseEvent というのは、イベントの中において、監視機能を働かせ、登録したイベントを発行させるというような機能だと思います。もちろん、イベントの代わりに、タイマーを動かして、ワークシートを監視状態にすることも可能だと思います。 しかし、その元のイベントを新たに作り、仮にタイマーで監視させるにしても、ワークシートのクリックに対するものは、私は思いつかないのです。いわゆる、MouseDown(またはMouseUp)の機能をワークシート上でイベントを発行させられるかどうかだと同じに考えています。私には、できそうにもありません。 時々、出てくる質問ですが、今まで、この問題の解答を見たことがありません。私は、最近はVBAに対して、あまり勉強はしておりませんが、これは、興味のある話です。 よろしかったら、質問者さんとともに教えてくださいませんか?

共感・感謝の気持ちを伝えよう!

質問者からの補足

> まず、ExcelのRaiseEvent のHelpにあるサンプルコードは、Excelのものではないようですね。 やはりそうでしたか。そのままコピーして実行したらエラーが出たので、「ヘルプのサンプルなのになぜ?」とか思いつつ何ヶ所か修正して動くことは確認できました。(MSがヘルプに手を抜いてるのでしょうか?) 今の段階では、自分が実装したクラスやフォームでRaiseEventを用いてEventを発生させることができる、というところまでは理解したのですが、既存のWorksheetなどのクラスにイベントを定義する、ということができるのかわかりません。 Worksheetを継承したクラスを作成して、その中でClickイベントを作成できるのでは、とも思ったのですが、どうやらVBAではクラスの継承はできないのですね。そもそもクリックイベントを発生させようとすると、マウスの動きを監視して、SelectionChangeイベントを横取りするようなことになると思うのですが、それはやはりできないのでしょうか…。

  • 回答No.3
noname#31387

#1です 下記を調べて見ては如何でしょう。 Helpにあったと思います。 Event RaiseEvent

共感・感謝の気持ちを伝えよう!

質問者からのお礼

たびたびのご回答、どうもありがとうございます。 さっそく調べてみたいと思います。

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

ham_kamoさん、こんにちは。Wendy02です。 前の回答(#2878604)のログは読ませていただきました。 私個人の作るものは、DoubleClick イベントのほうが多いですね。SelectionChangeイベントは、実際にきちんとしたものを作った時に、誤動作しかねませんので、ユーザーが意識的に行う動作-右クリックメニューや、ダブルクリックに対して、イベントを与えるという方式にします。 SelectionChange というのは、厳密には、セル間の移動に対して働くもので、直接、クリックに対してイベントが働くものではないのはご指摘のとおりです。 (左)クリックに対して、Select が最初に働くように出来ているわけですが、(左)ダブルクリックでは、いわゆる「命令待機モード」になってしまっています。それらは、アプリケーションの組み込みイベントで、それは、ユーザー側に提供されていません。 それを、(左)クリックでイベントを働かせるようにするには、もっとも感覚的に近いのは、コントロールツールの透明ラベルやオートシェイプの四角形で透明にした図形を設けることだと思います。ただ、コマンドボタンと同じことですから、それが実現できたとはいいません。透明ラベルがあるセルでは、書き込み等は出来なくなります。 ある一定の条件で、その透明ラベルが有効(.Visible =True)にするようなイベントを設けておけば、邪魔になることはありません。(透明ラベルですから、.Visibleは関係ないような気もしますが、.Visible=False になると、存在していないのと同じことになってしまうからです。)「ある一定の条件」で、On/Off にするのを、イベントで設けるわけです。 なお、私は、ワークシートのClassオブジェクトに、クリックイベントのインスタンスを設けることは出来ません。元々、その機能がユーザー側に与えられていませんから、既存のものにインスタンスを設けて変更するなりプロパティを付加するならともかく、新しいイベントは無理だと思います。 ワークシートのオブジェクトが、コントロールツールのように認識はしないと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

Wendy02さん、こんにちは。いつも参考にさせていただいてます。 > SelectionChangeイベントは、実際にきちんとしたものを > 作った時に、誤動作しかねませんので、ユーザーが意識的に > 行う動作-右クリックメニューや、 ダブルクリックに対して、 > イベントを与えるという方式にします。 やはりそうなんですね。私も今までは右クリックメニューかダブルクリックで処理してきました。ただ今日は、前の質問に回答してから「いくら検索してもクリックイベントを拾う方法が見つからないけど、本当にないのかな?」とかねがね疑問に思っていたので、質問してみました。 > もっとも感覚的に近いのは、コントロールツールの透明ラベルや > オートシェイプの四角形で透明にした図形を設けることだと思います。 なるほど、セルにあわせて透明なコントロールを貼り付ければ確かに「似たこと」はできますね。でも対象となるセルの数だけコントロールを貼り付けて、その数だけClickのイベントハンドラを書くことになりますよね。(TopLeftCellでそのラベルがあるセルを取得すれば処理は共通化できそうですが) 対象のセルが少ない場合は使えそうですね。使えそうな機会があれば試してみます。 > ワークシートのClassオブジェクトに、クリックイベントのインスタンスを設けることは出来ません。 そうなんですか…。ユーザが手の出せない領域なのですね。 イベントを自分で作れるということを恥ずかしながら今まで知らず、No.1さんの回答ではじめて知ったのですが、やはりできることとできないことがあるのですね。 イベントを作る方法や、どこまでユーザの手が出せるのか、いろいろ調べてみようと思います。 ご回答どうもありがとうございました。

  • 回答No.1
noname#31387

こんにちは ご自分でイベントを作るしかないと思います。 でも面倒くさそうです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

イベントって自分で作れるんですか! まだまだ浅学なもので、知りませんでした。実際に使うかどうかは 別として、この機会に調べてみようと思います。 ご回答ありがとうございました。

関連するQ&A

  • 複数のセルを選択しているかを取得するプロパティは?

    SelectionChangeイベントで 複数のセルを選択しているかを取得するプロパティってないのでしょうか? 今は、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Len(Target.Address) > 5 Then MsgBox "複数のセルが選択されています" End If End Sub こうしていますが、行数が多くなると文字も多くなってしまうので、このコードでは対応できません。 Rangeオブジェクトに何個セルが入ってるかを知る方法はありますか? ウォッチのTargetのcellsを見ても、どう見ればいいのかわかりません

  • シートのイベント VBA

    シートをクリックしたらシートをクリアしたいのですが クリックするセルがA1の場合は、マクロを実行させたくないのですが 下記のコードだとエラーになってしまいます。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Target.Range = Range("a1") Then Cells.Clear End If End Sub ”Range("a1")でなければ、Cells.Clearする” にはどうすればいいですか?

  • SelectionChangeイベント 文字列エラ

    エクセルvbaなのですが セルをクリックしたときに、該当する値ならメッセージを表示させる際に Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = 1Then MsgBox "" End If End Sub ならエラーにならずに動くのに Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = "運賃" Then MsgBox "" End If End Sub のように文字列にすると、型が一致しません。 と言うエラーになります。 If Target.Value = "運賃" Then の時でも、空白セルや数値が入ったセルをクリックした際はエラーになりません。 どのような型にすればいいのでしょうか? 実際、「運賃」と言う値が入ってるセルをクリックしても同じエラーが発生します。

  • DataGridViewでセルクリックイベントを発生させるには

    DataGridViewでセルクリックイベントを発生させるには、 デザイナからではCellClickイベントハンドラとなりますが、 プログラムコード上から発生させるにはどのようにすればよろしいでしょうか? CurrentCellでアクティブセルを変更した時に、そこのセルをクリックさせるイベントが欲しいのですが・・ 宜しくお願い致します。

  • (エクセルVBA)セルを左クリックしたら実行させるには?

    エクセルVBA初心者です。 下のように、同じシート内のコードとして2つのサブプロシージャがある状態なのですが、 シート内のどこかのセルを左クリック→指示(1) シート内のどこかのセルを右クリック→指示(2) のようにするにはどうしたらいいのでしょうか? (この状態だと、右クリックすると選択範囲が変わったことが優先的に認識されて指示(1)のほうが実行されてしまうようです。) 説明不足かもしれませんが、何を説明していいのか分からないので、補足が必要だったら言ってください。すみませんがよろしくお願いします。 --------------------------------------------------------------- Private Sub Worksheet_SelectionChange(ByVal Target As Range) 指示(1) End Sub --------------------------------------------------------------- Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 指示(2) End Sub ---------------------------------------------------------------

  • カーソルを動かしたときは発動させたくありません

    エクセルの Worksheet_SelectionChangeイベントで --------------------------------------------------------- Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then MsgBox "$A$1です" End If End Sub --------------------------------------------------------- のコードを標準モジュールに書いて、A1セルをクリックすると、MsgBoxが表示させますが、 B1セルから、キーボードの「→」キーを押してA1に移動してもMsgboxが表示されてしまいます。 クリックした時はマクロを発動させたいのですが、カーソルを動かしたときは発動させたくありません。 そんな事は可能でしょうか?

  • EXCEL Worksheet_SelectionChangeイベントについて

    EXCELのVBAについて教えて下さい。 EXCEL の Worksheet_SelectionChange を、必要に応じて、ENABLEにしたりDISABLEにしたりできないでしょうか? どこかのセルを参照したりして、有効か無効かを判断するしかないでしょうか? ?????.enabled = true,falseで 有効・無効を切り替えできればと思っていますが。 分かる方がいらっしゃれば、教えて下さい。 よろしくお願いします。

  • CutCopyMode範囲の取得方法について。

    Application.CutCopyMode=True時の対象セル範囲を取得したく思っています。 対象セルが記憶されているオブジェクト、または、 CutCopyMode=True時のイベントがわかればよいのですが見つかりません。 只今、SelectionChangeにて一時保管して使用していますが、Mode対象セル範囲を次から次へと変更していくと、この方法では上手く取得できません。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Application.CutCopyMode <> xlCopy And _ Application.CutCopyMode <> xlCut Then Set 一時保管 = Selection End If End Sub イベントまたはオブジェクトご存知の方宜しくお願い致します。

  • ハイパーリンクでのクリックイベントの取得

    任意のセルに対して HYPERLINK 関数でリンクをはったものについては、 マウスからのクリックイベントを Worksheet_FollowHyperlink で 取得できることはわかったのですが図形描画バーのテキストボックスに対して メニューからのハイパーリンクで実施したリンクに対して Worksheet_FollowHyperlink で取得できない状態です。 テキストボックスに対しての HYPERLINK 関数の使用法について 使えるのかすらわからず、メニューからの方法しか わからなかったのですがこの場合のリンクでは取得できない状態のようです。 メニューはツールバー -> 挿入からものかテキストボックスを 選択して右クリックで表示されるメニューからで同じシート内で 任意のセルを指定する形です。 テキストボックスにリンクをはりクリックイベントを取得するには どうしたらいいのでしょうか?

  • FlashのDragOverイベント

    Flashのイベントについての質問です。 FlashMXを使用しています。 クリックされた状態(マウスダウン状態)のまま、 ムービークリップオブジェクトにカーソルを、 もってきたときにイベントを発生させる時、 皆さんはどうやっていますか? MXからムービークリップでも、 DragOverハンドラが使えるようになりましたが、 DragOverは、一度そのオブジェクトで マウスダウンさせてないと発生していません。 すでにマウスダウンされている状態で、 カーソルがオブジェクト範囲内に入ったときに、 イベントを発生させたいのです。 とっても困っています。よろしくお願いいたします。