1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RubberDuckがパースエラーになったとき【VBA】

Last updated at Posted at 2020-10-01

あらすじ

VBAのテストフレームワークRubberDuckを利用して、
テスト駆動開発することが出来ます。
(RubberDuck詳細は下記にて紹介)

テストをするためには、
コードを書き換えるたびにRefreshをして、
RubberDuckにコードを監査させます。
image.png

Refreshボタンを押してエラーが発生し、上の画像のように真っ白になり、
何もできなくなった気がした時の解決法を書きます。

現象

前提

RubberDuckを利用して開発しているときに、
下記のコードを書いたとします。

ParseError.cls
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

image.png

パースと監査

テストを走らせる前に、
Refreshボタンを押して、
RubberDuckに監査させます。
image.png
アヒルたちがクルクルして監査が終わると、
RefreshボタンがReadyに変わるはずです。
そうすると、テストのRunができます。

パニック

しかし、Readyになるべきボタンが
ParseErrorとなり、子ウィンドウCode ExplorerCode InspectionsTest Explorerが真っ白になります。
こうなると軽いパニックです。

解決の糸口

ここで、気になるのが、Refreshボタンを押した後に出現した「赤丸に白バツ」のボタンです。
image.png
このボタンを押すと、下記のメッセージが見れます。

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が無いことが原因でした。

ParseError.cls
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の紹介です。
「初めまして、アヒルさん」な人はこちらをご覧ください。

Excelsior!

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?