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はここまでのデータを保持して、領域を拡張する意味です。
この後は構造体を元にダイヤグラムを描いていきます。