Excelでダイヤグラム:リファクタリング

プログラムの動作を変えずに、ソースコードをきれいにすることをリファクタリングと言います。
なんだけど、リファクタリングして動作が変わらないということをどうやって保証するか。

仕事の時はちゃんと悩みますが、今回は出力したダイヤが同じならOKなので、気持ちよくリファクタリングしましょう。

基本は似ているコードの共通化=関数・サブルーチン切り出しです。
今回はここを対応しました。

Sub 線描画(sht As Worksheet, ox, oy, dx, dy, clr, wgt)
    With sht.Shapes.AddConnector(msoConnectorStraight, _
                    X座標(ox, sht), sht.Rows(oy + 1).Top, X座標(dx, sht), sht.Rows(dy + 1).Top)
        .Line.ForeColor.RGB = clr
        .Line.Weight = wgt
    End With
End Sub

呼び出し側でも対応すればOKです。

            Do While irw <= 路線(i).駅数
                If dataSheet.Cells(brw + irw, cl).Value = "" Then
                    Exit Do
                End If
                dx = dataSheet.Cells(brw + irw, cl).Value
                tx = tx + TimeSerial(0, 路線(i).駅間(irw - 2), 0)
                If dx <> "↓" Then
                    If tx > dx + dlta Then
                        Call 線描画(diagSheet, ox, oy, dx, brw + irw, clr, wgt)
                        ox = dx
                        tx = dx
                        oy = brw + irw
                    ElseIf tx <= dx - TimeSerial(0, 1, 0) - dlta Then
                        Call 線描画(diagSheet, ox, oy, tx, brw + irw, clr, wgt)
                        ox = dx
                        tx = dx
                        oy = brw + irw
                    End If
                End If
                irw = irw + 1
            Loop
            If oy <> brw + irw - 1 Then
                Call 線描画(diagSheet, ox, oy, dx, brw + irw - 1, clr, wgt)
            End If

はい、ひとつバグが見つかっていますね。
デルタ値は、違っても気にしないということなので、以下の行で加減が違ってました。

                    ElseIf tx <= dx - TimeSerial(0, 1, 0) - dlta Then

出力結果がちょっと変わりましたが、いい方向に変わってる感じなのでOKです。

もうちょっとリファクタリングしてみたいところはありますが、次は上りの線を引いてみたいと思います。