Excelでダイヤグラム:路線情報を構造体にする

そんなわけで、タイトルも「Excelダイヤグラム」になりました。
今日は、路線情報を構造体にします。

構造体でなくてもクラスという選択肢もありますが、路線情報のデータはほぼ読み込むだけで、データを使って何か操作したり、データ間の整合性を取ったりという処理がほぼないので、クラスにする必然性はありません。
なので、構造体にします。
以下のようになります。

Type 路線情報
    路線名 As String
    ダイヤ行 As Integer
    下りデータ行 As Integer
    上りデータ行 As Integer
    駅数 As Integer
    駅名() As String
    駅間() As Integer
End Type

今は、標準モジュールを使っているので、Typeのスコープは気にしなくていいですが、もしシート別のモジュールを使うなら、Privateにする必要があります。
そうなると引数に使っているサブルーチンや関数が全部Privateになって、まあそれはそれでいいんですが、わざわざそんな手間をかける必要もないので、これでいきます。
路線を追加していいように、データやダイヤが始まる行を覚えます。
今は使いませんが、データは上り下り別になる予定です。
駅名と駅間は可変長配列にします。
駅間を距離など整数以外で持ちたいなら、Singleとかにしてください。

構造体の配列を取って、初期化します。
呼び出し側に可変長配列をつくって、こんな感じで。

    Dim 路線() As 路線情報
    Call 路線情報作成(路線, dataSheet)

呼び出し先で路線情報を読み取って、データ化します。

Sub 路線情報作成(路線() As 路線情報, sht As Worksheet)
    rw = 1
    idx = 0
    Do While データ先頭(rw, sht)
        s = sht.Cells(rw, 1).Value
        nm = Mid(s, InStr(s, "【"))
        ReDim Preserve 路線(idx)
        路線(idx).路線名 = nm
        路線(idx).下りデータ行 = rw
        rw = rw + 1
        cnt = 0
        Do While sht.Cells(rw, 1).Value <> ""
            ReDim Preserve 路線(idx).駅名(cnt)
            路線(idx).駅名(cnt) = sht.Cells(rw, 1).Value
            If cnt > 0 Then
                ReDim Preserve 路線(idx).駅間(cnt - 1)
                路線(idx).駅間(cnt - 1) = sht.Cells(rw, 2).Value
            End If
            cnt = cnt + 1
            rw = rw + 1
        Loop
        路線(idx).駅数 = cnt
        idx = idx + 1
    Loop
End Sub

Function データ先頭(ByRef rw, sht As Worksheet)
    For i = 1 To 5
        If sht.Cells(rw, 1) <> "" Then
            データ先頭 = True
            Exit Function
        End If
        rw = rw + 1
    Next
    データ先頭 = False
End Function

2路線目のデータは作ってなくて動作は確認てきていませんが、5行の空白があればデータの終わりと認識します。
路線名は「下り【東横線】」のように、【】で囲んでその前に補足を付けます。
補足はA線とか内回りとか何でもいいですが、往復なら2回出てくるでしょう。
【】の範囲を路線名として認識します。
あとは、空行が出てくるまで駅名を、そして2駅目以降には駅間が記載されている想定です。
ReDimが曲者です。
配列の中に使いたい最大の添え字を書きます。要素数ではありません。
添え字って今でも使うのかな?最近はインデックスと呼んでる気がする。
Preserveはここまでのデータを保持して、領域を拡張する意味です。

この後は構造体を元にダイヤグラムを描いていきます。