Developer

【ExcelVBA】エラー処理:実行時エラー
2022.08.31
Lv1

【ExcelVBA】エラー処理:実行時エラー

実行時エラーとは

前回、前々回に引き続き、VBAのエラーについて学習していきます。
まずはVBAのエラーの種類について復習しておきましょう。
VBAのエラーは下記の種類がありました。

VBA_エラーの種類
エラーの種類

今回は、この中の実行時エラーについて見ていきます。実行時エラーとは、名前の通り、実行するときに発生するエラーのことです。
文法的に誤っておらずコンパイルも成功するけれども、本来実行できないことを行おうとする処理を記述している場合に発生します。
本来実行できないこと、とは具体的にはどんなことがあるかというと、例えば、

  • 存在しないファイルを参照しようとしている。
  • 存在しないシートを参照しようとしている。
  • 変数にデータ型の異なる値を代入しようとしている。

などの処理が挙げられます。

実行時エラーはプログラムを実行しなければ発生するかどうかが確認できないため、思わぬところで発生することがあります。
実行時エラーがどのようなときに起こりうるのかを把握しておくことで、想定外の実行時エラーの発生の防止に繋がります。

実行時エラーの例

では、実行時エラーの具体的な例を見ていきましょう。

実行時エラーの具体例1:

具体例1-1:

Sub Sample1()
    Dim i As Integer
    i = -1
    Cells(i, 2).Value = "A"
End Sub

実行すると、下記のエラーが表示されます。
VBA_エラーポップアップ_実行時エラー_具体例1

Cellsはセルを指定する関数なので、引数にマイナスの値を指定することができません。
しかし、データ型としてInteger型を格納すれば構文的には誤っていないため、コンパイルでは引っかかりません。
そのため、実行時エラーとなります。

この例の場合、そもそも想定していない値を変数iに指定しているのはプログラム内での話なので、
実装する際にこのような指定をしないようにすればよいでしょう。
では次のような場合はどうでしょうか?

具体例1-2:

Sub Sample1()
    Dim i As Integer
    i = Cells(1,1).Value
    Cells(i, 2).Value = "A"
End Sub

この場合「Cells(1,1)」(つまりA1のセル)に記述されている値を見て、その値を「Cells(i,2)」のiに格納するような処理にしています。
例えば、次のように「2」がA1セルに入力されている状態で上記のサンプルを実行してみましょう。
VBA_エクセルサンプル_実行時エラー_具体例1

すると、次のようにB2セルに「A」という値が入力されます。
VBA_エクセルサンプル_実行時エラー_具体例2

では、次のようにA1セルに「-1」を入力するとどうでしょうか。
VBA_エクセルサンプル_実行時エラー_具体例3

先ほどの「具体例1-1」と同様にCellsにマイナスを指定していることになりますので、実行時エラーが発生します。
VBA_エラーポップアップ_実行時エラー_具体例1

このように、セルの値を参照する処理を記述した場合、そのセルに何が入力されるかによって実行時エラーが起きたり起きなかったりするケースがあります。

実行時エラーの具体例2:

Sub Sample2()
    Range("A2").Val = "A"
End Sub

実行すると下記の実行時エラーが発生します。
VBA_エラーポップアップ_実行時エラー_具体例2

Rangeオブジェクトには「Val」というプロパティは存在しません(Valueはあります)。
このように存在しないプロパティを指定した場合に、実行時エラーとなります。

プログラミング言語によっては、開発エディタ側でこのような存在しないプロパティの指定はエラーとして検知して表示してくれるものもありますが、VBAでは実行時のエラーになります。
やや不親切だとは思いますが、仕方がないので実装時にスペルミスなどしないように注意しましょう。

実行時エラーの具体例3:

Sub Sample3()
    Dim i As Integer
    i = "test"
    Debug.Print (i)
End Sub

実行すると下記の実行時エラーが発生します。
VBA_エラーポップアップ_実行時エラー_具体例3

iという変数はInteger型なので、String型の”test”を代入することはできません。
これも具体例2と同様にコンパイルエラーになってもよいようにも思えますが、VBAでは実行時エラーとなります。
実装時は特にエラーとして検知されないので注意が必要です。

また、具体例1のように、iの値をセルの値から取得するような処理になっている場合だと、
このように型の不一致は起こりやすくなることが想定されますので、こちらも注意が必要です。

実行時エラーの具体例4:

Sub Sample4()
    MsgBox (Sheets(2).Name)
End Sub

こちらの例では、「Sheets(2)」で指定している「2」という数値がポイントになります。
2つ目のシートがあれば、そのシートの名前を表示し、実行時エラーは発生しませんが、
2つ目のシートがなければ、下記の実行時エラーが発生します。
VBA_エクセルサンプル_実行時エラー_具体例4

このように、実行時エラーは、プログラム内で誤った処理を記述して発生する場合だけでなく、
セルの値が何か、シートがあるかないか、など、プログラム外の状態によって発生する場合があることを意識しておきましょう。

まとめ

・実行時エラーはマクロ実行時に発生するエラー。
・プログラム内で論理的に誤った記述だけでなく、プログラム外の状態によって発生する場合もある。

確認問題

確認問題1

次のプログラムを実行した際に、実行時エラーが発生した。

Sub Test1()
    Dim i As Integer
    i = Range("A1").Value - 10
    Debug.Print (i)
End Sub

「A1」セルに格納されていた値は次のうちどれか。
選択肢:
1.100
2.0
3.A
4.未入力

答え
3.A

「型が一致しません」の実行時エラーが発生します。
その他は実行されます。

確認問題2

次のプログラムを実行した際に、実行時エラーが発生した。

Sub Test2()
    testArr = Range("A1:A3")
    MsgBox (testArr(1, 5))
End Sub

実行時エラーが発生した原因として考えられるものは次のうちどれか。
1.インデックスが有効範囲にありません。
2.型が一致しません。
3.アプリケーション定義またはオブジェクト定義のエラーです。
4.オブジェクトは、このプロパティまたはメソッドをサポートしていません。

答え
1.インデックスが有効範囲にありません。

このプログラムはA1~A3までの3つの値を配列「testArr」に格納しています。
ですので、配列の中身は「testArr(1,1)、testArr(1,2)、testArr(1,3)」の3つの指定方法で取得することができます。
問題文のプログラムのように「testArr(1,5)」を指定すると、配列で指定した範囲外のインデックスを指定しているため、1のエラーが発生します。

次回からは、エラーへの対応方法についてです。

 

連載目次リンク

ExcelVBA 入門 連載目次