• ベストアンサー

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

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

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

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

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
ham_kamo
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (4)

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

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

ham_kamo
質問者

補足

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

すると、全ての回答が全文表示されます。
noname#31387
noname#31387
回答No.3

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

ham_kamo
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

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

ham_kamo
質問者

お礼

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

すると、全ての回答が全文表示されます。
noname#31387
noname#31387
回答No.1

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

ham_kamo
質問者

お礼

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

すると、全ての回答が全文表示されます。