■
ExcelのVBAの仕事の中で、
「現在動いているものですからサンプルに〜」
っといただいたものがあった。
コードを開いたら・・・・・・
Sub Edit_Proc2(Flg As Integer)
Dim i As Long
Dim j As Long
Dim k As Long
Dim m As Long
Dim n As Long
Σ(゚д゚ )!?!?
ソースを開いてわずか1秒。
目の前がクラクラしました。
この後のソースを見るまでも無く断言できる。
(,,゚Д゚)<これはクサレコードだ
たった7行ですが以下の状況により次のことが推測できます。
- Function名が連番名になっている
- おそらくループカウンタが5つもある
- その全てが1文字変数である
これらより
- 2より、このFunctionの行数はだいぶ長い
- 同じようなFunctionが複数ある
- サブルーチン化などされてようはずはない
- 共通化なんぞ夢のまた夢
- 1より、連番変数も使われていそう
- 1と2より、その数も多いだろう
- 2より、2重3重当たり前の多重ループがありそう
- 3より、ほかの変数名もロクなことにはなってなさそう
- 行そもそもコメントがないことから、行き当たりばったりなソースが記述されていそう
心温まる推測状況がかけらも見当たりません。
ちょろっと答えあわせをするべく中身を覗いてみてみたら。
このFunctionは820行ほどあり。
Dim SheetName1 As Object
Dim SheetName2 As Object
Dim SheetName3 As Object
というこれまた殴り倒したくなるようなネーミングがあり。
処理の区分けにラベルが使われておりGoto制御。
Cell位置に名前をつける努力の跡がみえる変数はよいけれど、
それ以外のマジックナンバーの多いこと多いこと。
ちょいと伏せるとこ伏せるけどこの3重ループ。
For i = 2 To 60000
If 判定 Then
For j = i + 1 To 60000
If 判定 Then
For k = i To j
'処理〜
Next k
i = j
Exit For
End If
If SheetName1.Cells(j, 1) = "" Then
Exit For
End If
Next j
End If
If SheetName1.Cells(i, 1) = "" Then
Exit For
End If
Next i
(,,゚Д゚)<内側のループの中で外側のループカウンタ書き換えんな
(,,゚Д゚)<ってか60000ってなにその中途半端に多い限界値
こんなFunctionが3つもありました。
こりゃこえーと思ってほかもよくよくみてみたら、でるわでるわ。
特にひどいのこれ
For i = i To 65536
'70行くらいのソースFor n = i To 65536
If 判定 Then
Exit For
End If
Next n
i = nIf n = 65537 Then
Exit Sub
End Ifj = j + 1
m = m + 1
If SheetName3.Cells(m, 7) = "" Then
Exit For
End If
'350行くらいのソース
LBL1:
'130行くらいのソース
Next i
(,,゚Д゚)<「n = 65537」になる条件ってなによ!
(,,゚Д゚)<なんで560行を超える巨大なループやねん
(,,゚Д゚)<途中にラベルがあるってどうよ
なによりこれ。
<怒り>
(#゚Д゚)<1文字変数の使いまわしヤメロ!!
</怒り>
説明受けている時に聞いた言葉がよみがえってきました。
( ´∀`)<これね〜。○○会社に入れたときにそこ専用にガッツリ組んだらしいんですよ〜。
なんで汎用性なしなんで、今回汎用的にしたいんですよね〜。
今なら実感を伴って改めていえる
(,,゚Д゚)<激しく同意だゴルァ