
ExcelのVBAに関する質問です。
さきほど「セルをクリック、またはダブルクリックしたときに○○したい」という質問に回答したのですが、「セルをクリックした」というイベントを拾う方法がわからず、ダブルクリックのパターンで回答しました。
Worksheetのイベントには BeforeDobuleClick や BeforeRightClick はあるのに Click や onClick というイベントがありません。オートシェイプなどのオブジェクトやフォーム上のオブジェクトには Click イベントがあるのですが、Worksheet になぜかありません。
これまでも同様のケースがあり、ネットで検索したりしたのですが、どれも SelectionChange で代用するものでした。それだと確かにマウスで別セルを選択したときにイベントが発生しますが、
・キーボード操作でセルを移動してもイベントが発生する
・現在選択しているセルをクリックしてもイベントが発生しない
と、厳密はマウスでクリックしたときと同じ動作になりません。
確か以前の質問で「あるセルをクリックするたびに、他のセルの値をカウントアップしたい」というようなものもありました。このような場合には、やはり Click に相当するようなイベントで処理したいです。
どうにかしてWorksheetでクリックイベントを拾うことはできないのでしょうか?
No.5ベストアンサー
- 回答日時:
ham_kamo様、こんにちは。
Wendy02です。いろいろ過去の資料をひっくり返して、もう一度検討してみましたが、やっぱりうまくいきませんね。ある程度の目算はあったのですが……。(内容は言いません、だめでしたから(^^;)
>「ヘルプのサンプルなのになぜ?」
あのヘルプの内容は、VB6側にも収録されていますから、やっぱり手を抜いているのでしょうね。まあ、あの文章では、あってもなくても同じですけれどね。あれじゃあ、さっぱり理解できません。
ここでのクラスは、あくまでも、与えられている種類のイベント(WithEvents)の範囲内であって、私も、Worksheetのオブジェクト自体の基底クラスに継承することなら不可能だと思います。
なお、もう特に知る必要性はないと思いますが、MS-Office のRaiseEvent についての詳しい説明は、MSDNにありますから、そのURLを置いておきます。Office2000の『プログラマーズガイド』の第9章の「カスタムクラスとオブジェクト」の「カスタムクラスにイベントを追加する」という項目に載っています。できないのに、「能書き」を書いてもしょうがありませんので、とりあえず、お返事まで。
参考URL:http://msdn.microsoft.com/library/ja/default.asp …
わざわわざ調べていただき、ありがとうございました。
Wendy02様が調べても無理なのであれば、やはり無理なんでしょうね。
> ここでのクラスは、あくまでも、与えられている種類の
> イベント(WithEvents)の範囲内であって、私も、Worksheetの
> オブジェクト自体の基底クラスに継承することなら不可能だと思います。
やはりそうなんですよね。仕組みとしてユーザに与えられていない部分には手を出しようがないのですね。
参考URLもありがとうございます。これを読んで自分でもいろいろ試してみようと思います。
No.4
- 回答日時:
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
- 回答日時:
#1です
下記を調べて見ては如何でしょう。
Helpにあったと思います。
Event
RaiseEvent
No.2
- 回答日時:
ham_kamoさん、こんにちは。
Wendy02です。前の回答(#2878604)のログは読ませていただきました。
私個人の作るものは、DoubleClick イベントのほうが多いですね。SelectionChangeイベントは、実際にきちんとしたものを作った時に、誤動作しかねませんので、ユーザーが意識的に行う動作-右クリックメニューや、ダブルクリックに対して、イベントを与えるという方式にします。
SelectionChange というのは、厳密には、セル間の移動に対して働くもので、直接、クリックに対してイベントが働くものではないのはご指摘のとおりです。
(左)クリックに対して、Select が最初に働くように出来ているわけですが、(左)ダブルクリックでは、いわゆる「命令待機モード」になってしまっています。それらは、アプリケーションの組み込みイベントで、それは、ユーザー側に提供されていません。
それを、(左)クリックでイベントを働かせるようにするには、もっとも感覚的に近いのは、コントロールツールの透明ラベルやオートシェイプの四角形で透明にした図形を設けることだと思います。ただ、コマンドボタンと同じことですから、それが実現できたとはいいません。透明ラベルがあるセルでは、書き込み等は出来なくなります。
ある一定の条件で、その透明ラベルが有効(.Visible =True)にするようなイベントを設けておけば、邪魔になることはありません。(透明ラベルですから、.Visibleは関係ないような気もしますが、.Visible=False になると、存在していないのと同じことになってしまうからです。)「ある一定の条件」で、On/Off にするのを、イベントで設けるわけです。
なお、私は、ワークシートのClassオブジェクトに、クリックイベントのインスタンスを設けることは出来ません。元々、その機能がユーザー側に与えられていませんから、既存のものにインスタンスを設けて変更するなりプロパティを付加するならともかく、新しいイベントは無理だと思います。
ワークシートのオブジェクトが、コントロールツールのように認識はしないと思います。
Wendy02さん、こんにちは。いつも参考にさせていただいてます。
> SelectionChangeイベントは、実際にきちんとしたものを
> 作った時に、誤動作しかねませんので、ユーザーが意識的に
> 行う動作-右クリックメニューや、 ダブルクリックに対して、
> イベントを与えるという方式にします。
やはりそうなんですね。私も今までは右クリックメニューかダブルクリックで処理してきました。ただ今日は、前の質問に回答してから「いくら検索してもクリックイベントを拾う方法が見つからないけど、本当にないのかな?」とかねがね疑問に思っていたので、質問してみました。
> もっとも感覚的に近いのは、コントロールツールの透明ラベルや
> オートシェイプの四角形で透明にした図形を設けることだと思います。
なるほど、セルにあわせて透明なコントロールを貼り付ければ確かに「似たこと」はできますね。でも対象となるセルの数だけコントロールを貼り付けて、その数だけClickのイベントハンドラを書くことになりますよね。(TopLeftCellでそのラベルがあるセルを取得すれば処理は共通化できそうですが)
対象のセルが少ない場合は使えそうですね。使えそうな機会があれば試してみます。
> ワークシートのClassオブジェクトに、クリックイベントのインスタンスを設けることは出来ません。
そうなんですか…。ユーザが手の出せない領域なのですね。
イベントを自分で作れるということを恥ずかしながら今まで知らず、No.1さんの回答ではじめて知ったのですが、やはりできることとできないことがあるのですね。
イベントを作る方法や、どこまでユーザの手が出せるのか、いろいろ調べてみようと思います。
ご回答どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 余計なお世話的な「入力規則」?対策は? 2 2023/01/14 12:39
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- Excel(エクセル) 【Excel】hyperlink関数を解除してもハイパーリンクが活きるようにできますか? 3 2023/05/22 11:22
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- その他(Microsoft Office) EXCELでバーコードを作成すると白くなってコードが見えません 1 2022/04/04 14:24
- Excel(エクセル) 【エクセル】文中に別シートのセルの内容を自動入力したい 6 2022/11/17 11:30
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Excel(エクセル) EXCEL ActiveX コマンドボタンで実行する前にいったんmsgBoxで確認を求めたい 1 2022/07/06 19:41
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/04/21 13:46
- Visual Basic(VBA) Outlook VBAについて 1 2023/07/10 12:41
このQ&Aを見た人はこんなQ&Aも見ています
-
Excel VBAでマウスの左クリックのイベントを検知するには
Visual Basic(VBA)
-
(エクセルVBA)セルを左クリックしたら実行させるには?
Excel(エクセル)
-
VBAでセルをクリックする回数で表示が変わる
その他(プログラミング・Web制作)
-
-
4
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
5
シングルクリックとダブルクリックのイベントについて
Access(アクセス)
-
6
EXCELでワークシートを開いたらマクロを自動実行したい
Excel(エクセル)
-
7
エクセルVBAで画面の大きさを取得する方法!
Excel(エクセル)
-
8
【ExcelVBA】commandButtonをクラスモジュールで制御するには
Visual Basic(VBA)
-
9
ExcelVBA 図形をクリックした際のイベントを拾うには
Visual Basic(VBA)
-
10
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
11
XL:BeforeDoubleClickが動かない
その他(プログラミング・Web制作)
-
12
private subモジュールを他のモジュールから呼び出して使う方法を教えてください(-.-)
Visual Basic(VBA)
-
13
エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ
Visual Basic(VBA)
-
14
Excel VBAでの右クリックのポップアップメニューの非表示方法は?
Visual Basic(VBA)
-
15
EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
自治会の通常総会の年度について
-
確認ですが普通5月までに決める...
-
「6月まで」というのは6月以内...
-
入社が2月1日とした場合、3ヶ月...
-
カレンダーの日付 5/Bの意味に...
-
月の最後の週の呼び名は?
-
8月までっていつまでのことでし...
-
10月をもって辞めるって、10...
-
エクセルのフィルターを複数シ...
-
総会の年度表記について
-
昔の愛称?「~の字」
-
「1年以上」の定義について
-
月度ってどういう意味ですか
-
昔は何歳くらいからお酒を飲ん...
-
VBA ユーザーフォームのChange...
-
「なんで付き合おうと思ったか...
-
こんばんは。GOTOトラベル事情...
-
願望 春より秋がよし 思い立つ...
-
秋を味わう
-
11月か3月どちらの時期にデニム...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
自治会の通常総会の年度について
-
月の最後の週の呼び名は?
-
10月をもって辞めるって、10...
-
カレンダーの日付 5/Bの意味に...
-
ひな祭りに外食するならどこで...
-
確認ですが普通5月までに決める...
-
総会の年度表記について
-
エクセルのフィルターを複数シ...
-
入社が2月1日とした場合、3ヶ月...
-
昔は何歳くらいからお酒を飲ん...
-
「1年以上」の定義について
-
学校の在籍機関
-
「6月まで」というのは6月以内...
-
8月までっていつまでのことでし...
-
昔の愛称?「~の字」
-
月度ってどういう意味ですか
-
定年になる年度を関数で算出したい
-
「なんで付き合おうと思ったか...
-
「今年度」って『今・年度』?...
-
VBA ユーザーフォームのChange...
おすすめ情報