【Excel VBA】構造体の中に構造体を入れる方法【Type】

Excel
スポンサーリンク

今回は構造体(Type)の中に構造体を入れる方法を紹介します。

過去記事で構造体を使用したマクロを紹介していますので、こちらも併せてご覧ください!

スポンサーリンク

構造体の中に構造体を入れる方法

結論、構造体の中に構造体を入れる方法は別にTypeを定義して、変数の型をそのType名で指定すればOKです。

文章だとよく分からないと思うので、今回例として個人情報を出力するマクロを作成しました。そのままコピペして確認してみてください。

Type AddressDetail
    Prefecture          As String
    Municipality        As String
    PlaceNameAndNumber  As String
End Type

Type testInformation
    LName               As String
    FName               As String
    Gender              As String
    Age                 As Long
    Height              As Double
    Weight              As Double
    Address             As AddressDetail
End Type

Sub test()
    
    Dim test_user       As testInformation
    
    With test_user
        .LName = "はりぼな"
        .FName = "じろう"
        .Gender = "男性"
        .Age = 25
        .Height = 175.5
        .Weight = 68.7
        .Address.Prefecture = "はりぼな県"
        .Address.Municipality = "はりぼな市"
        .Address.PlaceNameAndNumber = "わんこ1-2-3"
        
        MsgBox "名前:" & .LName & " " & .FName & vbCrLf & _
               "性別:" & .Gender & vbCrLf & _
               "年齢:" & .Age & "歳" & vbCrLf & _
               "身長:" & .Height & "cm" & vbCrLf & _
               "体重:" & .Weight & "kg" & vbCrLf & _
               "住所:" & .Address.Prefecture & .Address.Municipality & .Address.PlaceNameAndNumber
    End With
End Sub

実行するとこんな感じで名前やら性別,住所がメッセージボックスに表示されます。

構造体の中に構造体を入れる方法_実行例

それぞれポイントになるところを順に説明します。

Typeを別途定義する

今回の例ではTypeをtestInformationAddressDetailの2つを定義しました。testInformationは名前,性別,年齢,身長,体重,住所を格納する用で、AddressDetailは住所の詳細(県,市町村,地名・番地)を格納する用で定義しています。

Type testInformation
    LName               As String
    FName               As String
    Gender              As String
    Age                 As Long
    Height              As Double
    Weight              As Double
    Address             As AddressDetail
End Type
Type AddressDetail
    Prefecture          As String
    Municipality        As String
    PlaceNameAndNumber  As String
End Type

このように、構造体を入れたい場合はまずTypeを別に定義しておく必要があります。ここは当たり前っちゃ当たり前ですね。(笑)

変数の型を対象のType名で定義する

Typeを入れたい場合、変数の型を対象のType名で定義する必要があります。例で言うと、testInformationAddressの型をAddressDetailで定義する感じです。

Type testInformation
~
    Address             As AddressDetail
End Type

このように定義することでAddressDetail内の変数を指定できるようになります。

呼び出し方

Typeを入れた変数を呼び出したい場合、プロパティを使用するときと同じように変数を.(ドット)で繋いであげると呼び出すことが出来ます

今回の例だとtest_user.Address.PrefectureのようにすればOKです。

    With test_user
        .LName = "はりぼな"
~
        .Address.Prefecture = "はりぼな県"
        .Address.Municipality = "はりぼな市"
        .Address.PlaceNameAndNumber = "わんこ1-2-3"
~
    End With

このように、

Sub内で定義した変数名】.【Type名の型の変数名】.【Type内の変数名】

とすることでTypeに入れた変数を呼び出すことが出来ます。

スポンサーリンク

注意点

構造体の中に構造体を入れる時の注意点は入れたいTypeを入れるTypeより上の位置に定義することです。これまた分かりにくいと思いますが、今回の例で言うとtestInformationより上にAddressDetailを定義しないとダメってことです。

Type AddressDetail
    Prefecture          As String
    Municipality        As String
    PlaceNameAndNumber  As String
End Type

Type testInformation
    LName               As String
    FName               As String
    Gender              As String
    Age                 As Long
    Height              As Double
    Weight              As Double
    Address             As AddressDetail
End Type

それより下に定義していると実行時にエラーが発生します。

注意点_エラー

なので、構造体を入れたい時はTypeの位置を入れるTypeより上に定義するように気を付けましょう。

逆にエラーが起きるようなら、Typeの位置が間違っていないか(下に定義していないか)確認するようにしましょう。

スポンサーリンク

まとめ

今回は構造体の中に構造体を入れる方法を紹介しました。構造体を入れる場合は、

  • 別にTypeを定義して、変数の型をそのType名で指定する
  • エラーが出たら、Typeの定義位置を確認する

この2点を気を付けて使いましょう。

コメント

タイトルとURLをコピーしました