Quantcast
Channel: いつも隣にITのお仕事
Viewing all articles
Browse latest Browse all 2097

エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法

$
0
0
get

photo credit: Don Burkett Little Brody-4404 via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ連載を進めております。

前回の記事はこちらです。

エクセルVBAで表の1行分のデータを表すクラスを作成する方法
「初心者でもわかるクラスモジュール」をテーマにお送りしています。今回はエクセルVBAで表の1行分のデータを表すクラスを作成する方法をお伝えしていきます。つまり、複数のプロパティをクラスに定義します。

エクセル表の1行分のデータをクラス化する方法をお伝えしました。

さて、皆さんは「Propertyプロシージャ」というキーワードは聞いたことありますか?

VBAでは、Subプロシージャ、Functionプロシージャに加えて、そのPropertyプロシージャでも「手続き」を作ることができるのですが…あまり見かけないですよね?

知りたいですよね!?

ということで、今回はエクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法をお伝えします。

では、行ってみましょう!

前回までのおさらい

前回までで以下のエクセル表の1行分のデータを表すクラスを作成しました。

エクセルVBAでクラス化するエクセル表

クラスモジュール「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

エクセル表の見出しに対応する4つのプロパティと、Greetメソッドを定義しています。

また、標準モジュール「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

この例では、2行目のBobさんのデータについてインスタンスを生成して、Personオブジェクト化をしたわけですね。

男性かどうかを判定するプロパティ

クラスPersonには、すでに4つのプロパティを定義しているわけですが、これにもう1つプロパティを追加したいと思います。

どういうものかというと、そのPersonオブジェクトが男性かどうかを判定する「IsMaleプロパティ」です。

男性であればTrueを、女性であればFalseを返す、ブール型のプロパティを考えています。

モジュール変数を追加する場合

プロパティは、クラスモジュールにモジュール変数を宣言することで追加できますので、クラスモジュールPersonの宣言セクションに、以下の一文を追加するという方法が考えられます。

Public IsMale As Boolean

この場合、標準モジュールModule1のほうは、以下のようなコードにすればいいでしょうか(ついでに、検証しやすいように、行番号を変数iに持たせるようにしました)。

Sub MySub()

Dim p As Person: Set p = New Person

Dim i As Long: i = 2
With Sheet1
    p.Id = .Cells(i, 1).Value
    p.FirstName = .Cells(i, 2).Value
    p.Gender = .Cells(i, 3).Value
    p.Birthday = .Cells(i, 4).Value
    p.IsMale = (p.Gender = "male")
End With

Stop
'p.Greet

End Sub

しかし、これでは性別を表すGenderプロパティがこの後の処理で変更になった場合(現実的にあるかどうかは別としてw)、IsMaleプロパティも設定し直すのを忘れないようにしないといけません。

IsMaleプロパティを参照しようとしたときに、都度Genderプロパティの値から判定して値を返すようにできればいいのですが…

と、そのようなことを実現するのが、Property Getプロシージャということになります。

Property Getプロシージャとは

Property Getプロシージャは、プロシージャですから「手続き」を定義することができます。

どんな手続を定義するかというと、「プロパティを取得する際の手続き」を定義します。

つまり、何らかの手続を経てプロパティを取得することができます。

書き方はこうです。

Property Get プロシージャ名() As
 ’処理
 プロシージャ名 = 戻り値
End Property

なんとなくFucntionプロシージャに似ていますね?

戻り値を返す仲間なので、Property GetプロシージャとFunctionプロシージャの定義の仕方は似ています。

Property Getプロシージャでプロパティを定義する

では、Property Getプロシージャを用いて、男性かどうかを判定するIsMaleプロパティを作成してみましょう。

クラスモジュールPersonに、以下のProperty Getプロシージャを追加しましょう。

Public Property Get IsMale() As Boolean
    IsMale = (Me.Gender = "male")
End Property

これでOK。

先ほど、Module1に追加しようとしていたGenderプロパティの判定処理を、クラスモジュールのProperty Getプロシージャに書いたという感じですかね。

では、例のごとく、F2 キーでオブジェクトブラウザーを開いて確認してみましょう。

オブジェクトブラウザーでProperty Getプロシージャによるプロパティを確認

クラスPersonにIsMaleプロパティが追加されていることが確認できます。

しかも、下部の「詳細ペイン」を見ると、以下のように記載されています。

Public Property IsMale As Boolean
 読み取り専用

ここを見ると、プロパティがモジュール変数で宣言されたものなのか、Property Getプロシージャで定義されたものなのかがわかりますね。

しかも、Property Getプロシージャのみで作成したプロパティは「読み取り専用」になるわけですね。書き込みされても困りますもんね。

Property Getプロシージャによるプロパティの動作を確認

では、Property Getプロシージャで作成したIsMaleプロパティの動作を確認してみましょう。

標準モジュールModule1を以下のように検証できるように変更しました。

Sub MySub()

Dim p As Person: Set p = New Person

Dim i As Long: i = 2
With Sheet1
    p.Id = .Cells(i, 1).Value
    p.FirstName = .Cells(i, 2).Value
    p.Gender = .Cells(i, 3).Value
    p.Birthday = .Cells(i, 4).Value
End With

Stop
p.Gender = "female"
Stop
'p.Greet

End Sub

実行して1回目のStopステートメントの中断時にローカルウィンドウを確認すると

  • Genderプロパティ: “male”
  • IsMaleプロパティ: True

となっています。

1回目のStopステートメントでの中断時にプロパティの確認
2回目のStopステートメントの中断時はこちら。

2回目のStopステートメントでの中断時にプロパティを確認

  • Genderプロパティ: “female”
  • IsMaleプロパティ: False

Genderプロパティの値に連動して、IsMaleプロパティの値も変更されていますね。

Bobさんには悪い気がしますが…

まとめ

以上、エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法をお伝えしました。

Property Getプロシージャを使うと、何らかの手続きによってプロパティを取得することができます。

このように、クラスモジュールにプロシージャを追加していくことで、クラスに対する操作を追加したり、データを計算・加工して取り出したり、といった機能を追加することができます。

このエクセル表のデータに関する手続きはクラスモジュールがバッチリ担当してくれているとなれば、コードの管理…めっちゃわかりやすくなりますよね。

さて、次回は「別のPropertyプロシージャ」を紹介したいと思います。

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセルVBAでクラスを作ろう

名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!
  1. 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
  2. エクセルVBAでクラスに最も簡単なプロパティを追加する方法
  3. エクセルVBAで自作クラスをインスタンス化する方法
  4. エクセルVBAでクラスに最も簡単なメソッドを追加する方法
  5. エクセルVBAで表の1行分のデータを表すクラスを作成する方法

Viewing all articles
Browse latest Browse all 2097

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>