本ページには広告が含まれています。

Excel VBA シートの表データからクラスを作成 (Lv.9)

Excel VBA シートの表データからクラス作成(Lv.9)
画像はCanva「Text to Image」で生成しました

「Excel VBAのクラス」について第9回目は、ワークシートの表データからクラスを作成する方法についてです。

くるみこ
くるみこ

前回 Property Setプロシージャの使い方について勉強しました。

今回は、これまで学んだことを使ってワークシートの表データからクラスのプロパティーを作ってみましょう (^^)

わかりました。復習と応用を兼ねてということでしょうか。

今回もよろしくお願いしますm(_ _)m

スポンサーリンク

はじめに

前回の「Property Setプロシージャ」で使ったコード例を利用して、ワークシートの表データからプロパティや値を設定するようにしたいと思います。使用したコード例では、プロパティの設定に「モジュール変数を定義」する方法と「Propertyプロシージャ」で設定する方法の二つを使っていました。

Public Name As String

「Propertyプロシージャ」なら、プロパティの値に対してバリデーション(入力チェックや書式チェックで妥当性を確認する)やエラーハンドリングを行うことができるなどのメリットがあります。

ということで、表データからプロパティを設定する際に「モジュール変数で定義」していた部分も「Propertyプロシージャ」設定に変更したいと思います。

【この記事でわかること
・ワークシートの表データからクラスを作成する方法

ワークシートの表データを確認します

プロパティは「名前(Name)」「年齢(Age)」「ペット(Pet)」を設定していました。これをワークシート上の「表」にすると列見出しになります。それぞれの「値」は列見出しの下に配置します。

プロパティからワークシート上の「表」にしたもの

データに少し情報を追加します。欲張ればいくらでも追加できますが、絞り込んで「ID」と「ペットの種類(Type)」「ペットの性別(Gender)」を追加しました。

データに情報を追加して整理した表

「ペットの種類(Type)」を入れたため、クラス名が「dog」では変なので「mypet」に変更しました。

表データからクラスにプロパティを追加します

表の見出し部分(3行目)がプロパティになる部分です。

  • ID ⇒ 新たに追加
  • Name変数をPropertyプロシージャに変更 
  • Age ⇒ 変更なし
  • Type     ⇒ 新たに追加
  • Gender ⇒ 新たに追加

3つを新たに追加し、NameはPublic変数からPropertyプロシージャへ仕様を変更します。

Propertyプロシージャで各プロパティを設定

次のようにProperty Letプロシージャと Property Getプロシージャを対にして設定します。

'クラス内変数はPrivateで宣言
Private sName As String
Private iAge As Integer
Private sTypes As String
Private sGender As String

'名前(Name)プロパティ取得
Public Property Get Name() As String
  Name = sName
End Property
'名前(Name)プロパティ設定
Public Property Let Name(ByVal nameValue As String)
  sName = nameValue
End Property
'年齢(Age)プロパティ取得
Public Property Get Age() As Integer
  Age = iAge
End Property
'年齢(Age)プロパティ設定
Public Property Let Age(ByVal ageValue As Integer)
  iAge = ageValue
End Property
'ペット種類(Types)プロパティ取得
Public Property Get Types() As String
  Types = sTypes
End Property
'ペット種類(Types)プロパティ設定
Public Property Let Types(ByVal typesValue As String)
  sTypes = typesValue
End Property
'ペット性別(Gender)プロパティ取得
Public Property Get Gender() As String
  Gender = sGender
End Property
'ペット性別(Gender)プロパティ設定
Public Property Let Gender(ByVal genderValue As String)
  sGender = genderValue
End Property

【クラスモジュールのコード解説】

・2~5行目、クラス内で使用する4つの変数をPrivateで定義しています。

・12~14行目、Property Let Name で変数 sNameに(引数の)値を設定します。

・8~10行目、Property Get Name で名前(Name)プロパティのsNameを取得します。

以下、15~38行目までは各プロパティごとに同様に設定します。

オブジェクトブラウザーで確認

オブジェクトブラウザーを開いて確認してみましょう。(F2キー押下で表示できます)

オブジェクトブラウザーでプロパティを確認

各プロパティとクラスモジュール内のPrivate変数がメンバーに表示されているのが確認できます。

違うインスタンスで同名のプロパティがある場合

違うインスタンス同士で、同じプロパティ名がある場合は、プロパティの値はインスタンス毎に別々に管理されます。「Name」と「Age」が該当しています。

今回の場合は引数の型が同一なので全く問題ありませんが、引数の型が異なっている場合は、プロパティをオーバーロードすることができます。
※オーバーロードについては、別の機会に解説したいと思います。

表のデータをクラス化して取得する

ワークシート上の表データをクラス化して各プロパティにセルの値を設定後、代入した情報を取得してメッセージ表示させてみます。

標準モジュールでセルのデータを取得します

表の1行分のデータを取得する標準モジュールのコードがこちらです。

Sub tableTest()
  'ownerとmypetインスタンス作成
  Dim owner As Class1: Set owner = New Class1
  Dim mypet As Class1: Set mypet = New Class1
  'Worksheetオブジェクト設定
  Dim ws As Worksheet: Set ws = Sheet1
  
  With ws
    'ownerクラスのプロパティ
    owner.Name = .Cells(4, 2).Value 'Nameに代入
    owner.Age = .Cells(4, 3).Value  'Ageに代入
    'mypetクラスのプロパティ
    mypet.Name = .Cells(4, 4).Value 'mypetのNameに代入
    mypet.Age = .Cells(4, 5).Value  'mypetのAgeに代入
    mypet.Types = .Cells(4, 6).Value 'Tipesに代入
    mypet.Gender = .Cells(4, 7).Value 'Genderに代入
  End With
  'メッセージに情報を表示
  MsgBox "OWNER:" & owner.Name & "(" & owner.Age & "歳)" & vbCrLf _
    & "ペット名:" & mypet.Name & "(" & mypet.Age & "歳)" & _
    mypet.Types & "/" & mypet.Gender
  '不要になったオブジェクトを解放
  Set ws = Nothing
  Set mypet = Nothing
  Set owner = Nothing
End Sub

【標準モジュールのコード解説】

・3行目で変数「owner」にクラスをインスタンス化しています。

・4行目で変数「mypet」にクラスをインスタンス化しています。

・6行目、「ws」変数にワークシートオブジェクト「sheet1」をセットしています。

・8~16行目、ownerクラスmypetクラスの各プロパティに表の該当セルの値を代入しています。

・19行目は、各プロパティから取得した値(情報)を整形してメッセージボックスに表示します。

・23~25行目は、各オブジェクト変数にNothingを代入してオブジェクトを解放しています。

【実行結果】…ペットの種類と性別が追加されています。

ペットの種類と性別が追加された実行結果のメッセージ

実行時の状況はローカルウインドウで確認できます。

ローカルウインドウで値を確認します

ローカルウィンドウは変数やプロパティ値を調べる場合に使用します。
※ VBEメニューから表示(V)→ローカルウィンドウ(S)クリックで表示できます。

ローカルウインドウで値を確認

「ownerクラス」「mypetクラス」共にうまく値を取得出来ていることが確認できます。

まとめ(おわりに)

以上、Excel VBAでシートの表データからクラスを作成する方法でした。

くるみこ
くるみこ

クラスの9回目でした。

前回までコード内に値を直接記述していましたが、今回はその部分をセルのデータから取得するように変更できました。表1行分のデータだけでしたがイメージはつかめましたか?

はい、セルの位置を指定するだけなのでその部分は簡単でした。でも、Nameプロパティを変数からPropertyプロシージャに変更したメリットなどがまだよくわかりません(^^;)

くるみこ
くるみこ

例えば、Nameに代入する値が間違っていないかどうかを調べる場合、「変数」の場合は標準モジュール内で代入する前にチェックする処理を別に書くことになります。一方「Propertyプロシージャ」なら、プロシージャ内にチェックする処理を書いておけるので、1か所で済みます。

次回はシートの表データの複数行からクラスを作る方法について勉強しましょう(^^)/

わかりました。次回もよろしくお願いしますm(_ _)m

まとめ

今まで、他の方法で全然支障なかったのでクラス化するなんて考えてもいませんでした(^^;)

でも、クラス化すればメソッドなども追加でき、いろいろと利用できるようになります。

いつも実行している処理があるなら、それをクラスに定義をして利用できるようにできます。

最後に、今回のワークシートの表データからクラスを作成した手順を整理しておきます。

【クラスモジュール】
・ワークシート上にある表の1行分のデータをすべてプロパティとして設定します。

・プロパティはすべてPropertyプロシージャで設定・取得するようにしました。

・同一プロパティ名になる(できる)場合は、別々のインスタンスに分けることでPropertyプロシージャを共有することができます。

【標準モジュール】
クラスを(今回は二つ)インスタンス化しました。

・ワークシートオブジェクトを設定しました。

・各セルの値をインスタンスのプロパティに格納しました。

・表1行分のデータを格納したインスタンスから取得・表示して確認しました。

・最後に不要になったオブジェクトは解放(Nothing)するようにしましょう。

次回は、シートの複数行ある表データをまとめて処理する方法について勉強します。

Excel VBA クラスについての記事一覧

Excel VBA クラスの作成・使い方について(Lv.1)
Excel VBA クラスのプロパティ設定について(Lv.2)
Excel VBA クラスにメソッドを設定する方法(Lv.3)
Excel VBA クラスをインスタンス化する方法(Lv.4)
Excel VBA クラス Propertyプロシージャ(Lv.5)
Excel VBA クラス Property Getプロシージャ(Lv.6)
Excel VBA クラス Property Letプロシージャ(Lv.7)
Excel VBA クラス Property Setプロシージャ(Lv.8)
Excel VBA シートの表データからクラスを作成 (Lv.9)
Excel VBA クラス インスタンスをコレクション化(Lv.10)
Excel VBA クラス コンストラクタとデストラクタ(Lv.11)
Excel VBA クラス コンストラクタを利用する方法(Lv.12)
Excel VBA クラス コレクションの要素取得方法(Lv.13)
Excel VBA クラス コレクション要素の追加と削除(Lv.14)
Excel VBA クラス コレクションの内容を書き出す(Lv.15)
Excel VBA クラス UserFormで機能を操作する(Lv.16)
Excel VBA クラス コレクションの最大要素数について(Lv.17)

★★★ ランキング参加中! クリックしてね(^^)/ ★★★

スポンサーリンク

過去記事のサンプルファイルをダウンロードできます

この記事のサンプル登録はありません。記事内のコードをご利用ください。

過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください