【Excel VBA】構造体の中に配列を定義して使用する方法【Type】

Excel
スポンサーリンク

今回は構造体の中に配列を定義して使用する方法を紹介したいと思います。

以前に構造体に関する記事を投稿していますので、そちらも併せてご覧ください!

スポンサーリンク

構造体の中に配列を定義して使用する方法

構造体の中に配列を定義して使用するのは至ってシンプルで、通常Dim…で配列を定義する時と同じように、構造体内に定義するだけです。

'通常通り配列を定義する
Dim haribona_array()        As String
'Dimで定義する時と一緒
Private Type test_types
    haribona_array_type()       As String
End Type

ただ「宣言場所が構造体の中になり、Dimが取れた」だけなので、そこまで複雑ではないかと思います。

また要素数を定義する時も通常通りRedimやRedim Preserveを使用すればOKです

Dim types                   As test_types
    
ReDim types.haribona_array_type(3)
スポンサーリンク

別に定義した構造体を配列として使用する方法

どういう手法か

次に別に定義した構造体を配列として使用する方法です。

とはいっても、

どういうこと??

ってなる方が大半だと思います。

イメージとしては構造体を2つ用意し、一方は配列を宣言する用の構造体にしておき、もう一方は配列で使用するプロパティを宣言する用の構造体とする感じです。

Private Type human_InfoDetail
    FullName                    As String
    Gender                      As String
    Age                         As Long
    Prefecture                  As String
End Type

Private Type human
    Information()               As human_InfoDetail
End Type

ポイントは配列の型を該当する構造体名指定することです。

サンプルコードの紹介

例として個人情報を格納し、セルに入力するマクロを紹介します。適当なシートに貼り付けて実行してみてください。

Private Type human_InfoDetail
    FullName                    As String
    Gender                      As String
    Age                         As Long
    Prefecture                  As String
End Type

Private Type type_Human
    Information()               As human_InfoDetail
End Type

Sub output_HumanData()
    
    Dim human                   As type_Human
    Dim i                       As Long
    
    ReDim human.Information(3)
    
    With human.Information(0)
        .FullName = "はりぼな たろう"
        .Gender = "男性"
        .Age = 20
        .Prefecture = "北海道"
    End With
    
    With human.Information(1)
        .FullName = "はりぼな はなこ"
        .Gender = "女性"
        .Age = 21
        .Prefecture = "宮城県"
    End With
    
    With human.Information(2)
        .FullName = "はりぼな たかし"
        .Gender = "男性"
        .Age = 23
        .Prefecture = "東京都"
    End With
    
    For i = 0 To UBound(human.Information) - 1
        With human.Information(i)
            Range("A1").Offset(i, 0) = .FullName
            Range("B1").Offset(i, 0) = .Gender
            Range("C1").Offset(i, 0) = .Age
            Range("D1").Offset(i, 0) = .Prefecture
        End With
    Next i
    
End Sub

実行すると以下のようにデータが格納されます。

別に定義した構造体を配列として使用する方法_サンプルコードの紹介_1

注意点

この方法を使用する上で注意点があります。それが構造体の宣言する位置です。

配列で使用するプロパティを宣言する用の構造体(今回の例だとhuman_InfoDetail)は配列を宣言する用の構造体(今回の例だとhuman)より先に宣言しなければなりません

これが逆になってしまうと「コンパイル エラー:定義前のユーザー定義型を参照しています。」が発生してしまいます。

別に定義した構造体を配列として使用する方法_注意点_1

要は存在しない(まだ宣言していない)構造体を型に指定しているからエラーが発生するということになります。

その為、変数の型を構造体に指定する場合はその変数よりも先に構造体を宣言しておくようにしましょう。

スポンサーリンク

まとめ

今回は構造体の中に配列を定義して使用する方法を紹介しました。

構造体内に配列を宣言する場合は、

  • 普通の配列は通常通り宣言する(Dim …が取れただけ)
  • 別の構造体のプロパティを使用する時はその構造体を先に宣言しておく

上記2点に注意しましょう。

コメント

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