まえがき
今回紹介する方法で、ほとんどのプログラムの問題点は確認できます。プログラム作成のためには非常に重要な内容になりますので、是非マスターしてください。
まとまった量のプログラムを作成していくと、プログラムが想定通り動かなくなった時に、どこで失敗しているのか分かり難くなります。
そこで活躍するのが、現状の変数の値を一覧で確認する事ができるローカルウィンドウです。変数の値が自分で想定したものと一致しているか確認しましょう。
プログラムを好きな場所で止めれる設定をブレークポイントと言います。ある程度、不具合の箇所が分かったら、直前にブレークポイントを設定して、怪しい箇所を確認しましょう。ブレークポイントから、プログラムを1ステップずつ確認する事で、どの行で不具合が起こっているか見る事ができます。
エラー発生時の黄色の塗りつぶし箇所
プログラムの途中でエラーとなると[コンパイルエラー]のメッセージが表示されます。
[OK]ボタンを押すと、プログラムの一部が黄色く塗りつぶされています。黄色く塗りつぶされている箇所が間違っている事もありますが、それ以外に原因がある事も多いので、エラーのメッセージと合わせて参考までに見る程度にしてください。
エラーメッセージから対処方法を調べる
エラーメッセージが不適切な場合も多いですが、王道の方法はエラーメッセージから対処方法を探る事です。[vba 【エラーメッセージ】]で検索するのも手ですが、下記の情報も参考にしてみて下さい。
番号 | メッセージ | 理由と対策 |
3 | Return に対応する GoSub がありません。 | Returnステートメントに対応するGoSubステートメントを確認 |
5 | プロシージャの呼び出し、または引数が不正です。 | 引数が許容値の範囲か確認 |
6 | オーバーフローしました。 | 代入、計算、データ型変換の結果が、その変数の許容範囲か確認 |
7 | メモリが不足しています。 | 不要なアプリケーション、ドキュメント等を閉じます。 |
モジュールまたはプロシージャを小さく分割します。 | ||
仮想メモリを増やす。 | ||
メモリ常駐プログラムを削除します。 | ||
Public 変数を減らします。 | ||
9 | インデックスが有効範囲にありません。 | 存在しない配列要素を参照していないか確認 |
10 | この配列は固定されているか、または一時的にロックされています。 | 再定義できない配列の次元を再定義しています。 |
11 | 0 で除算しました。 | 0で割り算しています |
13 | 型が一致しません。 | 互換性のないデータ型の間で代入を行っています。 |
14 | 文字列領域が不足しています。 | 文字列の操作の式で、一時的な文字列が必要な式の場合に、文字列が長すぎます。 |
16 | 式が複雑すぎます。 | 浮動小数点式でネストされている式の数が多すぎます。 |
17 | 要求された操作は実行できません。 | 現在実行中のコードをプログラムで変更しようとしています。 |
18 | ユーザーによる割り込みが発生しました。 | ユーザーが割り込みキーを押しました。 |
20 | エラーが発生していないときに Resume を実行することはできません。 | Resumeステートメントが、アクティブなエラー処理ルーチン以外で実行されています。 |
28 | スタック領域が不足しています。 | 再帰プロシージャが正しく終了していることを確認 |
35 | Sub または Function が定義されていません。 | プロシージャの名前が間違っています。 |
52 | ファイル名または番号が不正です。 | ファイル番号のファイルが正しくOpenされた状態かを確認 |
53 | ファイルが見つかりません。 | 存在しないファイルを参照しています。 |
54 | ファイル モードが不正です。 | ファイルを開いたときのモードに対応していないステートメントを使用していまする |
55 | ファイルは既に開かれています。 | 閉じられていないファイルをOpenしています。 |
57 | デバイス I/O エラーです。 | デバイスが正しく動作しているかを確認 |
58 | 既に同名のファイルが存在しています。 | 既に存在するファイル名と同じ名前を指定しています。 |
59 | レコード長が一致しません。 | Getステートメントまたは Putステートメントの指定が、でOpenステートメントで指定された長さと異なります。 |
62 | ファイルにこれ以上データがありません。 | ファイルの末尾以降を読み込もうとしています。 |
63 | レコード番号が不正です。 | レコード番号が 0 以下です。 |
67 | ファイルが多すぎます。 | 同時に開くことができるディスク ファイルの数には限度があります。 |
68 | デバイスが準備されていません。 | デバイスが正しく動作しているかを確認 |
70 | 書き込みできません。 | 書き込み保護のディスクに書き込もうとしているか、またはロックされているファイルにアクセスしようとしています。 |
71 | ディスクが準備されていません。 | 指定されたドライブにディスクがありません。 |
74 | ディスク名は変更できません。 | Nameステートメントを使用して、ファイルを別のドライブに移動しようとしています。 |
75 | パス名が無効です。 | ファイル指定の形式が間違っています。 |
既存の読み取り専用ファイルと同じ名前でファイルを保存しようとしています。 | ||
読み取り専用ファイルをシーケンシャルOutputまたはAppend モードで開こうとしています。 | ||
76 | パスが見つかりません。 | 指定したパスが存在するか確認。 |
91 | オブジェクト変数または With ブロック変数が設定されていません。 | 有効なオブジェクトを参照していないオブジェクト変数を使用しようとしています。 |
Nothing に設定されているオブジェクト変数を使用しようとしました。 | ||
92 | For ループが初期化されていません。 | For…Nextループの途中にジャンプしていませんか。 |
93 | パターン文字列が不正です。 | Like 演算子で指定されているパターン文字列が無効です。 |
94 | Null の使い方が不正です。 | Null 値のバリアント型変数の値を取得しようとしています。 |
380 | プロパティの値が不正です。 | 不適切な値がプロパティに割り当てられています。 |
383 | 値を設定できません。値の取得のみ可能なプロパティです。 | 実行時に値の取得のみ可能なプロパティへ値を設定しようとしています。 |
387 | 値を設定できません。 | 実行時には値の設定ができないプロパティです。 |
393 | 実行時には値を取得できません。 | 実行時には値の取得ができないプロパティです。 |
394 | 値を取得できません。値の設定のみ可能なプロパティです。 | 実行時には値の取得ができないプロパティです。 |
400 | 既にフォームは表示されています。モーダルにできません。 | 既にフォーム表示されています。 |
402 | 一番手前 (前面) のモーダル フォームを先に閉じてください。 | 複数のフォームが表示されている場合は、一番手前のフォームから閉じて下さい。 |
422 | プロパティが見つかりません。 | プロパティ名が正しいかどうかを確認 |
423 | プロパティまたはメソッドが見つかりません。 | 名前が間違っていないか確認 |
424 | オブジェクトが必要です。 | オブジェクト修飾子が指定されていません。 |
425 | オブジェクトの使い方が不正です | 適切な適用範囲外でオブジェクトを使用しようとしています。 |
438 | オブジェクトは、このプロパティまたはメソッドをサポートしていません。 | プロパティ名またはメソッド名が正しいかどうかを確認 |
440 | オートメーション エラーです。 | オートメーション オブジェクトのアクセスが不正です。 |
445 | オブジェクトはこの動作をサポートしていません。 | プロパティ名またはメソッド名が正しいかどうかを確認 |
446 | オブジェクトは名前付き引数をサポートしていません。 | 名前付き引数をサポートしていないメソッドです。 |
448 | 名前付き引数が見つかりません。 | 名前付き引数の名前(名前付き引数:=)間違っています。、 |
449 | 引数は省略できません。 | 引数の数が一致しません。 |
450 | 引数の数が一致していません。または不正なプロパティを指定しています。 | 引数の数が一致しません。 |
461 | メソッドまたはデータ メンバーが見つかりません。 | オブジェクトまたはメンバの名前が間違っています。 |
1004 | アプリケーション定義またはオブジェクト定義のエラーです。 | Visual Basic for Applications で定義されたエラーに対応しない場合に表示されます。 |
-2147221080 | オートメーション エラーです。 | 削除されたオブジェクトを参照しています。 |
上記以外 | アプリケーション定義またはオブジェクト定義のエラーです。 | Visual Basic for Applications で定義されたエラーに対応しない場合に表示されます。 |
ローカルウィンドウ
ローカルウィンドウを表示させるには、[表示]をクリックして、[ローカル ウィンドウ]をクリックします。
画面左下にローカルとかかれたウィンドウが表示されます。
プログラムを開始すると、以下のように表示されます。
式に変数名が表示されます。値に今の変数の値が入り、型にその変数の型が入ります。
変数の型には2つの要素があり、プログラムがその値を、文字列(型)として扱うのか、日付(型)として扱うのか、数値として扱うのかなど、種類を分類する①データ型と、②最小/最大値をきめるものがあります。同じ整数でも[Integer]であれば332767までの数字が扱えるのに対して、[Long]であれば2,147,483,647までの数値が扱えるなどの違いがあります。
VBAがここで認識している型と、値として指定されたデータの型が違うと「データ型が違います」とエラーとなります。
プログラムの内容を確認する時には、自身が想定した通りの変数の値となっているか確認しましょう。
マウスのロールオーバーで確認
マウスのロールオーバーとは、マウスのカーソルを画像やテキストの上に乗せる事を言います。
変数に設定していないセルの値などもマウスのロールオーバーで確認する事ができます。ローカルウィンドウで表示されないものはこの機能で確認しましょう。
ブレークポイントとステップ実行
プログラムのチェックは、①ブレークポイント、②ステップ実行、③ローカルウィンドウの3点を組み合わせて確認するのが基本となります。
VBAの画面の真ん中、プログラム画面の左をクリックすると赤茶色の丸ポチがつきます。
これがブレークポイントです。通常F5でプログラム実行をすると、エラーが発生するか、プログラムが終了するまで一気に動きます。ブレークポイントが設定されている場合は、F5で実行しても、ブレークポイントの処理をする手前でプログラムが停止してくれます。
F8で実行すると、1ステップずつプログラムを進める事ができます。プログラムの動きは見えやすいのですが、繰り返し処理など大量のステップがあると確認したいところまで、なかなかたどり着けません。
初めはF8で、1ステップずつ確認して、ループ2周目のところまで問題なく動作したら、ループの終わりのところにブレークポイントを設定して、F5で進んでその先を確認する。また、確認したい条件分岐の中のところにブレークポイントを設定して、条件分岐に合致した場合の動作を見るなどの使い方をします。
エラーが発生した場合は、エラーの直前にブレークポイントを設定して、変数の値を確認しながら1ステップずつ進めると、問題点が判明する事が多いです。
コメントブロック機能を使って被疑箇所を特定する
プログラムの説明をプログラム内に記載して、他の人が見ても分かりやすい(可読性が高い)プログラムを書くために、コメント機能があります。
コードの頭に[‘]をつける事で、緑文字となりコメントとして認識させる事ができます。
このコメント機能の別の使い方として、黄色の塗りつぶし箇所(エラー発生箇所)で間違いなくエラーが起こっているか確認するために、対象のプログラムをコメントアウトして動作するか確認する事も有効です。
また、別プログラムとして抜き出して実行するのも切り分け方法として有効です。
コメントアウトする対象が多い場合は手間ですので、以下の手順でブロック単位でまとめてコメントアウトする事ができます。
コード画面の上の空間で右クリックして、[編集]にチェックを入れます。
対象のコードをクリック長押しで選択してグレーアウトします。
コメントブロックをクリックします。
これでまとめてコメントアウトされます。戻したい時は、コメントブロックの右にある非コメントブロックをクリックするとコメントが解除されます。
エラーメッセージで検索して解決できない場合は、この記事の内容を参考にトラブルシュートしてみてください。
本サイトでは、このほかにVBAに関する記事を随時更新していく予定です。VBAについて一番詳しく分かりやすいサイトを目指して頑張っていきますので、よろしければTOPページから是非ほかの記事もご覧ください。