みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ連載をお届けしております。
前回の記事はこちら。
インスタンス化とは何か、またシンプルな自作クラスのインスタンスを生成する方法についてお伝えしました。
さて、これでインスタンス、つまり自作のオブジェクトとなるわけですが、オブジェクトといえば、プロパティとメソッドです。
メソッド…どうやって作るんですかね。
ということで、今回はエクセルVBAでクラスに最も簡単なメソッドを追加する方法をお伝えします。
では、行ってみましょう!
前回までのおさらい
これまでに作成したクラスと、その検証用のSubプロシージャについて確認しておきましょう。
まず、クラスは「Person」という名前で、そのクラスモジュールに記載したコードはこちらです。
Public FirstName As String
クラスモジュールにモジュール変数を定義して、「FirstName」というたった一つのプロパティを持っております。
それで、そのインスタンス化を確認するために作ったSubプロシージャがこちら。標準モジュールModule1に記載しております。
Sub MySub()
Dim p As Person
Set p = New Person
p.FirstName = "Bob"
Stop
End Sub
これを実行して、ローカルウィンドウで確認しました。
さて、ここまででわかったことは、以下のようなことです。
- オブジェクトを作るにはクラスを作って、「New」してインスタンス化をする
- オブジェクトはデータを持てる、それがいわゆるプロパティ
さて、オブジェクトにプロパティを追加する方法はわかったのですが、もう一つ忘れてはならない存在がいますよね。
メソッドですよね。
今回は、メソッドを作っていきますよ!
最も簡単なメソッドを作成する
では、クラス「Person」にメソッド「Greet」を追加していきますね。
PersonクラスはFirstNameというプロパティを持っています。つまり、その生成したインスタンスには名前があるわけですね。
Greetメソッドは、実行するとその名前に向かって「~さん、こんにちは!」とメッセージダイアログを表示して挨拶をする、というメソッドです。
クラスモジュールに、以下のSubプロシージャを追加してください。PublicステートメントによるFirstNameの宣言の後です。
Public Sub Greet()
MsgBox Me.FirstName & "です、こんにちは!"
End Sub
はい、OK。
これで、メソッドの完成です!
え?簡単すぎやしないかって…?大丈夫です、ホントです!!!
その証拠に、 F2 キーでオブジェクトブラウザーを開いて、VBAProjectのPersonのメンバーを見てやってください。
ほら、クラス「Person」に「Greet」というメンバーが追加されていて、そのマークをいつも見慣れている「メソッド」のものですよね。
下部の「詳細ペイン」を見ると、「Public Sub Greet()」とありますよ。
クラスのメソッドの作り方
コードの解説をしていきます。
この連載をご覧になられている方のほとんどは、Subプロシージャは作ったことがあると思います。また、Functionプロシージャの作り方もご存知の方も多いでしょう。
大事なことを言いますよ。
クラスモジュールで宣言したSubプロシージャ、またはFunctionプロシージャはそのクラスのメソッドになります。
はい、これ大事です。いつも書いているSubプロシージャが、クラスモジュールに書けばメソッドになります。
パブリックプロシージャとは
それで、今回「Public」というキーワードが入っているのにお気づきだと思います。
プロシージャには以下の2種類があります。
- パブリックプロシージャ
- プライベートプロシージャ
今回、定義しているプロシージャはパブリックプロシージャのほうです。
…たしか、変数にもそういうのがありましたね。
これ、パブリックにしないと、以下のようなコンパイルエラーが出ちゃうんです。
コンパイルエラー:
メソッドまたはデータメンバーが見つかりません。
実は「Public」を省略した場合は、既定でパブリックプロシージャになるんですけどね。ただ、クラスモジュールを使う場合は、パブリックかプライベートかというのは結構重要なので、あえて明示しているという意味合いがあります。
詳しくはシリーズの後の記事で詳しく解説していきます。
Meキーワードについて
さて、2行目ですが、あまり見かけない「Me」というキーワードがあるのにお気づきかも知れません。
これは、Meキーワードと言いまして、クラスモジュールに記載されているときは、そのインスタンスが生成されたときには、インスタンス自身のオブジェクトを表します。
つまり、「Me.FirstName」は、生成されたインスタンス自身のFirstNameプロパティの値を返すというわけです。
自作クラスのメソッドを実行する
では、Module1のSubプロシージャMySubを以下のように変更して実行。
メソッドの動作を確認してみましょう。
Sub MySub()
Dim p As Person
Set p = New Person
p.FirstName = "Bob"
p.Greet
End Sub
実行すると、こんなメッセージダイアログが表示されます。
Personクラスのインスタンスが生成されて、そのインスタンスに対して、FirstNameプロパティを「Bob」を設定、そして「~さん、こんにちは!」と表示するGreetメソッドが実行されたわけです。
クラスから生成したインスタンスはデータと手続きを持つ
さて、クラスPersonには、プロパティFirstNameを持っていました。
つまり、クラスはプロパティという形でデータを持つ領域を定義することができます。
ただ、データを持たせるだけなら、わざわざクラスモジュールを使わずとも、変数でもいいですよね。
集合を扱いたければ配列やコレクションがあります。
また、複数のデータ型が混在するデータを扱いたいのであれば、ユーザー定義型という手もあります。
このように、VBAではデータを持つ方法はたくさん提供されています。
では、なぜクラスモジュールが必要なのでしょうか?
クラスを用いる理由の一つは、今回紹介した「プロシージャ」の追加にあります。
つまり、クラスから生成したインスタンスにはデータを持たせるだけでなく、プロシージャすなわち「手続き」を持たせることができるという点です。
クラスにはデータとともに、Subプロシージャだけでなく、FunctionプロシージャやPropertyプロシージャを用いて、様々な手続きを定義して持たせることができるのです。
まとめ
以上、エクセルVBAでクラスに最も簡単なメソッドを追加する方法をお伝えしました。
クラスモジュールに定義したSubプロシージャとFunctionプロシージャはクラスのメソッドになります。
また、クラスから生成したインスタンスは、データと手続きを持つこができる、というのも重要な点です。
ただ、これだけではまだ実務に役に立つ感じはありませんので、以降の記事で少しずつ近づけていきます。
どうぞお楽しみに!
連載目次:初心者でもわかる!エクセルVBAでクラスを作ろう
名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!- 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
- エクセルVBAでクラスに最も簡単なプロパティを追加する方法
- エクセルVBAで自作クラスをインスタンス化する方法
- エクセルVBAでクラスに最も簡単なメソッドを追加する方法
- エクセルVBAで表の1行分のデータを表すクラスを作成する方法
- エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
- エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
- エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
- エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法
- エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
- エクセルVBAでインスタンスの集合をコレクション化する方法
- エクセルVBAでコレクション化したインスタンスを取り出す方法
- エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
- エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize
- エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法
- エクセルVBAで自作コレクションの要素を取得するプロパティの作り方
- エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する
- エクセルVBAで自作コレクションの要素を削除するメソッドの作り方
- エクセルVBAでエクセル表のデータを反映するメソッドとクラスを使うメリット