毎週金曜日、プログラミングのちょっとした講座を記していますが、今月からちょっとペースを落として月1回くらいでこの講座をやっていきます。
ここでは、小学校から「プログラミング」が必須項目になってしまったため、お父さん・お母さん・おじいちゃん・おねえちゃんが子供に「プログラミング」教えることができるように、ここでこっそりと勉強してしまおうという企画です。
今週はプログラムのエラー処理について勉強していきます。
今週はプログラムのエラー処理について勉強していきます。
プログラムを作成していると、いろいろなエラー起こります。このエラーが起こった場合、どんなエラーでどのような対処をしなければいけないのかとなりますが、エラーの原因を表示させる場合は、エラー番号を取得する必要があります。
エラーの取得はOn ErrorステートメントおよびErrオブジェクトのNumberプロパティを使用します。
On Error Resume Nextはエラーが起こった場合でも、中断せずに次のステートメントから実行を継続します。
On Error Goto はエラーが起こった場合、特定のインデックスに移動します。
上記の場合、変数の型のエラーとなりますので、エラー番号13 内容「型が一致しません。」と表示されます。
上記のプログラムでOn Error Resume Nextを指定した場合、エラーが起こった場合でも次の処理を行うため、どこかの場所でエラーがあるかどうかといった判定(IF文)を挿入する必要があります。その場合、下記のようになります。
このように「Err.Number」の内容が0以外の場合は何らかのエラーがあるという判断となります。以下の表は代表的なエラー番号と内容となります。
本日はここまでとなります。次の講座はどこかの週の金曜日に行います。
エラーの取得はOn ErrorステートメントおよびErrオブジェクトのNumberプロパティを使用します。
On Error Resume Nextはエラーが起こった場合でも、中断せずに次のステートメントから実行を継続します。
On Error Goto はエラーが起こった場合、特定のインデックスに移動します。
Sub ERsyori()On Error GoTo CatchDim AA As IntegerAA = "a"Exit SubCatch:Debug.Print(Err.Description)Debug.Print(Err.Number)End Sub
上記のプログラムでOn Error Resume Nextを指定した場合、エラーが起こった場合でも次の処理を行うため、どこかの場所でエラーがあるかどうかといった判定(IF文)を挿入する必要があります。その場合、下記のようになります。
Sub ERsyori()On Error Resume NextDim AA As IntegerAA = "a"If Err.Number <> 0 thenDebug.Print(Err.Description)Debug.Print(Err.Number)End ifEnd 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 で定義されたエラーに対応しない場合に表示されます。 |
本日はここまでとなります。次の講座はどこかの週の金曜日に行います。
コメント