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も見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
忘れられない激○○料理
これまでに食べたもののなかで、もっとも「激○○」だった料理を教えて下さい。 激辛、でも激甘でも。 激ウマ、でも激マズでも。
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
とっておきの「まかない飯」を教えて下さい!
飲食店で働く方だけが食べられる、とっておきの「まかない飯」。 働いてらっしゃる方がSNSなどにアップしているのを見ると、表のメニューには出てこない秘密感もあって、「食べたい!!」と毎回思ってしまいます。
-
Excel VBAでマウスの左クリックのイベントを検知するには
Visual Basic(VBA)
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
Excelのシート上のShapeにイベントは設定できる?
Excel(エクセル)
-
-
4
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
5
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
6
シングルクリックとダブルクリックのイベントについて
Access(アクセス)
-
7
ExcelVBA 図形をクリックした際のイベントを拾うには
Visual Basic(VBA)
-
8
(エクセルVBA)セルを左クリックしたら実行させるには?
Excel(エクセル)
-
9
worksheet_changeがループする
PowerPoint(パワーポイント)
-
10
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
11
EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
月の最後の週の呼び名は?
-
10月をもって辞めるって、10...
-
8月までっていつまでのことでし...
-
カレンダーの日付 5/Bの意味に...
-
エクセルのフィルターを複数シ...
-
「6月まで」というのは6月以内...
-
「陽気」という言葉の使い方
-
入社が2月1日とした場合、3ヶ月...
-
仲の良い男友達から「クリスマ...
-
彼氏がクリスマスバイトをいれ...
-
VBA ユーザーフォームのChange...
-
自治会の通常総会の年度について
-
昔の愛称?「~の字」
-
VBAで先月、先々月を求める方法
-
ExcelVBAで質問です。Workbook_...
-
「1年以上」の定義について
-
誕生日とクリスマスの近い彼氏...
-
『無線LANが切れる時、何かイベ...
-
一ヶ月前、一ヶ月後
-
1月8日で1年記念日なのですが、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
8月までっていつまでのことでし...
-
10月をもって辞めるって、10...
-
カレンダーの日付 5/Bの意味に...
-
月の最後の週の呼び名は?
-
昔の愛称?「~の字」
-
入社が2月1日とした場合、3ヶ月...
-
エクセルのフィルターを複数シ...
-
「1年以上」の定義について
-
「なんで付き合おうと思ったか...
-
「6月まで」というのは6月以内...
-
○年後の3月末日を関数で出したい
-
昔は何歳くらいからお酒を飲ん...
-
定年になる年度を関数で算出したい
-
一ヶ月前、一ヶ月後
-
VBAで先月、先々月を求める方法
-
月度ってどういう意味ですか
-
VBA ユーザーフォームのChange...
-
確認ですが普通5月までに決める...
-
○月第○週 の数え方について
-
11月について 10月はハロウィン...
おすすめ情報