今回は構造体の中に配列を定義して使用する方法を紹介したいと思います。
以前に構造体に関する記事を投稿していますので、そちらも併せてご覧ください!
構造体の中に配列を定義して使用する方法
構造体の中に配列を定義して使用するのは至ってシンプルで、通常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
実行すると以下のようにデータが格納されます。
注意点
この方法を使用する上で注意点があります。それが構造体の宣言する位置です。
配列で使用するプロパティを宣言する用の構造体(今回の例だとhuman_InfoDetail)は配列を宣言する用の構造体(今回の例だとhuman)より先に宣言しなければなりません。
これが逆になってしまうと「コンパイル エラー:定義前のユーザー定義型を参照しています。」が発生してしまいます。
要は存在しない(まだ宣言していない)構造体を型に指定しているからエラーが発生するということになります。
その為、変数の型を構造体に指定する場合はその変数よりも先に構造体を宣言しておくようにしましょう。
まとめ
今回は構造体の中に配列を定義して使用する方法を紹介しました。
構造体内に配列を宣言する場合は、
- 普通の配列は通常通り宣言する(Dim …が取れただけ)
- 別の構造体のプロパティを使用する時はその構造体を先に宣言しておく
上記2点に注意しましょう。
コメント