VBAのプログラムを書く機会が増えるにつれて、何度も何度も同じエラー文に遭遇することも増えてきました。
調べてみると、私は焦りやすいせいか何かを見落としている「うっかりケース」が多いみたいです。
そこで、チェックリストとして少し整理することで対策してみます。
※自分の体験ベースなのでかなり偏りがあるはずです。そのあたりは目をつぶっていただけたら幸いです!
- 実行時エラー(1004): 申し訳ございません。****が見つかりません。名前が変更されたか、移動や削除が行われた可能性があります。
- 実行時エラー(1004): "****"にアクセスできません。読み取り専用または暗号化されています。
- 実行時エラー(1004): アプリケーション定義またはオブジェクト定義のエラーです。
- 実行時エラー(9): インデックスが有効範囲にありません。
- 実行時エラー(70): 書き込みできません
- 実行時エラー(91): オブジェクト変数またはWithブロック変数が設定されていません。
- 実行時エラー(424): オブジェクトが必要です。
- 実行時エラー(438): オブジェクトは、このプロパティまたはメソッドをサポートしていません。
- 実行時エラー(-2147221080): オートメーションエラーです。
- 連載目次
実行時エラー(1004): 申し訳ございません。****が見つかりません。名前が変更されたか、移動や削除が行われた可能性があります。
チェック!
パスは合ってる?
パスの区切り文字(
\
)は足りてる?フォルダの中は空っぽになってない?
実行時エラー(1004): "****"にアクセスできません。読み取り専用または暗号化されています。
チェック!
「読み取り専用」で開いてる?
不要なら「読み取り専用」解除した?
パスの表記は合ってる?
良くあるミスとして、ファイル名を指定するときに
Workbooks.Open Filename:="C:¥Book1.xls"
と、すべきところで
Workbooks.Open Filename:="Book1.xls"
としてしまう場合があります。
それと、ネットワークドライブの場合、
(¥¥共有DISKなどの指定で)ドライブ名が確定していない場合にもあります。
実行時エラー(1004): アプリケーション定義またはオブジェクト定義のエラーです。
チェック!
.Cellsプロパティは
.Cells(1, 1)
からになってる?このエラーになる原因は、
Cells()
を使ったときの第1パラメータの変数i
に「0」が設定されているためです。
Cells()
で指定するセルの指定位置はCells(1,1)
からなので、「0」が指定されるとこのエラーが発生します。配列の「要素数」確認した?
貼付け先の
Rangeオブジェクト
の「幅・高さ」と要素数は合ってる?
実行時エラー(9): インデックスが有効範囲にありません。
チェック!
- 要素数はあってる?
- 添え字は
0
から?1
から?- ただの配列やコレクションは
0
から。 Range.Value
の配列は(1, 1)
から。
- ただの配列やコレクションは
- モジュールに
Option Baseステートメント
はある? - 引き数の値は中身あってる?
- そもそも、その値は要素にある?
- 動的配列でも
ReDim
してある?動的配列は、プロシージャ内で配列サイズを変更できるだけで、自動的にサイズ変更してくれるわけではありません。
(中略)
配列にデータを格納する前に、配列のサイズを
ReDim文
で指定する必要があります。動的配列でインデックスが有効範囲にありませんエラーの発生する原因-ReDimがない:エクセルマクロ・Excel VBAの使い方/配列
実行時エラー(70): 書き込みできません
どんな時に出る?
ブックを別のフォルダへ移動しようとしたら発生しました。
チェック!
- ブックは閉じてる?
実行時エラー(91): オブジェクト変数またはWithブロック変数が設定されていません。
チェック!
Setキーワード
はある?- 参照先、ぜんぶ中身ある?
- プロシージャの戻り値はオブジェクト型で指定できてる?
- インスタンスは
Initialize
できてる?(クラスのNew
できてる?)- 「親クラス」が空っぽになってない?
- 「子クラス」も確認した?
- コンストラクタ(
Initializeメソッド
)の引き数は合ってる? - 値のプロパティにオブジェクトの参照値入れようとしてない?
実行時エラー(424): オブジェクトが必要です。
どういう意味?
オブジェクトがNothing
らしいです。
チェック!
- どこか別の場所で破棄してない?
- 参照値は代入してある?
- 本当に参照値代入できてる?
- 呼び出す前に
New
してある? New
できてる?(親子関係で中身が空っぽだったりしない?)
実行時エラー(438): オブジェクトは、このプロパティまたはメソッドをサポートしていません。
チェック!
- プロパティ名やメソッド名は合ってる?
- 自作プロパティや自作メソッドの名前変えたりした?
- インテリセンス使えた?
- 列挙体や構造体の上に変数やプロシージャがあったりしない?
Withブロック
の依存関係、ズレてない?- インデント合ってる?
- プロパティ呼び出してるだけになってない?
- 何かに代入してる?
- 値を見てる?
実行時エラー(-2147221080): オートメーションエラーです。
どんな時に出る?
個人的には、オブジェクトを呼び出すときに遭遇することが多い気がします。
チェック!
- 操作対象のブックは
.Activate
できてる? 呼び出し元ステートメントかその次でエラー発生してる?
アクセス元のステートメントの直前で
On Error Resume Next ステートメント
を使用して、アクセス元のステートメントの直後でエラーがないかどうかを確認します。Err
オブジェクトの中身見てみた?- 使おうとしているアドインは、その端末で「有効」になってる?