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です。
もうちょっとリファクタリングしてみたいところはありますが、次は上りの線を引いてみたいと思います。