あらすじ
VBAのテストフレームワークRubberDuckを利用して、
テスト駆動開発することが出来ます。
(RubberDuck詳細は下記にて紹介)
テストをするためには、
コードを書き換えるたびにRefresh
をして、
RubberDuckにコードを監査させます。
Refresh
ボタンを押してエラーが発生し、上の画像のように真っ白になり、
何もできなくなった気がした時の解決法を書きます。
現象
前提
RubberDuckを利用して開発しているときに、
下記のコードを書いたとします。
Option Explicit
Public Sub ParseError()
Dim i As Integer
For i = 1 To 10
If i Mod 2 Then
Debug.Print("This Code Can't Run!")
Next
End Sub
パースと監査
テストを走らせる前に、
Refresh
ボタンを押して、
RubberDuckに監査させます。
アヒルたちがクルクルして監査が終わると、
Refresh
ボタンがReady
に変わるはずです。
そうすると、テストのRun
ができます。
パニック
しかし、Ready
になるべきボタンが
ParseError
となり、子ウィンドウCode Explorer
やCode Inspections
、Test Explorer
が真っ白になります。
こうなると軽いパニックです。
解決の糸口
ここで、気になるのが、Refresh
ボタンを押した後に出現した「赤丸に白バツ」のボタンです。
このボタンを押すと、下記のメッセージが見れます。
Module L54C5 mismatched input 'Next' expecting {ABS, ANY, ARRAY, CBOOL, CBYTE, CCUR, CDATE, CDBL, CDEC, CINT, CLNG, CLNGLNG, CLNGPTR, CSNG, CSTR, CURRENCY, CVAR, CVERR, DEBUG, DOEVENTS, FIX, INPUTB, INT, LBOUND, LEN, LENB, LONGLONG, LONGPTR, MIDB, PSET, SGN, UBOUND, ACCESS, ADDRESSOF, ALIAS, AND, ATTRIBUTE, APPEND, AS, BEGINPROPERTY, BEGIN, BINARY, BOOLEAN, BYVAL, BYREF, BYTE, CLASS, CLOSE, DATABASE, DATE, DOUBLE, ELSE, ELSEIF, END_IF, ENDPROPERTY, END, EQV, ERROR, FALSE, GET, IMP, IN, INPUT, IS, INTEGER, LOCK, LONG, LIB, LIKE, LINE_INPUT, LOCK_READ, LOCK_WRITE, LOCK_READ_WRITE, ME, MID, MOD, NAME, NEW, NOT, NOTHING, NULL, OBJECT, ON_ERROR, OPEN, OPTIONAL, OR, OUTPUT, PARAMARRAY, PRESERVE, PRINT, PTRSAFE, PUT, RANDOM, RANDOMIZE, READ, READ_WRITE, REM, RESET, SEEK, SHARED, SINGLE, SPC, STEP, STRING, TAB, TEXT, THEN, TO, TRUE, TYPEOF, UNLOCK, UNTIL, VARIANT, VERSION, WIDTH, WITHEVENTS, WRITE, XOR, '-', '[', OCTLITERAL, HEXLITERAL, FLOATLITERAL, INTEGERLITERAL, WS, IDENTIFIER, LINE_CONTINUATION}
ここから、Next
の前後でミスが無いかを見ればいいということまではわかります。
結果
結果として、End If
が無いことが原因でした。
Option Explicit
Public Sub ParseError()
Dim i As Integer
For i = 1 To 10
If i Mod 2 Then
Debug.Print("This Code Can't Run!")
End If '←これです!
Next
End Sub
ケアレスミスさんです。
まとめ
RubberDuck で Parse Error
が起きたら、「赤丸白バツ」のボタンを押してみましょう。
追記
@tenmyoさんからのコメントで、Refreshの前にVBEの方のコンパイルを走らせる習慣にしても良いかもしれません。
RubberDuckの使い方
RubberDuckの先輩たちによるRubberDuckの紹介です。
「初めまして、アヒルさん」な人はこちらをご覧ください。
- VBAにはユニットテストやリファクタリング機能がない・・・そんなふうに考えていた時期が俺にもありました
- VBA開発環境をモダンにする - RubberduckとVBEThemeColorEditorの紹介
Excelsior!