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だけになっているのか、不思議なのですが…。
ディスカッション
初めて投稿します。えのちゃんと申します。
VBAのインデントのことなのですが
VBAのエディタ画面上で[ツール]→[オプション]を選択して
自動インデントのチェックボックスをチェックすれば
一応、enterキーを押したとき前の行の開始位置にカーソルが移ります。
それにしても、EndとEnd Ifは他言語の方からすると紛らわしいですよね!
参考URL
http://kabu-macro.com/vba_apply/vba_indent.html
****************************
あと、茉奈佳奈ちゃんも応援しています。
茉奈佳奈好きのSE、って覚えてくれると嬉しいです。
良かったら、僕のブログやプロフィールもご覧ください[E:wink]
えのちゃんさんへ、初コメントありがとうございます。
参考URLもありがとうございます。
デフォルトで、自動インデントがONになっているのですよね?
オフにしていないので、多分ONになっていたと思います。
そういえば、確かに、インデントされていました。
追記を書いたのですが、VBAの自動インデントは、自動と言っても、かなり手動に近いです。
Endifにしておいてくれると良かったのに…。
ブログを見させていただきました。茉奈 佳奈好きですか〜! 今後ともよろしくお願いします。