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行データ取得→必要データか判定→必要データを所定の処理をして取得
と考えた場合以下のようにかける。
ポイントは、不要データのコードがかかれている部分
必要データのコードが書かれている部分がネストされることなく
はっきりとわかるようになっていること。

  1. Sub SampleCode(ByVal FilePath As String)  
  2.     Dim FSO     As Object  
  3.     Dim FH      As Object  
  4.     Dim OneLine As String  
  5.       
  6.     '** Objectの生成 **  
  7.     Set FSO = CreateObject("Scripting.FileSystemObject")  
  8.       
  9.       
  10.     Set FH = FSO.OPenTextFile(DataFilePath, 1)  
  11.       
  12.     Do While Not .AtEndOfStream  
  13.         '■1行ずつ取得する  
  14.         OneLine = .ReadLine  
  15.       
  16.         '■特定の条件を満たさない行はデータとして取得しない  
  17.         '空行は次のループへ  
  18.         If Trim(OneLine) = "" Then GoTo NextDoLoop  
  19.           
  20.         '○○を含む行はヘッダー行なので除外する  
  21.         If 0 < InStr(OneLine, "○○"Then GoTo NextDoLoop  
  22.           
  23.         '××を含む行はフッター行なので除外する  
  24.         If 0 < InStr(OneLine, "××"Then GoTo NextDoLoop  
  25.           
  26.           
  27.         '■上記で除外すべきデータを除いているので  
  28.         '  ○×△なデータだけになっている  
  29.           
  30.         '以下いろんな処理  
  31.           
  32. NextDoLoop:  
  33.     Loop  
  34.       
  35.     FH.Close  
  36.       
  37.     Set FH = Nothing  
  38.     Set FSO = Nothing  
  39. End Sub  
可読性を犠牲にしてまで、スパゲッティー呪文に取り憑かれて つかわないようにするのはどうなんだろうねぇ。。 と思う今日この頃でした。

0 件のコメント: