2010年4月9日金曜日

コピペコード

自分は、コピペコードは禁止している。
手作業で似たような箇所を3カ所以上修正する場合には、プログラムで発生させることにしている。
プログラムで直すと、最初に手間はかかるけど、次の修正には時間がほとんどかからない。
何故そうしているかは、『修正が何度もあるから』である。
手で直している限りは、必ず同じ分の時間がかかる。
しかも、手作業ではミスが発生しやすい。
そして、コピペコードは間違えた場合に、極めて発見しにくいバグとなる。
たとえば、

ActiveWorkbook.Worksheets("header").Range("EA" & CStr(xlsRow)).Value = .Range("EA" & CStr(csvRow)).Value
ActiveWorkbook.Worksheets("header").Range("EB" & CStr(xlsRow)).Value = .Range("EB" & CStr(csvRow)).Value
ActiveWorkbook.Worksheets("header").Range("EC" & CStr(xlsRow)).Value = .Range("EC" & CStr(csvRow)).Value
ActiveWorkbook.Worksheets("header").Range("ED" & CStr(xlsRow)).Value = .Range("ED" & CStr(csvRow)).Value
ActiveWorkbook.Worksheets("header").Range("EE" & CStr(xlsRow)).Value = .Range("EE" & CStr(csvRow)).Value
ActiveWorkbook.Worksheets("header").Range("EF" & CStr(xlsRow)).Value = .Range("EE" & CStr(csvRow)).Value
ActiveWorkbook.Worksheets("header").Range("EG" & CStr(xlsRow)).Value = .Range("EG" & CStr(csvRow)).Value
ActiveWorkbook.Worksheets("header").Range("EH" & CStr(xlsRow)).Value = .Range("EH" & CStr(csvRow)).Value
ActiveWorkbook.Worksheets("header").Range("EI" & CStr(xlsRow)).Value = .Range("EI" & CStr(csvRow)).Value
ActiveWorkbook.Worksheets("header").Range("EJ" & CStr(xlsRow)).Value = .Range("EJ" & CStr(csvRow)).Value
ActiveWorkbook.Worksheets("header").Range("EK" & CStr(xlsRow)).Value = .Range("EK" & CStr(csvRow)).Value
ActiveWorkbook.Worksheets("header").Range("EL" & CStr(xlsRow)).Value = .Range("EL" & CStr(csvRow)).Value

この間違いが一見して分かるだろうか。
EFとするべきところが、EEになってしまっている。よーく見ても似ている字なのでなかなか見つけにくい。
そもそも連続しているのだから、ループにすれば良いと思う。
だが、エクセルは列は文字列なので、そのままできない。
列名を配列に入れる方法もあるが、ここは列名を数字に相互変換するメソッドを用意した方が色々と計算が簡単になる。

列名加算なるメソッドを追加して、次の様に書く。

Dim ws
Dim column
Set ws = ActiveWorkbook.Worksheets("header")

For i = 0 To 12
column = 列名加算("EA", i );
ws.Range(column & CStr(xlsRow)).Value = .Range(column & CStr(csvRow)).Value
Next

もっともRangeの設定を上手にすれば、そもそもループせんでも良いのでは?などという突っ込みもあるけど。一応参考例として。

0 件のコメント:

コメントを投稿