Excel VBAの経験がある程度ある方なら、オブジェクトによってコンパイルエラーになるものと、ならないものがあることを経験則でご存知でしょう。
Excel VBAではコンパイルエラーになるオブジェクトと実行時エラーになるオブジェクトがある
例えばWorksheetオブジェクトの場合、以下のように存在しないプロパティ・メソッドを呼ぶコードが書かれていれば、コンパイルエラーになります。
Sub Worksheetはコンパイルエラーになる()
Dim sh As Worksheet
For Each sh In Worksheets
sh.hogehoge
Next sh
End Sub
これに対してRangeオブジェクトの場合は、コンパイルエラーは発生することなく実行ができてしまい、存在しないメソッドの行で実行時エラーが発生します。
Sub Rangeはコンパイルエラーにならない()
Dim rng As Range
For Each rng In Range("A1:G7")
rng.hogehoge
Next rng
End Sub
Worksheetオブジェクトのように、コンパイルエラーになってくれるほうがありがたいのですけれど、RangeオブジェクトはExcelの中でもっとも複雑なオブジェクトですから、コンパイル時に厳しくチェックするのは難しいのだろうなあ、くらいに思ってきました。
コンパイルエラーになるオブジェクトを確認するサンプルマクロ
他のオブジェクトの場合どうなのだろうと気になり、いくつかのオブジェクトをテストしてみました。テスト結果は、変数宣言行の後ろに「実行時エラー」または「コンパイルエラー」とコメントを入れています。
ブックモジュール・シートモジュールの名前は、デフォルトの「ThisWorkbook」「Sheet1」から変更されていないことを想定しています。
Dim obj As Excel.Application ' 実行時エラー
' Dim obj As Office.CommandBars ' コンパイルエラー
' Dim obj As Office.CommandBar ' コンパイルエラー
' Dim obj As Excel.AddIns ' 実行時エラー
' Dim obj As Excel.AddIn ' 実行時エラー
' Dim obj As Excel.Workbooks ' コンパイルエラー
' Dim obj As Excel.Workbook ' 実行時エラー
' Dim obj As VBAProject.ThisWorkbook ' コンパイルエラー
' Dim obj As Excel.Windows ' 実行時エラー
' Dim obj As Excel.Window ' 実行時エラー
' Dim obj As Excel.Sheets ' コンパイルエラー
' Dim obj As Excel.Worksheets ' 実行時エラー
' Dim obj As Excel.Worksheet ' コンパイルエラー
' Dim obj As Excel.Charts ' 実行時エラー
' Dim obj As Excel.Chart ' コンパイルエラー
' Dim obj As VBAProject.Sheet1 ' コンパイルエラー
' Dim obj As Excel.Range ' 実行時エラー
' Dim obj As Excel.WorksheetFunction ' 実行時エラー
' Dim obj As Excel.Shapes ' 実行時エラー
' Dim obj As Excel.Shape ' 実行時エラー
' Dim obj As Excel.ShapeRange ' 実行時エラー
' Dim obj As Excel.DrawingObjects ' 実行時エラー
' Dim obj As Excel.Rectangle ' 実行時エラー
' Dim obj As Excel.Oval ' 実行時エラー
End Sub
グローバルメンバーのプロパティから取得できるオブジェクトをメインに、私が気になったものをテストしてみたのですけれど、予想以上にコンパイルエラーにならないオブジェクトがあります。
Excel VBAを嫌う、プロのプログラマーさんの気持ちが、少しわかる気もします。
ちなみにPowerPoint VBAでも同様のテストをしてみたところ、PowerPoint VBAでは期待通り、私がテストしたすべてのオブジェクトでコンパイルエラーになりました。それが正常な挙動だろうと感じます。
最終更新日時:2019-06-25 10:20
Home » エクセルマクロ・Excel VBAの使い方 » コンパイルエラーになるオブジェクトと実行時エラーになるオブジェクト