2012年12月12日水曜日

[ExcelVBA] Gotoを使おう!


アドベントカレンダー 12日目

みなさーん。Goto使ってますかぁ〜♪
はい。じゃんじゃん使ってますね。

いやー便利便利。
Goto使わないとかないですよねぇ。

とかいうと、
スパゲッティーつくりたきゃ、料理人になれよ!
と罵声を浴びてしまいそうになりますが・・・

javascriptならbreak, continue
perlならlast, next
vb.netでさえexit, continue

などがあるというのに…
残念ながらVBAでは次のループへに該当するものがない…
そこでgotoを変わりに使おうよ。
って話ですよ。

するとね。
gotoなんてスパゲッティーの温床!
gotoなんて使わずに表現できるからそうしなさい!
なんて言うわけですよ。

あの・・・
本来のあるべきコードの解釈をねじまげてまで、
gotoを使わないことに必死になることはないと思うんですよね。
そもそも、にっくきはスパゲッティーなコーディングなわけであって
他の言語のループ制御と同等の使い方と限定したならば
特に問題は発生しないと思うんですけどね。

例えば、ファイルを開き1行ずつ処理する場合
開く→1行データ取得→必要データか判定→必要データを所定の処理をして取得
と考えた場合以下のようにかける。
ポイントは、不要データのコードがかかれている部分
必要データのコードが書かれている部分がネストされることなく
はっきりとわかるようになっていること。

Sub SampleCode(ByVal FilePath As String)
    Dim FSO     As Object
    Dim FH      As Object
    Dim OneLine As String
    
    '** Objectの生成 **
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    
    Set FH = FSO.OPenTextFile(DataFilePath, 1)
    
    Do While Not .AtEndOfStream
        '■1行ずつ取得する
        OneLine = .ReadLine
    
        '■特定の条件を満たさない行はデータとして取得しない
        '空行は次のループへ
        If Trim(OneLine) = "" Then GoTo NextDoLoop
        
        '○○を含む行はヘッダー行なので除外する
        If 0 < InStr(OneLine, "○○") Then GoTo NextDoLoop
        
        '××を含む行はフッター行なので除外する
        If 0 < InStr(OneLine, "××") Then GoTo NextDoLoop
        
        
        '■上記で除外すべきデータを除いているので
        '  ○×△なデータだけになっている
        
        '以下いろんな処理
        
NextDoLoop:
    Loop
    
    FH.Close
    
    Set FH = Nothing
    Set FSO = Nothing
End Sub
可読性を犠牲にしてまで、スパゲッティー呪文に取り憑かれて つかわないようにするのはどうなんだろうねぇ。。 と思う今日この頃でした。

0 件のコメント: