Excel VBA > VBA:実務活用 > 実行時エラーと論理エラーについて
このエントリーをはてなブックマークに追加

実行時エラーと論理エラーについて

プログラムのエラーとは・・

このトピックは「質問掲示板」の類を見てて、質問者はもっと分かりやすく書かないと回答できない、と思ったのがきっかけです。質問者はエラーと言っても、色々な環境での様々なエラーがあるということを多分気づいておらず、文字のみで説明するには明らかに緩すぎて回答にたどり着かないと思ったことがきっかけです。。

さて、本題ですがVBAやマクロ記録でのエラーは開発者にとって本当に嫌なものです。特にマクロ記録を使って、コードを自動生成し、それをほんの少し変えただけで動かないときに身近に聞く人もおらず、ネットで調べてもどの部分を直せばいいかまで分からず「もう、やってられない!」ってことはないでしょうか?
20年以上前にテレビゲームがはやり始めたころは、このエラーが「神技級、横綱級」として子供には喜ばれましたが、業務でのプログラムエラーはバグと言われ、致命傷になりかねず、取り除かなければなりません。

エラーの種類は「実行時エラー」と「論理エラー」

VBAのエディタを使って、自らガリガリコードを書く場合はもちろん、マクロの記録だけ使ってるにもかかわらず発生するエラーもあったりします。
エラーの種類は主に下記の2点のどちらかに当てはまります。
1.実行時エラー(物理エラー)
2.論理エラー

これを料理に例えてみます。
「料理しておいしく出来上がる」こと→成功(エラーなし)とすると、、

【実行時エラー】
材料がないから作れない。

【論理エラー】
材料はある、レシピ通りだが、なぜか超まずい

といった感じです。う~ん、ちょっと強引な表現ですが。

実行時エラー(物理エラー)とは文法エラー

実行時エラーとは下記の画面が出てくる場合です。

マクロを覚えたての方やある程度自分でコーディングするとよくお目にかかるコレです。このエラーは「文法的にどこかがおかしい」というもので、その文法さえ修正すれば動くタイプのエラーです。
簡単にいえば、文法エラーなのでそこさえ直せば動くようになります。
ただし、気を付けるべきは上記画面の「エラー番号と文言」です。要は全部ですが、このエラー表記は他のエラーでも同じ番号と文言が使われることもあります。従って、「このエラーメッセージが出た場合はこうやる」というのが結構難しいのです。
むしろ解決に直結するのは黄色でハイライト(強調)表示された部分です。
「シート名が見つからないエラー」

この部分を見てどこがおかしいのか判断するほうが早いこともよくあります。(上記のエラーの原因はシート名が「sheet999」をアクティブにしようとしているにも関わらず、そのシート名が存在していないためのエラーです)
ちなみに下記のエラーでも、上記の「シート名が見つからないエラー」と同じ実行時エラー画面内容になります。
「配列の要素数が足りないエラー」

(「シート名が見つからないエラー」と同じエラー番号とエラーメッセージが表示されます)

実行時エラーは恐らくVBAのプログラムコードに慣れていない方が連発して起こるエラーだと思います。(特にマクロの記録を使う場合に「Range」オブジェクト関連のエラーが多い傾向があるように思います)
ちなみに、この実行時エラーはコードをガンガン書きまくり経験を積むことで、ある程度見ただけでどこがおかしいか気づくようになりますので頑張ってください。(ただしWebBrowser連携などは、また一風変わった実行時エラーのため、簡単に解決できず辛いこともあります)

論理エラーとは「矛盾じゃない?矛盾エラー」

こちらのエラーは開発規模が大きくなればなるほど、面倒なエラーです。このエラーの面倒なところは文法的には間違っていないけど、求めた結果になっていないというエラーです。このタイプのエラーは発見するためにはプログラムコードを一つずつ流れを追っていく必要があり、発見には時間がかかります。
例えば、リストボックスのデータを取り扱うときや配列(通常は)のインデックスを取り扱うときは「0」から開始しますが、シート上に展開しているデータをCellsを使って取り出す(行列を指定する)ときは「1」から開始します。そのためこれらを結びつけた処理をするとき、どちらかの部分を「+1」、あるいは「-1」にして、合わせないといけないのですが、これを忘れると先ほど言った「エラーはないけど、求めた結果にはならない」ということになります。

そもそもプログラムは命令通りにしか動かないため、仮に求めている結果でなくても、文法さえ間違っていなければそのまま実行されてしまいます。従い発見が困難となります。そのため、このエラーを可能な限り可視化するためのツールがVBAのエディタに用意されているので、そういったツールを駆使してエラー除去(デバッグ)していく必要があります。
論理エラーは実行時エラーと比べ難易度がはるかに高くなるため、コーディングするレベルで書き方の工夫や、プロシージャを細分化、共有化、コメントを書きまくるなど可読性の高い(読みやすい)コードにしておくと、発見できる時間が短くなります(経験的に)。

カテゴリ:VBA:実務活用