みなさん、こんにちは!
タカハシ(@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行分のデータをクラス化することができます。
そんなの配列でいいじゃん、と思うかも知れませんが、思い出してください。クラスであればメソッドを追加できるんです。
つまり、特定のエクセル表のデータに対して、頻繁に実行する手続きがあるとしたら、それはクラスに定義をしておくという手もあるわけですね。
そして、その「手続き」の追加の仕方は、メソッドだけとは限りません。
次回ですが、Propertyプロシージャを使ってプロパティを作成する方法をお伝えします。
どうぞお楽しみに!
連載目次:初心者でもわかる!エクセル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でエクセル表のデータを反映するメソッドとクラスを使うメリット