VBA技術解説
よくあるVBA実行時エラーの解説と対応

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日:2020-07-13

よくあるVBA実行時エラーの解説と対応


VBAを書き終えて、いざ実行したら意味不明なメッセージが・・・
ここでは初心者向けに、代表的な実行時エラーの解説とその対応について説明します。


中級者以上の方は、
実行時にトラップ可能なエラー番号一覧と対処
マクロVBA実行時に発生するエラーのエラー番号とエラーメッセージおよび簡単な理由と対策の一覧です。以下の表にあるエラーはトラップ(捕捉)できるエラー一覧になります。OnErrorステートメントおよびErrオブジェクトのNumberロパティを使用して、エラーへの対処を行うことができます。
こちらを参考に、エラー対応(On Error等)を実装してください。

データ型のエラー

型が一致しません。:実行時エラー13

型が一致しません。:実行時エラー13

データの型に対し、違うデータ型を入れてしまった場合です。

Dim i As Long
i = "A"

単純は例としては、このような状況です。
Longに対し文字列を入れているのでエラーとなります。
違うデータ型であっても、自動変換可能なものはエラーとならず、データ変換されます。
i = 1.2
であれば、iには1が入ります。
もう少し複雑なコードの時に、どこがエラーなのかが直ぐには分からない場合があります。

Dim i As Long
For i = 1 To 10
  Cells(i, 3) = Cells(i, Cells(i, 1)) / Cells(i, 2)
Next

もし、こんなコードで、型が一致しませんとなったら、どこが悪いのかは直ぐには分からないでしょう。
A列、B列に数値以外が入っていても発生しますし、A列の数値が5なら、E列が文字でもこのエラーになります。
エラーで止まった時点で、iの値を確認し、
当該行のデータを確認するか、イミディエイトウィンドウで、一つづつ確認するしかありません。
イミディエイトで値の確認
前回、FormulaR1C1とValueの違いを説明しましたが、それを確認するための方法を紹介します。これはデバックで使用するツールになります。デバッグとは、プログラムの誤り(バグと呼ばれる)を探し、取り除くこと。

計算時のエラー

オーバーフローしました。:実行時エラー6

オーバーフローしました。:実行時エラー6

0 で除算しました。:実行時エラー11

0 で除算しました。:実行時エラー11

純粋にオーバーフローすることは稀でしょう。
Longに30億とか入れればオーバーフローしますが、実務的にはあまり無いと思います。
※Longは、-2,147,483,648 ~ 2,147,483,647
むしろ、0÷0の時に、このオーバーフローになります。

Dim i As Long
For i = 1 To 10
  Cells(i, 3) = Cells(i, 1) / Cells(i, 2)
Next

このような場合に、
分子分母ともに0の時は、オーバーフロー
分母のみ0の時は、0除算となります。

インデックスのエラー

インデックスが有効範囲にありません。:実行時エラー9

インデックスが有効範囲にありません。:実行時エラー9

メッセージの内容としては、存在しない配列要素を参照してるという事ですが、
配列を使っている場合は勿論発生しますし、配列を使う人は承知しているはずです。
むしろ、配列など知らない・使っていないのに・・・
そのような場合に、何が悪いのか悩んでいることが多いように感じます。
このような場合の多くは、シート名が間違っているだけの事が多いです。

Worksheets("Sheet1").Select

Sheet1が存在しなければ、インデックスのエラーとなります。

オブジェクトの設定エラー

オブジェクト変数または With ブロック変数が設定されていません。:実行時エラー91

オブジェクト変数または With ブロック変数が設定されていません。:実行時エラー91

Dim ws As Worksheet
With ws
  .Cells(1, 1) = 1
End With

Dim ws As Worksheet
ws.Cells(1, 1) = 1

単純な例としては、このようなものになります。
オブジェクト変数に何も割り当てられていないことによるエラーです。
この場合は、エラー停止した行のオブジェクト変数の中身を確認します。
上記のVBAであれば、wsに何も設定していない為にエラーとなっています。

メソッド・プロパティのエラー

メソッドまたはデータ メンバが見つかりません。:コンパイル エラー

メソッドまたはデータ メンバが見つかりません。:コンパイル エラー

オブジェクトは、このプロパティまたはメソッドをサポートしていません。:実行時エラー438

オブジェクトは、このプロパティまたはメソッドをサポートしていません。:実行時エラー438

どちらも同じような意味のメッセージになります。
前者は、記述としてはメソッドになります。
後者は、メソッド・プロパティどちらでも発生しうるエラーです。

Dim ws As Worksheet
Set ws = ActiveSheet
ws.Calculata

Cells(1, 1).Font.Siza = 14

どちらにしても、単純にスペルミスという事ですので、しっかりと確認すればわかるはずです。
そもそも、入力候補が出るように記述を進めることが肝心です。
インテリセンス(入力支援、入力候補)から選択するようにすれば、このエラーはほとんど出なくなるはずです。

Cellsではインテリセンスが効きません。
入力するプロパティのスペルに自信が無ければ、
Cellsだけ、もしくはCells()と引数を省略して、.を入力すれば、

VBA マクロ エラー対処

このように、インテリセンスが効くようになります。
ただし、後から引数を入れ忘れないようにしてください。

引数のエラー

名前付き引数が見つかりません。コンパイル エラー

名前付き引数が見つかりません。コンパイル エラー

引数は省略できません。コンパイル エラー

引数は省略できません。コンパイル エラー

引数の数が一致していません。または不正なプロパティを指定しています。コンパイル エラー

引数の数が一致していません。または不正なプロパティを指定しています。コンパイル エラー

少々極端な例になりますが、

MsgBox Prompy:="タイトル"

PromptがPrompyになっています。

MsgBox

省略できない必須の引数が指定されていません。

MsgBox 1, 2, 3, 4, 5, 6

MsgBoxの引数は全部で5つです。

MsgBoxは関数ですが、メソッドでも同じです。
関数・メソッドでは、インテリセンス(入力支援、入力候補)が出るので、しっかりと見ながら入力してください。
表示されているものをよく見ながら入力すれば、このような事にはなることは避けることができます。

VBA マクロ エラー対応

実行時エラー関連記事

第60回.エラー処理(On Error)
マクロを実行していると、エラーメッセージが表示されマクロ実行が停止してしまう事があります。マクロがエラー停止しては自動化の目的が達成されませんので、エラー停止しないようにしなければなりません。エラーが出ないようにVBAを記述出来ればそれに越したことはありませんが、一切エラーを出さないようにVBAを書くことはかなり困難なものです。
第61回.「On Error GoTo」と「Exit Sub」
「OnErrorGoTo行ラベル」このステートメントは、実行時エラーが発生した時に、制御を指定の行ラベルに移動させるものです。マクロVBAは、エラーが発生するとその時点で停止してしまいます。VBAが実行不能となった場合に、エラー発生したVBAコードで停止します。
第62回.「On Error Resume Next」とErrオブジェクト
「OnErrorResumeNext」ステートメントは、実行時エラーが発生してもマクロVBAを中断せずに、エラーが発生したステートメントの次のステートメントから実行を継続します。マクロVBAは、エラーが発生するとその時点で停止してしまいます。
第134回.Errオブジェクトとユーザー定義エラー
VBA実行時には種々のエラーが発生します。実行時エラーに関する情報は、Errオブジェクトには入っていますので、VBA実行でエラー発生した場合は、Errオブジェクトを参照しエラー内容を調べることになります。Errオブジェクトの使い方と、ユーザー定義エラーの生成方法について解説します。
実行時にトラップ可能なエラー番号一覧と対処
マクロVBA実行時に発生するエラーのエラー番号とエラーメッセージおよび簡単な理由と対策の一覧です。以下の表にあるエラーはトラップ(捕捉)できるエラー一覧になります。OnErrorステートメントおよびErrオブジェクトのNumberロパティを使用して、エラーへの対処を行うことができます。



同じテーマ「マクロVBA技術解説」の記事

フォルダー・ファイル・ブック・シートの文字制限
Excel2013におけるScreenUpdatingの問題点
Dir関数の制限について
よくあるVBA実行時エラーの解説と対応
Application.Goto使用時の注意
ScreenUpdating=False時にエラー停止後にシートが固まったら
標準スタイル違いの問題点:標準フォント複写、列幅をピクセルで合わせる
VBAでエラー行位置(行番号)を取得できるErl関数
WorksheetFunction.Matchで配列を指定した場合の制限について
VBAでシート関数使用時の配列要素数制限


新着記事NEW ・・・新着記事一覧を見る

VBA100本ノック 18本目:名前定義の削除|VBA練習問題100(11月6日)
VBA100本ノック 17本目:重複削除(ユニーク化)|VBA練習問題100(11月6日)
VBA100本ノック 16本目:無駄な改行を削除|VBA練習問題100(11月5日)
VBA100本ノック 15本目:シートの並べ替え|VBA練習問題100(11月4日)
VBA100本ノック 14本目:社外秘シート削除|VBA練習問題100(11月3日)
VBA100本ノック 13本目:文字列の部分フォント|VBA練習問題100(11月1日)
VBA100本ノック 12本目:セル結合を解除|VBA練習問題100(10月31日)
VBA100本ノック 11本目:セル結合の警告|VBA練習問題100(10月30日)
VBA100本ノック 10本目:行の削除|VBA練習問題100(10月29日)
VBA100本ノック 9本目:フィルターコピー|VBA練習問題100(10月28日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ