VBA で構造体
構造体ではなく、ユーザ定義型と呼ぶらしいです。内容的には大体一緒。
Type DataRecord name As String num As Integer End Type
このとき、他の関数(Sub や Function)の下に書くと実行時にエラーになります。Type の宣言は一番上で行うのがいいようです。この辺も C の構造体といっしょ。
構造体の配列が使えると、色々な処理が楽になります。たとえば、名前と値の入ったシート(もちろんサイズは不定)から名前別の合計データを作る処理。
Sub LoadRecord() Dim dataArray() As DataRecord ' 構造体の配列 Dim i As Integer ' ループカウンタ Dim j As Integer ' ループカウンタ Dim lastRow As Integer ' データシートの最終列 Dim initFlag As Boolean ' 初期化フラグ Dim index As Integer ' 配列のインデックス ' 初期化フラグを立てる initFlag = True ' データシートをアクティブに With Worksheets("データシート").Activate ' データシートの最終列を取得 lastRow = Range("A65536").End(xlUp).Row ' 合計データを作成 For i = 0 To lastRow ' 最初のデータは配列の初期化に利用 If initFlag = True Then ReDim dataArray(0) dataArray(0).name = Cells(i, 1).Value ' 1行目に名前があると仮定 dataArray(0).num = Cells(i, 2).Value ' 2行目にデータがあると仮定 initFlag = False Else ' 配列のインデックスを初期化 index = -1 For j = 0 To UBound(dataArray) ' 今までに発見した名前だった場合、データ更新 If dataArray(j).name = Cells(i, 1).Value Then dataArray(j).num = dataArray(j).num + Cells(i, 2).Value index = j Exit For End If Next ' 今までのデータに存在しない名前なら、後ろに追加 If index = -1 Then ReDim Preserve dataArray(UBound(dataArray) + 1) dataArray(UBound(dataArray)).name = Cells(i, 1).Value dataArray(UBound(dataArray)).num = Cells(i, 2).Value End If End If Next End With End Sub
これを二次元配列などでやろうとすると何をやっているのか分からなくなりがちなため、使えそうなところでは使っていくと便利かもしれません。