GEN MUTO'S HOMEPAGE  エクセル大事典  エクセルVBAを極める

エクセルExcel大事典 エクセル大事典TOPページへ
 ■ エクセルVBA中級編−VBAでいろんなテクニック
  エラー処理(例外処理)は重要です1
 
■ エラー処理(例外処理)1

今までエラー処理に関しては、ほとんど触れずに来ました。エラーは、プログラムをする上で避けて通れない問題であり、エラー処理を行わないプログラミングというものもあり得ません。

一般にエラーには3つの種類があるといわれています。
1.コンパイル時(前)に発生するエラー
BASICを経験した方なら「SyntaxError」シンタックスエラーをおぼえているでしょう。
VBEの文法チェック機能はかなり優秀で、コンパイル前に文法エラーの大部分を洗い出し、指摘してくれます。VBEを開発環境として使用している限り、これらのエラーに悩まされることはほとんど無くなりました。
一般的には構文エラーと呼ばれます。
2.例外的なケースに発生するエラー
たとえば、ファイルを呼び出そうとしたときに呼び出し先のドライブが用意されていなかったとか、定義されている配列の範囲を超えるインデックスが指定されたなどです。
これらのエラーの中には、ロジックの見直しやプログラムの修正で回避できるものと、できないものがあります。
一般的には実行時エラーと呼ばれます。
3.期待されている結果と異なるというエラー
出力された合計値が異なっている、小数演算に誤差がある、ユーザーが指定した範囲のデータを対象にしていない。
など、プログラムそのものは正常に動作しているものの、結果としてユーザーの期待にそぐわない、開発者の意図したものと異なる動作を行うエラーの類です。
一般的には論理エラーと呼ばれます。

この他にも「不正な処理」「一般保護エラー」と呼ばれるエラーがありますが、これらのエラーに関しては今回は取り上げません。

今回の、エラー処理で対象にするのは2つ目の実行時エラーに関してです。構文エラーはコンパイル時にコンパイラがチェックを行いますので、コンパイルが通らなかった場合、そもそもプログラムを実行することができません。
論理エラーはエラー処理として行う類のものではなく、開発者が仕様書とにらめっこして、ロジックを修正する以外、対処する方法はありません。

エラーが発生した場合に、Excel VBAの場合、エラーメッセージが表示されコードの実行が一時停止します。そこで、ユーザーは「継続」「終了」「デバッグ」「ヘルプ」を選択することができます。
これは、Excel VBAがあくまでExcelというアプリケーション上で動作しているからです。VBのEXEファイルのように、コンパイルした実行ファイルの場合、プログラムそのものが強制終了してしまいます。Accessランタイムで作成した実行ファイルも同様です。

このようにアプリケーション側が受け皿となって、VBAの実行時エラーに対応するからといって開発者側がエラー処理を実装しなくてよい。ということには全然なりません。

エラー処理の本質は、プログラムの処理を継続させることにあります。致命的なエラーが発生した場合、中途で終了したプログラムがどこまで処理を完了していて、どこから処理を再開すればいいかなど、ユーザーはもとより開発者だって管理できるわけがありません。

ならば、中途で処理を終えるのではなく、致命的なエラーが発生する前の状態にデータを戻すか、せめて"ここまで完了した"というログを吐き出して終了すべきです。これができていないプログラムを完成品として配布することなど、もってのほかです。そのプログラムは未完成品です。

では、致命的でないエラーの場合はどうでしょう? リストを出力させようとしてプリンタの電源が入っていなかった場合、いちいちプログラムを終了させていてはユーザーから不満の嵐です。この場合、処理をウェイトさせてプリンタの電源を入れるよう、促すメッセージを表示すれば済む話でしょう。

エラー処理はこれらの、実行時に想定される様々な例外的な処理に対して最低限の機能を実装すべきです。
また、それ以外の目的でエラー処理を利用すべきではありません。ロジックの修正で対応できるなら、エラー処理を使うのではなく、素直にロジックを見直すべきです。

では早速、Excel VBAのエラー処理をみていきましょう。

On Error Resume Next
エラーが発生した行を無視(スキップ)して、次行からコードの実行を再開します。
このエラー処理を使用するときは通常、実行してもしなくてもプログラムのメイン機能に影響しない処理(ウィンドウサイズの変更や効果音の再生など)に使用します。
くれぐれもメインの処理にOn Error Resume Nextを使用することは避けてください。

On Error Goto 行ラベル
エラーが発生した場合、行ラベルで指定した行にジャンプします。
Excel VBAではTry〜Catch構文が使用できないため、エラー時の処理はプロシージャ内にエラー処理用のサブルーチンを記述しなければなりません。VBAで唯一、構造化されていない部分です。
サブルーチンからメインルーチンに戻るには、Resume 行ラベルResume Nextステートメントを使用します。
Resume 行ラベルの場合、指定した行ラベルから処理を再開します。
Resume Nextの場合、エラーが発生した行の次の行から処理を再開します。
ただのResumeの場合、エラーが発生した行から処理を再開します。

例:
Sub test()
Dim MyLng As Long
On Error GoTo ErrHandler
  MyLng = 2 / 0
  MyLng = 2 / 1
Retry:
  MyLng = 2 / 2
Exit Sub
ErrHandler:
  Resume Retry
End Sub

この例では、MyLng = 2 / 0 で0除算エラーが発生した後、ErrHandler: 行にジャンプします。
Resume Retry でRetry: 行から処理を再開するよう指定されているので、MyLng = 2 / 2 より処理を再開します。
Resume Retry がResume Next の場合、MyLng = 2 / 1 より処理を再開します。
Resume Retry がResume だけの場合、MyLng = 2 / 0 より処理を再開するので無限ループになります。

On Error Goto ステートメントはプロシージャ内に複数記述できます。

例:
Sub test()
On Error GoTo ErrHandler1
  '構文1
Retry1:
  'ErrHandler1サブルーチンからのReturn行
On Error GoTo ErrHandler2
  '構文2
Retry2:
  'ErrHandler2サブルーチンからのReturn行
Exit Sub
ErrHandler1:
  '構文1のエラーに対する処理
  Resume Retry1
ErrHandler2:
  '構文2のエラーに対する処理
  Resume Retry2
End Sub

この例では、構文1で発生したエラーはErrHandler1:のサブルーチン、構文2で発生したエラーはErrHandler2:のサブルーチンがそれぞれ処理し、指定された行から処理を再開させます。

On Error Goto 0ステートメントにより、現在のプロシージャのエラーハンドラが無効化されます。
つまり、On Error Goto 0を挿入する以前に記述していたOn Error〜の処理は、On Error Goto 0 ステートメント以降、無効になります。



Errオブジェクト
エラーが発生したときに、自動的にエラー情報を取得してくれるオブジェクトです。
取得できるプロパティは、以下のとおりです。

Err.Number エラー番号
Err.Source エラー発生元のオブジェクト名
Err.Description エラーに関する説明文
Err.HelpFile ヘルプファイルへの絶対パス
Err.HelpContext ヘルプファイルのトピックに対応するコンテキスト番号
Err.LastDLLError 最後にDLLを呼び出したときのエラーコード

Errオブジェクトで取得できるエラーコード一覧表はこちらを参照してください。
※ Visual Basic for Applications でのエラートラップ http://support.microsoft.com/kb/146864/ja

次回もエラー処理の解説が続きます。
 

>> 次の話にすすむ


サイト内検索ができます

Microsoft Most Valuable Professional

Microsoft MVP Excel
武藤 玄 プロフィール
 

■■■ 執筆した書籍 ■■■
 

EXCEL VBA 業務自動化
 

Excel VBA を5日でマスターする本
 

仕事を速くする Excel VBA 入門
 

Excel VBAと業務改善のポイントがわかる本
 

Access VBA ベーシック スタンダード
 

Excel VBA アクションゲーム作成入門
 

■■■ 連載中の記事 ■■■
 

Excel VBAで業務改善!
 

実務で使うExcel VBA
 


TOPページ


■ エクセルVBA超入門

 ・9ステップで"Hello World!"
  からオブジェクト指向まで!
  1."Hello World!"を表示しよう
  2.基本はデータの入出力
  3.繰り返し処理
  4.シートで簡易データベース
  5.名前をつけよう
  6.構造化プログラムに挑戦
  7.構造体を使ってみよう
  8.フォームを使ってみよう
  9.オブジェクト指向に挑戦

■ エクセルVBA中級編

 ・VBAでいろんなテクニック
  変数・関数のスコープ
  引数の参照方法を明示
  配列の中身を一気に複写
  識別子がよいコードを作る
  データ定義型をもっと知ろう
  定数と列挙型を活用しよう
  エラー処理の重要性1
  エラー処理の重要性2
  いろいろな条件分岐
  いろいろな繰り返し処理
  演算子について知ろう
  文字列操作 連結 変換 置換
  文字列操作 検索 比較 書式
  日付操作関数を知ろう
  数値操作・評価・その他関数
  並び替えソートをマスター
  いろいろな検索をマスター
  VBEditorを使いこなそう
  マクロの記録を活用しよう1
  マクロの記録を活用しよう2
  VBAからVBEを操作しよう1
  VBAからVBEを操作しよう2
  VBAからVBEを操作しよう3
 ・ワークシートを使いこなす
  セルの参照をマスターしよう
  セルの選択をマスターしよう
  セルの操作をマスターしよう
  セルの書式設定をマスターしよう
  行・列の操作をマスターしよう
  シートの参照をマスターしよう
  シートの操作をマスターしよう
  ブックの操作をマスターしよう
  ウィンドウの操作をマスターしよう
  イベントプロシージャを活用しよう
  ワークシートを印刷しよう1
  ワークシートを印刷しよう2
  音声(読み上げ)機能を操作しよう
  グラフを操作しよう
 ・ユーザーフォームを使いこなす
  ユーザーフォームを使おう
  UserFormsオブジェクト
  Labelコントロール
  TextBoxコントロール
  ComboBoxコントロール
  ListBoxコントロール
  CheckBoxコントロール
  OptionButtonコントロール
  ToggleButtonコントロール
  CommandButtonコントロール
  ScrollBarコントロール
  SpinButtonコントロール
 ・VBA関数の一覧
  Aから始まる関数の一覧
  Cから始まる関数の一覧
  Dから始まる関数の一覧
  Eから始まる関数の一覧
  Fから始まる関数の一覧
  Gから始まる関数の一覧
 
■ エクセルVBAを極める
 VBAスーパーテクニック
 
 ・データベースへ接続してみよう!
  CSVファイルへの接続
  ワークシートへの接続
  mdbファイルへの接続
  SQL Serverへの接続
  ADOレコードセットの操作1
  ADOレコードセットの操作2
 ・ファイルを操作してみよう!
  FileSystemObjectの操作
  Drive File Folderの操作
  TextStream ダイアログ
  ステートメントでファイル操作1
  ステートメントでファイル操作2
 ・他アプリと連携してみよう!
  ActiveXオートメーションの操作
 ・ゲーム技でマクロを超える
  エクセルで音を鳴らす1
  エクセルで音を鳴らす2  
  スクリーン座標を取得
  様々なイベント取得
  リボンUIを制御しよう1
  リボンUIを制御しよう2
  シート上でアニメを動かそう
 
■ 一歩上行くエクセル
 基本操作の完全マスター!

 
 ・あなたはいったい
  エクセルで何をしたいのか?
  エクセルで業務効率化
  エクセル関数を使いこなす
  エクセルの便利技
  エクセルは最高の帳票ツール
 ・エクセル基本操作上級編!
  セル選択、コメント、シリアル値
  オート機能を使いこなそう!
  参照、条件付書式、入力規則
  関数をもっと理解しよう!
  配列数式を有効利用しよう!
  データの正規化をしよう!
  ショートカットキーを利用しよう1
  ショートカットキーを利用しよう2
  Office用アプリを作成しよう!
  PowerPivotとExcelで簡単BI!
 ・世間の誤ったエクセルの
  べからず集
  エクセルで文章を書くべからず
  エクセルで図形を描くべからず
  エクセルでシステムをつくるな
 
■ エクセル関連その他

 ・エクセルコミニュティにあなたも
  参加しませんか?
  Excel関連リンク・コミニュティ
 ・VBの理解がVBAをマスターする
  最短距離!
  VB関連の老舗・大家サイト
 ・エクセルExcel大事典掲示板
 ・プライバシーポリシー

2000アイテムを超えるラベルを販売
送料無料、即納対応の優良ショップ
今買っているラベルより確実に安い!
OAラベルの販売専科グラフトラベル




エクセルExcel大事典ははリンクフリーです エクセル大事典Excel大事典
お問い合わせはこちら gengengen@yahoo.co.jp

Copyright© Gen Muto 武藤 玄 All Rights Reserved,