実行時エラー438「オブジェクトは、このプロパティまたはメソッドをサポートしていません」の原因と直し方
実行時エラー438が出る原因(オブジェクトの種類の取り違え・つづりの誤り・Excel のバージョンにない関数)を整理し、変数の型を指定してエラーを事前に防ぐ方法を解説します。
どんなエラーか
オブジェクトに対して、そのオブジェクトが持っていないプロパティやメソッドを使おうとしたときに出るエラーです。たとえば、ブック(Workbook)に対して、シートにしかない Range を使った場合などです。
「そのオブジェクトは何の種類か」と「使おうとしている名前は正しいか」の2点を確認すれば、ほとんどの場合は原因が分かります。
よくある原因1:オブジェクトの種類を取り違えている
ブックとシート、セルと図形など、似たものを取り違えると発生します。止まった行の変数が何の種類なのかは、イミディエイトウィンドウで TypeName を使うと確認できます。
' エラーになる例(Workbook には Range がない)
Dim wb As Object
Set wb = Workbooks("売上.xlsx")
wb.Range("A1").Value = 1
' 正しい例(シートを指定する)
wb.Worksheets("Sheet1").Range("A1").Value = 1
' 変数の種類を確かめる(イミディエイトウィンドウで実行)
? TypeName(wb) ' → Workbook
? TypeName(Selection) ' → Range、図形を選んでいると Rectangle などよくある原因2:つづりの誤りと、Object 型の変数
変数を As Object や型なし(Variant)で宣言していると、プロパティ名のつづりを間違えても、実行するまで誤りに気付けません。実行した時点で 438 のエラーになります。
変数を As Worksheet や As Range のように具体的な型で宣言しておけば、つづりを間違えたときに、実行前のコンパイルの段階で「メソッドまたはデータ メンバーが見つかりません」と教えてくれます。また、ピリオドを入力したときに候補が表示されるため、つづりの誤りそのものが減ります。
' 実行するまで誤りに気付けない書き方
Dim ws As Object
Set ws = ActiveSheet
ws.Rnage("A1").Value = 1 ' つづりの誤り → 実行時エラー438
' 型を指定すると、実行前に誤りが分かる
Dim ws2 As Worksheet
Set ws2 = ActiveSheetよくある原因3:使っている Excel にない関数・機能
WorksheetFunction.XLookup や Filter など、新しいバージョンの Excel で追加された関数を、古いバージョンの Excel で実行すると 438 になります。自分の PC では動くのに、ほかの人の PC では動かないときは、Excel のバージョンの違いを疑います。
Outlook や Word を操作するマクロでも、相手のアプリのバージョンによって使えるプロパティが違うことがあります。配布するマクロでは、利用者全員の環境で使える機能だけを使うようにします。
調べ方の手順
438 が出たときは、次の順番で確認すると原因を絞り込めます。
- 止まった行で、ピリオドの左側にある変数やオブジェクトを確認する
- イミディエイトウィンドウで TypeName(変数) を実行し、想定どおりの種類か確かめる
- F2 キーでオブジェクト ブラウザーを開き、その種類が持つプロパティ・メソッドの名前とつづりを確かめる
- ほかの PC でだけ出る場合は、Excel のバージョンを比べる
※変数を具体的な型で宣言し、モジュールの先頭に Option Explicit を書いておくと、このエラーの多くを実行前に防げます。