PRIMG0001
 毎週金曜日、プログラミングのちょっとした講座を記していますが、今月からちょっとペースを落として月1回くらいでこの講座をやっていきます。
 ここでは、小学校から「プログラミング」が必須項目になってしまったため、お父さん・お母さん・おじいちゃん・おねえちゃんが子供に「プログラミング」教えることができるように、ここでこっそりと勉強してしまおうという企画です。
 今週はプログラムのエラー処理について勉強していきます。
プログラムを作成していると、いろいろなエラー起こります。このエラーが起こった場合、どんなエラーでどのような対処をしなければいけないのかとなりますが、エラーの原因を表示させる場合は、エラー番号を取得する必要があります。
 エラーの取得はOn ErrorステートメントおよびErrオブジェクトのNumberプロパティを使用します。

On Error Resume Nextはエラーが起こった場合でも、中断せずに次のステートメントから実行を継続します。

On Error Goto はエラーが起こった場合、特定のインデックスに移動します。



Sub ERsyori()

On Error GoTo Catch

    Dim  AA  As Integer
    AA = "a" 

    Exit Sub
Catch:
    Debug.Print(Err.Description)
    Debug.Print(Err.Number)  
    
End Sub


 上記の場合、変数の型のエラーとなりますので、エラー番号13 内容「型が一致しません。」と表示されます。

 上記のプログラムでOn Error Resume Nextを指定した場合、エラーが起こった場合でも次の処理を行うため、どこかの場所でエラーがあるかどうかといった判定(IF文)を挿入する必要があります。その場合、下記のようになります。


Sub ERsyori()

On Error Resume Next

    Dim  AA  As Integer
    AA = "a" 

 If Err.Number <> 0 then
      Debug.Print(Err.Description)
      Debug.Print(Err.Number)  
    End if

End Sub


このように「Err.Number」の内容が0以外の場合は何らかのエラーがあるという判断となります。
以下の表は代表的なエラー番号と内容となります。



番号 メッセージ 理由と対策
5 プロシージャの呼び出し、または引数が不正です。 引数が許容値の範囲か確認
6 オーバーフローしました。 代入、計算、データ型変換の結果が、その変数の許容範囲か確認
7 メモリが不足しています。 不要なアプリケーション、ドキュメント等を閉じます。
モジュールまたはプロシージャを小さく分割します。
仮想メモリを増やすか、メモリ常駐プログラムを削除します。
9 インデックスが有効範囲にありません。 存在しない配列要素を参照している
10 この配列は固定されているか、または一時的にロックされています。 再定義できない配列の次元を再定義しています。
11 0 で除算しました。 0で割り算しています
13 型が一致しません。 互換性のないデータ型の間で代入を行っています。
14 文字列領域が不足しています。 文字列の操作の式で、文字列が長すぎます。
16 式が複雑すぎます。 浮動小数点式でネストされている式の数が多すぎます。
17 要求された操作は実行できません。 現在実行中のコードをプログラムで変更しようとしています。
18 ユーザーによる割り込みが発生しました。 ユーザーが割り込みキーを押しました。
20 エラーが発生していないときに Resume を実行することはできません。 Resumeステートメントが、アクティブなエラー処理ルーチン以外で実行されています。
28 スタック領域が不足しています。 再帰プロシージャが正しく終了していることを確認します。
35 Sub または Function が定義されていません。 プロシージャの名前が間違っています。
47 DLL のクライアント アプリケーションの数が多すぎます。
48 DLL 読み込み時のエラーです。
49 DLL が正しく呼び出せません。
51 内部エラーです。
52 ファイル名または番号が不正です。 ファイル番号のファイルが正しくOpenされた状態かを確認
53 ファイルが見つかりません。 存在しないファイルを参照しています。
54 ファイル モードが不正です。 ファイルを開いたときのモードが対応していません。
55 ファイルは既に開かれています。 閉じられていないファイルを再度開いています。
57 デバイス I/O エラーです。 デバイスが正しく動作しているかを確認してください。
58 既に同名のファイルが存在しています。 既に存在するファイル名と同じ名前を指定しています。
59 レコード長が一致しません。 Getステートメントまたは Putステートメントの指定が、でOpenステートメントで指定された長さと異なります。
61 ディスクの空き容量が不足しています。
62 ファイルにこれ以上データがありません。 ファイルレコードの末尾以降を読み込もうとしています。
63 レコード番号が不正です。 レコード番号が 0 以下です。
67 ファイルが多すぎます。 同時に開くことができるディスク ファイルの数を超えています。
68 デバイスが準備されていません。 デバイスが正しく動作しているかを確認
70 書き込みできません。 書き込み保護のディスクに書き込もうとしているか、またはロックされているファイルにアクセスしようとしています。
71 ディスクが準備されていません。 指定されたドライブにディスクがありません。
74 ディスク名は変更できません。 Nameステートメントを使用して、ファイルを別のドライブに移動しようとしています。
75 パス名が無効です。 ファイル指定の形式が間違っています。
76 パスが見つかりません。 ファイルの場所の指定が間違っています。
91 オブジェクト変数または With ブロック変数が設定されていません。 有効なオブジェクトを参照していないオブジェクト変数を使用しようとしています。
92 For ループが初期化されていません。 For...Nextループの途中にジャンプしていませんか。
93 パターン文字列が不正です。 Like 演算子で指定されているパターン文字列が無効です。
94 Null の使い方が不正です。 Null 値のバリアント型変数の値を取得しようとしています。
97 オブジェクトが定義クラスのインスタンスではない場合、このオブジェクトに関するフレンド関数は呼び出せません。
98 プロパティまたはメソッドの呼び出しの場合には、引数または戻り値としてプライベート オブジェクトへの参照を含めることはできません。
298 システムリソースまたは DLL をロードできません。
321 不正なファイル形式です。
322 必要な一時ファイルを作成できません。
325 リソース ファイルの形式が不正です。
327 データ値が見つかりません。
328 不正なパラメータです。配列に書き込めません。
336 コンポーネントが正しく登録されていません。
337 コンポーネントが見つかりません。
338 コンポーネントが正常に実行されませんでした。
360 このオブジェクトは既にロードされています。
361 このオブジェクトは、ロードまたはアンロードすることはできません。
363 指定されたコントロールが見つかりません。
364 既にアンロードされています。
365 現在アンロードできません。
368 ファイルは古い形式で作成されています。このプログラムには新しい形式のファイルが必要です。
371 指定されたオブジェクトは、Show メソッドのオーナー フォームとして使用できません。
380 プロパティの値が不正です。 不適切な値がプロパティに割り当てられています。
381 不正なプロパティ配列インデックスです。
382 実行時には値を設定できません。
383 値を設定できません。値の取得のみ可能なプロパティです。 実行時に値の取得のみ可能なプロパティへ値を設定しようとしています。
385 プロパティ配列インデックスが必要です。
387 値を設定できません。 実行時に値の設定ができないプロパティ
393 実行時には値を取得できません。 実行時に値の設定ができないプロパティ
394 値を取得できません。値の設定のみ可能なプロパティです。 実行時に値の設定ができないプロパティ
400 既にフォームは表示されています。モーダルにできません。 既にフォーム表示されています。
419 オブジェクトを利用できません。
422 プロパティが見つかりません。 プロパティ名が正しいかどうかを確認
423 プロパティまたはメソッドが見つかりません。 名前が間違っていないか確認
424 オブジェクトが必要です。 オブジェクト修飾子が指定されていません。
425 オブジェクトの使い方が不正です 適切な適用範囲外でオブジェクトを使用しようとしています。
429 ActiveX コンポーネントはオブジェクトを作成できません。
430 クラスはオートメーションまたは予測したインターフェースをサポートしていません。
432 オートメーションの操作中にファイル名またはクラス名を見つけられませんでした。
438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。 プロパティ名またはメソッド名が正しいかどうかを確認
440 オートメーション エラーです。 オートメーション オブジェクトのアクセスが不正です。
443 オートメーション オブジェクトには既定値がありません。
445 オブジェクトはこの動作をサポートしていません。 プロパティ名またはメソッド名が正しいかどうかを確認
446 オブジェクトは名前付き引数をサポートしていません。 名前付き引数をサポートしていないメソッドです。
448 名前付き引数が見つかりません。 名前付き引数の名前(名前付き引数:=)間違っています。、
449 引数は省略できません。 引数の数が一致しません。
450 引数の数が一致していません。または不正なプロパティを指定しています。 引数の数が一致しません。
453 関数は指定された DLL には定義されていません。
457 このキーは既にこのコレクションの要素に割り当てられています。
458 Visual Basic でサポートされていないオートメーションが変数で使用されています。
459 オブジェクトまたはクラスがこのイベント セットをサポートしていません。
460 クリップボードのデータ形式が不正です。
461 メソッドまたはデータ メンバーが見つかりません。 オブジェクトまたはメンバの名前が間違っています。
462 リモート サーバーがないか、使用できる状態ではありません。
463 ローカル マシンにクラスが登録されていません。
481 ピクチャが不正です。
482 プリンター エラーです。
483 プリンタ ドライバは指定されたプロパティをサポートしていません。
484 システムからプリンタ情報を受けるときに問題が発生しました。プリンタが正しく設定されているかを確かめてください。
485 ピクチャの形式が不正です。
486 フォームのイメージをこのプリンターで印刷することはできません。
1004 アプリケーション定義またはオブジェクト定義のエラーです。 Visual Basic for Applications で定義されたエラーに対応しない場合に表示されます。


 本日はここまでとなります。次の講座はどこかの週の金曜日に行います。