Excelでダイヤグラム:スジを引く

スジを引くところを、路線情報に対応します。
複数路線、上り下り、複数列車の準備をしますが、まだ未確認です。

Sub スジ(路線() As 路線情報, dataSheet As Worksheet, diagSheet As Worksheet)
    dlta = 0.000001
    For i = 0 To UBound(路線)
        cl = 3
        brw = 路線(i).下りデータ行
        ox = dataSheet.Cells(brw + 1, cl).Value
        tx = ox
        oy = brw + 1
        For irw = 2 To 路線(i).駅数
            dx = dataSheet.Cells(brw + irw, cl).Value
            tx = tx + TimeSerial(0, 路線(i).駅間(irw - 2), 0)
            If tx > dx + dlta Then
                diagSheet.Shapes.AddConnector msoConnectorStraight, _
                            X座標(ox, diagSheet), diagSheet.Rows(oy + 1).Top, _
                            X座標(dx, diagSheet), diagSheet.Rows(brw + irw + 1).Top
                ox = dx
                tx = dx
                oy = brw + irw
            ElseIf tx <= dx - TimeSerial(0, 1, 0) + dlta Then
                diagSheet.Shapes.AddConnector msoConnectorStraight, _
                            X座標(ox, diagSheet), diagSheet.Rows(oy + 1).Top, _
                            X座標(tx, diagSheet), diagSheet.Rows(brw + irw + 1).Top
                ox = dx
                tx = dx
                oy = brw + irw
            End If
        Next irw
        If oy <> brw + 路線(i).駅数 Then
            diagSheet.Shapes.AddConnector msoConnectorStraight, _
                            X座標(ox, diagSheet), diagSheet.Rows(oy + 1).Top, _
                            X座標(dx, diagSheet), diagSheet.Rows(brw + 路線(i).駅数 + 1).Top
        End If
    Next i
End Sub

今回のポイントは、デルタ値の導入です。
時刻は1日を1とした数で表示されるので、1時間は1÷24、1分は1÷24÷60になります。
この数字は割り切れないので、誤差が出ます。
この誤差の許容範囲がデルタ値です。
渋谷から中目黒の標準時間が4分なので、渋谷5:00発だと中目黒5:04発になります。
これはその通りなので、ここでスジを分ける必要はありません。
一方、自由が丘だと標準時間で5:12のはずが、自由が丘発の発時刻は5:13です。
実際東急のページで時刻を確認すると自由が丘着は5:11で、少し停車していることがわかります。
これは優等列車退避の場合も適用できるので、ルールを設けます。
最初の版とはルールを少し見直しました。
発時刻が標準時間より早い時は、それに合わせてスジを引きます。
発時刻が標準時間より1分以上遅い時は、きっと停車時間があると考え、標準時間で着いて発時間まで待っているという認識にします。
この判定にデルタ値を許容誤差として追加しています。
最後に終着までのスジを引いてなければ、足します。

これで、路線情報まわりの見直しは完了です。
次は複数のスジを引いたり、途中発着の対応をしたりしたいと思います。