ExcelマクロVBA技術解説 | よくあるVBA実行時エラーの解説と対応 | Excelマクロの問題点と解決策、エクセルVBAの技術的解説



最終更新日:2016-07-02

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

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

中級者以上は、
実行時にトラップ可能なエラー番号一覧と対処
ここを参考に、エラー対応(On Error等)をしてください。



・型が一致しません。


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

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の値を確認し、
当該行のデータを確認するか、イミディエイトウィンドウで、一つづつ確認するしかありません。
イミディエイトで値の確認

・オーバーフローしました。
・0 で除算しました。




純粋にオーバーフローすることは稀でしょう。
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除算となります。

・インデックスが有効範囲にありません。



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

Worksheets("Sheet1").Select

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

・オブジェクト変数または With ブロック変数が設定されていません。



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

単純な例としては、このようなものになります。
オブジェクト変数に何も割り当てられていないことによるエラーです。
この場合は、エラー停止した行のオブジェクト変数を確認します。

・メソッドまたはデータ メンバが見つかりません。
・オブジェクトは、このプロパティまたはメソッドをサポートしていません。




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

Dim ws As Worksheet
Set ws = ActiveSheet
ws.Calculata
Cells(1, 1).Font.Siza = 14

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

・名前付き引数が見つかりません。
・引数は省略できません。
・引数の数が一致していません。または不正なプロパティを指定しています。





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

MsgBox Prompy:="タイトル"
MsgBox
MsgBox 1, 2, 3, 4, 5, 6

PromptがPrompyになっています。
引数が指定されていません。
MsgBoxの引数は全部で5つです。

MsgBoxは関数ですが、メソッドでも同じです。
関数・メソッドでは、自動クイックヒントが出るので、しっかりと見ながら入力すれば、このような事にはならないはずです。





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

ローカルウィンドウの使い方
オブジェクトの探索方法
変数とプロシージャーの命名について
フルパスをディレクトリ、ファイル名、拡張子に分ける
条件式のいろいろな書き方:TrueとFalseの判定とは
データクレンジングと名寄せ
マクロとは、VBAとは

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

データクレンジングと名寄せ|ExcelマクロVBA技術解説(10月20日)
SUMIFの間違いによるパフォーマンスの低下について|エクセル関数超技(6月17日)
条件式のいろいろな書き方:TrueとFalseの判定とは|ExcelマクロVBA技術解説(6月15日)
空白セルを正しく判定する方法2|ExcelマクロVBA技術解説(5月6日)
フルパスをディレクトリ、ファイル名、拡張子に分ける|ExcelマクロVBA技術解説(4月15日)
テキストボックスの各種イベント|Excelユーザーフォーム入門(4月9日)
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除|ExcelマクロVBAサンプル集(4月4日)
最後の空白(や指定文字)以降の文字を取り出す|エクセル関数超技(3月26日)
先頭の数値、最後の数値を取り出す|エクセル関数超技(3月26日)
Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)

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

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
6.定数と型宣言文字(Const)|ExcelマクロVBA入門
7.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
8.マクロって何?VBAって何?|ExcelマクロVBA入門
9.CSVの読み込み方法|ExcelマクロVBAサンプル集
10.ひらがな⇔カタカナの変換|エクセル基本操作



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

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


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

    ↑ PAGE TOP