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分以上遅い時は、きっと停車時間があると考え、標準時間で着いて発時間まで待っているという認識にします。
この判定にデルタ値を許容誤差として追加しています。
最後に終着までのスジを引いてなければ、足します。
これで、路線情報まわりの見直しは完了です。
次は複数のスジを引いたり、途中発着の対応をしたりしたいと思います。