それわVBA案件ですね

エクセルVBAネタを書いています

クラスについて自分なりの捉え方を書いてみる

やらないこといけないことがあるけれども、絶賛現実逃避ちうなあてくしです。 こんちくわ|ω・)ノ

さて、最近クラスについての考え方についていろんなツイートや記事を見かけます。わたくしもクラスについてはそれがどんなものなのか一定の理解を得るまでに結構苦しみました。最終的にはこう捉えればいいぢゃん的なところを見出すことができたのですが、それは知る限りどこのサイトにも書かれていない気がしたので、皆さんの参考になればよいと思い記事にしてみることにしました。

というわけで、シリーズ記事は今日はお休みでーす。

さて以下に記述することは、他言語についての知識が全くない私が、VBAの勉強を進めていく中で到達したクラスの捉え方です。
オブジェクト指向の何たるかなどプログラム言語の原理原則がきちんと理解できているわけではありませんので、そもそも間違いだと指摘されることは重々承知しております。
ただVBAのクラスに関しては情報が少なく、またそれぞれが初学者にとってはかなり難解(おそらく理解には多くの基礎知識が必要)であり、それ故に初学者にとって高いハードルになっているだろうことは身をもって体験してきました。一方でクラスが使えれば大変便利なことも皆さんご承知の通りかと思いますので、私なりの捉え方がクラスを勉強を始めるとっかかりとして役立てばうれしい限りです。


でわいきます ̄▽ ̄)ノ

私がクラスについての情報を集めていた時に一番知りたかったことは、

クラスを使うと何ができるようになるの?

の1点でした。

ところが目にする情報は”クラスって何?”にフォーカスが当たったものでしたので、なかなか前に進むことができなかったわけですが、最終的に私なりに到達した答えは、

  1. 専用にカスタマイズしたプロパティやメソッドを詰め込んだオブジェクトを使えるようになる。
  2. 作ったカスタムプロパティやメソッドを使うことで、理解しやすい記述でプロシージャを書くことができる


でした。
今日の記事ではこれらを順を追って説明しようと思います。

専用にカスタマイズしたプロパティやメソッドを詰め込んだオブジェクトを使えるようになる。

VBEでコードを書いているときに、こういう表示をよく見かけますよね。
f:id:FukuCyndiP:20191006145557p:plain:w350

上の例で行くとRangeにはそれに紐づいてあらかじめ準備された機能として、ActivateメソッドAddressプロパティなどが使えますよ。ということを意味しています。

ここで例えば、以下のような表を取り扱うとします。
f:id:FukuCyndiP:20191006132735p:plain:w450
(なんちゃって個人情報で生成しました)

ご存じのように、VBAには上記のような個人情報に紐づいたプロパティやメソッドなどは都合よく準備されていませんよね。でもクラスを使うことで、例えば、個人情報を扱うために都合良く自作したプロパティやメソッドを詰め込んだオブジェクトが利用できるようになるのです

f:id:FukuCyndiP:20191006153851p:plain:w350
(上記ではmyObjectというお好みオブジェクトに各プロパティやメソッドが詰め込まれています)

作ったカスタムプロパティやメソッドを使うことで、理解しやすい記述でプロシージャを書くことができる

上の表中の薬師丸 明弘さんの血液型を調べて表示するコードを書くとき、どうするでしょうか?

f:id:FukuCyndiP:20191006144645p:plain:w350

例えば、以下のようなコードがプロシージャに含まれることになるでしょうか。

 ’名前から血液型を検索して設定した文字列と組み合わせて表示する
  Dim Name As String: Name = "薬師丸 明弘"
  Dim person As Range
  
  Set person = Worksheets("個人情報").Range("A1:A5").Find(what:=Name, lookat:=xlWhole)
  MsgBox person.Value & " さんの血液型は " & person.Offset(0, 2).Value & "ですねー"



ここで、このコードを血液型で紹介メソッドとしてクラス(モジュール)に書いておけば、以下のようなコードであっさり書けちゃったりするのです。

 myObject.血液型で紹介(“薬師丸 明弘”)

("myObject"というお好みで作ったオブジェクトに紐づけています)

これのどこがいいのかというと、何といってもコードが理解しやすくなるということなのですね。

もちろん、メソッドを記述する複数行に渡る複雑なコードがクラス(モジュール)に存在していることに変わりはないのですが、様々な処理が混在することになるメインプロシージャをできるだけ読みやすく(理解しやすい)ように記述するという観点でも、このようなクラスを使う意義があるかと思います。

さらには、クラスとして好きなように作ったプロパティやメソッドのセットは何度でも利用可能ですので、ここで上げた例に則ると、上記のような個人情報の表を扱うプロシージャを作るときは何度でも利用することが可能です。

このようなことを実現するためにクラスモジュールにコードを書くとか、クラスを鋳型にしたオブジェクト(インスタンス)を生成するためにNewするというVBA上のオキテに従ってコード書かなきゃですが、そのあたりは詳しく説明しているサイトがたくさんあるので、そちらを見ていただければと思います


おわりに

以上が、私なりに到達したクラスで何ができるの?な答えになりなす。
もちろんクラスを使う意義としてはもっとたくさんあるのでしょうが、クラスを初めて勉強しようとする方が、この程度のレベルでクラスを捉えてさらに掘り進めていくきっかけになれば良いなと思います。
記事を書いている私自身もクラスに対する理解は全然浅いと思いますので、あんなん書いていたけど違うよね~なんてことになるカモですが、まぁご容赦くださいまし。


でわまた~ ̄▽ ̄)ノシ