VBAにもっと詳しくなろう♪ 「パーフェクトExcel VBA」
VBAをパーフェクトにマスターするシリーズ♪ 2章「式と値」「パーフェクトExcel VBA」
VBAをパーフェクトにマスターするシリーズ♪ 3章「ステートメント」「パーフェクトExcel VBA」
VBAをパーフェクトにマスターするシリーズ♪ 4章「フロー制御ステートメント」「パーフェクトExcel VBA」
VBAをパーフェクトにマスターするシリーズ♪ 5章「プロシージャ」「パーフェクトExcel VBA」
VBAをパーフェクトにマスターするシリーズ♪ 6章-1「モジュール」「パーフェクトExcel VBA」
VBAをパーフェクトにマスターするシリーズ♪ 6章-2,3,4,5,6「モジュール」「パーフェクトExcel VBA」
(前回の4,5,6は2,3と統合しました。)
続きを書きました。
VBAをパーフェクトにマスターするシリーズ♪
今回は「6章-7,8」で新しく知ったことと、思ったことを簡単にまとめました。
6章は分厚いので少しずつ進めていきたいと思います。。。
※これは学習記録です。
書籍の内容はあえて多くは載せていません。
大事なことも省いていますので、詳細につきましては書籍をご覧ください。
6-7-1 クラスモジュールとは
クラスモジュールは、独自のオブジェクトを作成するためのモジュールです。
6-7-2 クラスとインスタンス
シートモジュール、ブックモジュールは既に存在しているオブジェクトに機能や処理を追加することができるモジュールでした。また、フォームモジュールは、ユーザーフォームの挿入を行うと同時に追加されますので、
クラスモジュールは、上記と異なり、オブジェクトを作るまでは実体がありません。
使い方としては、クラスモジュールを追加すると、
そのクラスを型として使えるようになるので、SETするときにNewします。
6-7-3 クラスメンバーの定義
クラスには独自のプロパティやメソッドを追加できます。
クラスを指定してオブジェクトを作ると(SETしてNewすると)、そのオブジェクトに対して、設定したプロパティもメソッドも使えるようになります。
6-7-4 クラスのイベントプロシージャ
VBAではクラスで使用できるイベントが2つ用意されています。
Initialize インスタンスが生成されたとき(コンストラクタ)
Terminate インスタンスへの参照がされなくなったとき(デストラクタ)
このシリーズの学習記録を書いている途中で「クラスモジュール便利やん!使ったほうがいいやん!」って思ったことがあったのですが、なぜでしたっけ。(少し間が空いて忘れてしまった)
今ある記憶では「クラスモジュールを作って活用すれば、プログラム全体に対してのPublicなメソッド?プロシージャ?関数?をむやみに増やさなくて済む=プログラムの修正や追加するときに影響範囲を絞り込みやすい」という感じなのですが
そレほど多機能なシステムを作るのでなければ、なるべく関数?処理?プロシージャ?はPrivateにすることで、ある程度は対応できそうです。
でも重複して同じコードがあちこちに書かれるのは避けたいですね(コードが増えるとその分、メンテナンスも大変になるので)
クラスモジュールを使って、「この機能に対してのPublicな関数?プロシージャ?はこれを使いましょう」という限定ができるのは、良いと思いますが、
ただ、(例えば初心者が)作るときにそこまで考えて作れるかな?というとちょっと疑問です。
ある程度慣れてきたらそういう使い方に変えていく、とかじゃないと、
誰にも教わらずに、本だけで基礎を学んでも、
それを実務で活用しようとする段階で、「まず、クラスを作って分けなければ」とやろうとしても、
わからなくなって、何も進まなくなるような気もします。
それともすんなり、この場合はこうしたほうがいい、とか、わかるものなのでしょうか。
そういえば今、実務で扱っているVBAに一部、謎のクラスモジュールが存在していて、
どこで使ってるんだこれ・・・というものがあるのですが、
それを解析しないとですね・・・。
VBAの「クラスモジュール」の使い方は、ここで基本がわかったので、
クラスモジュールを恐れずに、解析していきたいと思います。
6-8-1 イベントに応答するオブジェクト変数を宣言する
シートやブックで発生するイベントで動作するイベントプロシージャは、その属するオブジェクトモジュールであるシートモジュールまたはブックモジュールに記述する必要がありました。
しかしマクロの実行中に新規作成したシートやブックに対しては、そのモジュールにコードを記述することは叶いません。また、ユーザーフォームの複数のコントロールに同じイベントで同じ処理を追加したい場合、全てのコントロールについて同じイベントプロシージャを定義するのは明らかに冗長ですから、共通化したいと考えるでしょう
そのようなときに、WithEventsキーワードを使うことができます。
WithEventsキーワードを付与して宣言したオブジェクト変数は、イベントに応答するようになります。
Private WithEvents varname [As type]
変数varname に設定された固有オブジェクト型typeのオブジェクトは、その定義されているイベントに応答するようになり、そのイベントの発生をきっかけとしたイベントプロシージャを定義することができるようになります。
具体的なコードの例として、マクロ実行中に追加したシートに対して、イベントが発生した時の処理を記述してあります。これは知りませんでした。便利そうです。
ですが、共通化するときにはどうやって使うのだろう(具体的な記述のイメージがわかない)
6-8-2 独自のイベントを定義する
作成したクラスに独自のイベントを定義して使用することができます。
クラス独自のイベントを定義するEventステートメント
[Public] Event name [(arglist)]
定義したイベントを発生させるRaiseEventステートメント
RaiseEvent name [(argumentlsit)]
具体的なコードの例が記述されています。
説明をされてからコードを見ると、やろうとしていることはわかりますが
何の説明もなくこのコードだけ書いてあったら、読むの辛いなあと思いました。
(つまりコメントをしっかり書いておかないと、何をしているのかわからなくなりそう)
確かに、コードは読めなくはないのだけど、実際に使うときは、なるべく独自イベント使わないで欲しいなあと願ってしまうのでした・・・。
VBA、いろいろできるということを知ってとても勉強になるけど、
知ってても、できればあまり凝ったことをやらないでほしい(後からのメンテナンスが大変だから)
と思ってしまうのは、いけないことでしょうか・・・。
基本的なところをしっかり書けるようになれば、後から読む人も(たとえそれが未来の自分であっても) 助かるので、
基本的なところはしっかり書けるようになってほしい(自分を含め)。
でも何でもかんでも独自で作らないでほしい、一生自分でメンテナンスするなら止めないけど、
後から見た人が直すの大変よ、、、と思ってしまう私でした。
使うなら、どうしてもその独自の方法しかない?それ以外の方法ない?っていうのを、検討してからにしてほしい・・・。
(7章の最後までは書きたいので)続きます
書籍「パーフェクトExcel VBA」発売についてのお知らせ
第4回 | VBAをパーフェクトにマスターするシリーズ♪ 4章「フロー制御ステートメント」「パーフェクトExcel VBA」 |
第5回 | VBAをパーフェクトにマスターするシリーズ♪ 5章「プロシージャ」「パーフェクトExcel VBA」 |
第6回 | VBAをパーフェクトにマスターするシリーズ♪ 6章-1「モジュール」「パーフェクトExcel VBA」 |
第7回 | VBAをパーフェクトにマスターするシリーズ♪ 6章-2,3,4,5,6「モジュール」「パーフェクトExcel VBA」 |
第8回 | VBAをパーフェクトにマスターするシリーズ♪ 6章-7,8「モジュール」「パーフェクトExcel VBA」 |
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント