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

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日:2016-07-02

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

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


中級者以上は、
実行時にトラップ可能なエラー番号一覧と対処
マクロVBA実行時に発生するエラーのうち、以下の表にあるエラーは、トラップできるエラーになります。OnErrorステートメントおよびErrオブジェクトのNumberロパティを使用して、エラーへの対処を行うことができます。Excelマクロ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 で除算しました。

オーバーフローしました
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 ブロック変数が設定されていません。

オブジェクト変数または 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は関数ですが、メソッドでも同じです。
関数・メソッドでは、自動クイックヒントが出るので、しっかりと見ながら入力すれば、このような事にはならないはずです。





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

入力規則のドロップダウンが消えてしまうマクロ(Shapes内のDrop Down)
実行時にトラップ可能なエラー番号一覧
フォルダー・ファイル(ブック)・シートの文字制限
Excel2013におけるScreenUpdatingの問題点
Dir関数の制限について
よくあるVBA実行時エラーの解説と対応
Application.Goto使用時の注意
ScreenUpdating=False時にエラー停止後にシートが固まったら
標準スタイル違いの問題点:標準フォント複写、列幅をピクセルで合わせる

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

「VBAによる解析シリーズその2 カッコ」をやってみた|エクセル(5月21日)
VBA+SeleniumBasicで検索順位チェッカー作成|VBA技術解説(5月18日)
テーブル操作のVBAコード(ListObject)|VBA入門(5月12日)
テーブル操作の概要(ListObject)|VBA入門(5月12日)
VBAのスクレイピングを簡単楽にしてくれるSelenium|VBA技術解説(5月6日)
Excelワークシート関数一覧(2010以降)|VBAリファレンス(4月22日)
クラスとCallByNameとポリモーフィズム(多態性)|VBA技術解説(4月6日)
VBAでのタイマー処理(SetTimer,OnTime)|VBA技術解説(4月3日)
クラスとイベントとマルチプロセス並列処理|VBA技術解説(4月2日)
エクセルの日付と時刻のまとめ|エクセル関数超技(3月6日)

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

1.ひらがな⇔カタカナの変換|エクセル基本操作
2.最終行の取得(End,Rows.Count)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.RangeとCellsの使い方|ExcelマクロVBA入門
6.変数とデータ型(Dim)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.繰り返し処理(For Next)|ExcelマクロVBA入門
9.とにかく書いて見よう(Sub,End Sub)|VBA入門
10.セルに文字を入れるとは(Range,Value)|VBA入門



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

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


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






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

    本文下部へ