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

これを二次元配列などでやろうとすると何をやっているのか分からなくなりがちなため、使えそうなところでは使っていくと便利かもしれません。