VBAで予告無く終了するバグに悩まされました[追記あり]

パソコン・インターネット

ExcelのVBA(Visual Basic)で、頼まれたプログラムを作っていました。私は、ExcelでVBAのプログラムを書いた事はほとんど無くて、Googleで検索しまくりながら作り上げました。

やっと、最終デバッグを終わらせ、完成しました。ふぅ〜。

最後のバグは、手強かったです。ほぼ完成だと思って、いろいろなデータで試していた時に発見しました。

開発したプログラムは、Excelの表を行ごとに解析して、その結果を表示すると言う物でした。

なぜか、特定のデータを使って処理した時、まだ行が残っているのに、突然解析が止まってしまうのです。エラーメッセージは全く出ません。何故だ〜。

変数のウオッチ式を追加し、ステップ実行をして、遂に見つけました!! 次の様になっていたのです。

Sub foo(a)
    <処理1>
    If (a > 0) Then
        <処理2>
    Else
        <処理3>
    End
    End If
    <処理4>
End Sub

わかりますか? 間違えて、End Ifの前に、Endと入れてしまっていたのです。文法としては正しいから、エラーになりません。

End Ifの陰に隠れていて、Endが見えなかった…。

Visual Basicのエディタって、関数等の引数候補を自動表示してくれます。すごいと思ったのは、自分で定義したSubroutineでも、引数候補を表示してくれるのです。便利〜。

でも、エディタの基本的な機能と思われる、自動インデントが無さそうな感じです。自分で、TABキーでインデントを入れなければなりません。

今回のエラー、「必要の無い所にEndを入れてしまったの巻」も、自動インデントされていたら、もっと早く気が付いたかも〜。

(追記 2011-07-16 22:28)

「自動インデント」は効いていました。ですが、使いにくいです。

例えば、EmacsのPerl Modeだと、その行のどこにカーソルがあっても、TABを押せば、適切な位置にインデントを揃えてくれます。

VBAのエディタは、そういう事はできませんでした。

問題の箇所は、他の箇所からコピー&ペーストしてきていました。何故、Endだけになっているのか、不思議なのですが…。

Posted by お市のかた