
photo credit: byronv2 gramophone 02 via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「初心者でもわかるクラスモジュール」をテーマにシリーズ連載をしております。
前回の記事はこちら。

クラスに簡単なメソッドを追加する方法をお伝えしました。
さて、シリーズの最初のほうに「エクセル表をクラス化する」とお伝えしていたんですが、しばらく放置してましたね…
ということで、今回はエクセルVBAで表の1行分のデータを表すクラスを作成する方法をお伝えしていきます。
では、行ってみましょう!
前回のおさらい
では、まず前回のおさらいから。
作成しているクラス「Person」はこちらです。
Public FirstName As String Public Sub Greet() MsgBox Me.FirstName & "です、こんにちは!" End Sub
クラスモジュールにモジュール変数を定義するとそれはプロパティ、SubプロシージャまたはFunctionプロシージャを宣言するとそれはメソッドになるんでしたね。
つまり、クラスPersonは、FirstNameプロパティと、Greetメソッドを持つクラスということですね。
この実行確認をするための、Subプロシージャを記載した標準モジュール「Module1」がこちらです。
Sub MySub() Dim p As Person Set p = New Person p.FirstName = "Bob" p.Greet End Sub
実行すると、以下のようなメッセージダイアログが表示されます。
今回のお題: エクセル表のデータをクラス化する
さて、このようにクラスを作ってきたのですが、シリーズの初回で、以下のようなエクセル表を題材にするよ~とお伝えしていたのを覚えているでしょうか。
シリーズ記事4回もずっと、ほぼこのエクセル表に触れることなくきてしまっていたのですが、エクセルVBAの場合、エクセル表のデータをクラス化すると、すごくわかりやすいですし、実用的なんですね。
ということで、今回はこのエクセル表のデータをクラス化して扱えるように、クラスを改良していきます。
クラスに複数のプロパティを追加する
現在、クラスPersonには「FirstName」というプロパティがあります。
つまり、クラスPersonから生成されたすべてのインスタンスには、名前を入れるデータの箱FirstNameがあるということになります。
一方で、前述のエクセル表のに注目すると、その見出しは
- Id
- FirstName
- Gender
- Birthday
となっていますね。
FirstName…あります。他のId、Gender、Birthday…ないですね。
なので、現在クラスPersonにない見出しを、プロパティとして追加してやればいいような気がします。
クラスにプロパティを定義するには、モジュール変数を定義すれば良いわけですから、クラスモジュールPersonの内容を以下のようにしてあげれば良さそうです。
Public Id As String Public FirstName As String Public Gender As String Public Birthday As Date Public Sub Greet() MsgBox Me.FirstName & "です、こんにちは!" End Sub
では、オブジェクトブラウザーを、 F2 キーを押して確認してみましょう。
バッチリ追加されていますね!
これで、クラスPersonから生成されたインスタンスは、エクセル表の1行分を表すことになるということになります。
エクセル表の1行分のデータをクラス化する
では、エクセル表の2行目、Bobさんのデータを生成したインスタンスに格納して、その内容を確認してみましょうか。
Module1のSubプロシージャを以下のように変更して、実行してみましょう。
Sub MySub() Dim p As Person Set p = New Person With Sheet1 p.Id = .Cells(2, 1).Value p.FirstName = .Cells(2, 2).Value p.Gender = .Cells(2, 3).Value p.Birthday = .Cells(2, 4).Value End With Stop 'p.Greet End Sub
Stopステートメントで中断しているときに、ローカルウィンドウで変数pの内容を確認すると、以下のように表示されるはずです。
まとめ
以上、エクセル表の1行分のデータをクラスとして作成する方法をお伝えしました。
どんなエクセル表でも、同じようにすれば1行分のデータをクラス化することができます。
そんなの配列でいいじゃん、と思うかも知れませんが、思い出してください。クラスであればメソッドを追加できるんです。
つまり、特定のエクセル表のデータに対して、頻繁に実行する手続きがあるとしたら、それはクラスのメソッドとして定義をしておくという手もあるわけですね。
さて、次回ですが複数のPersonオブジェクトをコレクション化する方法をお伝えします。
どうぞお楽しみに!