線を引いてみた

今日は、線を引くところまでを目指します。

まずは、横軸です。
4時から翌日2時までの枠を作ります。
Excelの列を10分きざみに見立てて、1時間おきに罫線を入れて行きます。
列の幅は試行錯誤で決めました。

Sub 時刻設定(cnt)
    Columns(1).ColumnWidth = 14
    cl = 2
    For hr = 4 To 25
        Cells(2, cl).Value = hr
        Cells(2, cl).HorizontalAlignment = xlLeft
        Range(Cells(2, cl), Cells(cnt, cl)).Borders(xlEdgeLeft).LineStyle = xlContinuous
        For i = 1 To 6
            Columns(cl).ColumnWidth = 5.66
            cl = cl + 1
        Next
    Next
    Range(Cells(2, cl), Cells(cnt, cl)).Borders(xlEdgeLeft).LineStyle = xlContinuous
End Sub

 

次に縦軸です。
よくある方法は駅間の距離に基づいて決めるのですが、実はそれだと駅間が短い時に、ちょっとスロー走行することが多くて、その結果ダイヤが詰まり気味になります。
今回は駅間を所要時間で作ってみました。
そうすると直線になりやすくて、見た目が整います。

Sub 駅間設定(dataSheet As Worksheet)
    rw = 2
    Range(Cells(rw, 1), Cells(rw, 6 * 22 + 1)).Borders(xlEdgeBottom).LineStyle = xlContinuous
    rw = rw + 1
    Do While dataSheet.Cells(rw, 1).Value <> ""
        Rows(rw).RowHeight = dataSheet.Cells(rw, 2).Value * 5
        Range(Cells(rw, 1), Cells(rw, 6 * 22 + 1)).Borders(xlEdgeBottom).LineStyle = xlContinuous
        rw = rw + 1
    Loop
End Sub

 

そして、スジを引きます。
誤差の少ない時は一本の直線で引けるように、ちょっと工夫しています。
X座標はどうしても誤差が出るので、できるだけ誤差を作らないように列の座標を基準に決めています。

Sub スジ(dataSheet As Worksheet)
    rw = 2
    ox = dataSheet.Cells(rw, 3).Value
    tx = ox
    oy = Rows(rw + 1).Top
    rw = rw + 1
    Do While dataSheet.Cells(rw, 3).Value <> ""
        dx = dataSheet.Cells(rw, 3).Value
        dy = Rows(rw + 1).Top
        tx = tx + TimeSerial(0, dataSheet.Cells(rw, 2).Value, 0)
        If tx > dx Or tx <= dx - TimeSerial(0, 1, 0) Then
            ActiveSheet.Shapes.AddConnector msoConnectorStraight, X座標(ox), oy, X座標(tx), dy
            ox = dx
            tx = ox
            oy = dy
        End If
        rw = rw + 1
    Loop
    If oy <> dy Then
        ActiveSheet.Shapes.AddConnector msoConnectorStraight, X座標(ox), oy, X座標(dx), dy
    End If
End Sub

Function X座標(tm)
    h = Hour(tm)
    If h < 4 Then
        h = h + 24
    End If
    m = Minute(tm)
    dm = m \ 10
    rm = m Mod 10
    cl = (h - 4) * 6 + dm
    bs = Columns(cl + 2).Left
    of = (Columns(cl + 3).Left - bs) * rm / 10
    X座標 = bs + of
End Function

 

結果はこんな感じです。

さて、スジらしくなりました。
この後は、後から改造しやすくするために、ソースの見直しをしたいと思います。