VBA実行時エラー438「オブジェクトはこのプロパティまたはメソッドをサポートしていません」が出た時に確認した場所

毎日使うVBAマクロが急に止まった経験はありませんか。「実行時エラー438:オブジェクトはこのプロパティまたはメソッドをサポートしていません」というメッセージが出ることがあります。会社員として業務自動化を進める中で、この現象に遭遇し、何が原因か分からず途方に暮れることもあるでしょう。

私も以前、経費精算のマクロが急に動かなくなった経験がありました。見た目には何も間違っていないように見えるコードでしたが、何時間睨みつけても解決の糸口が見つからず、結局は手作業で処理を続けるしかありませんでした。あの時の原因不明の焦燥感を今でもよく覚えています。

このエラーは、VBAが指定した「プロパティ」や「メソッド」が存在しない、または利用できないと判断したときに発生するものです。この記事では、私が実際にエラーに遭遇した際の体験談をもとに、原因を特定し解決していった手順を紹介します。一つずつ確認すれば、必ず解決の道につながるはずです。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。現役エンジニアのサポートで、未経験から実践的なスキルを身につけられます。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

突然のエラー438!マクロ停止

ある日、私はいつものように経費精算のExcelマクロを実行しました。ボタンをクリックすると、自動的に複数のシートからデータを集計します。そしてPDFファイルに出力する便利な仕組みです。ところが、その日はいつもと違うメッセージが表示されました。「実行時エラー438」というダイアログが出たのです。オブジェクトはこのプロパティなどをサポートしていません、と書かれています。そしてマクロが途中で停止してしまいました。その瞬間、私は背筋がヒヤリとしたのを覚えています。毎日の経費精算に欠かせないマクロでした。それが止まるのは、私にとって重大な問題だったのです。

上司に報告するのも非常に気が重くなりました。早く原因を見つけて直さなければ、というプレッシャーが私を襲います。

エラー438 オブジェクトにない機能

このエラーメッセージは、何らかのオブジェクトに対して発生します。例えばExcelのシートやセルなどです。それらに対し、存在しないプロパティなどを呼び出そうとしたときに起きます。プロパティはオブジェクトの属性で、セルの値や背景色などです。メソッドはオブジェクトの操作で、セルのコピーや削除などになります。簡単に言えば、VBAが「指定された機能はこの対象物にない」と教えているのです。

毎日使っていた経費精算マクロが急にエラー438で止まりました。解決するまで他の業務に集中できませんでした。

VBEで見落としがちなスペルミスとエラー

エラーに遭遇したとき、私がまず確認することがあります。それはプロパティ名やメソッド名のスペルミスがないかという点です。意外に思われるかもしれませんが、これが原因のケースは非常に多いと感じます。私も以前、セルの背景色を変更するマクロを書いていたときのことでした。本来はRangeのInteriorと書くべき部分です。それをRangeのintelierと入力してしまったのです。VBEのコードをよく見ても、ぱっと見では間違いが分かりませんでした。

VBAオブジェクトのスペルミス、赤波線が出ない罠

「Interior」と「intelier」は、たった一文字の違いです。しかしVBAにとっては全く別のものとして認識されてしまいます。このスペルミスに気づくまで、私は30分近くもコードを睨み続けていました。エラー文は「オブジェクトはこのプロパティをサポートしていません」と出ます。まさかたった一文字の打ち間違いが原因だとは思わなかったのです。VBEは通常、スペルミスがあると赤波線で教えてくれます。しかし特定の状況下ではそれが出ないこともあります。特にオブジェクト型変数を使っている場合などは注意が必要です。この機能がうまく働かないことがあるためです。

セルの背景色を変えるマクロでスペルミスをしてエラーが出ました。見た目には分からず30分近く悩んだ体験があります。修正後、一瞬でマクロが動いた時には自分の確認不足に苦笑いしました。

VBEのコードウィンドウで、特定のプロパティ名(例:.Intelier)が赤波線

オブジェクト・プロパティ記述の落とし穴

スペルミスの次に確認したいのは、プロパティやメソッドの記述です。オブジェクトの後ろに正しく書かれているかという点を見直します。VBAでは、特定のオブジェクトに対して何らかの操作を行う場合があるでしょう。そのオブジェクトの後に「.(ドット)」を付ける必要があります。そして具体的なプロパティやメソッドを指定してください。例えばRange(“A1”)はセルというオブジェクトそのものを指します。セルの値を取得したい場合はRange(“A1”).Valueと書くのが基本です。

もし「Range(“A1”)」とだけ書いてしまったらどうなるでしょうか。その後に「.Value」や「.Text」などのプロパティを書き忘れたとします。そのまま何らかの操作をしようとすると、エラーが発生するかもしれません。VBAはオブジェクト自体には直接的なメソッドがないと判断します。そのため「このプロパティはサポートしていません」というエラーを出すのです。オブジェクトそのものと、それに付随するプロパティやメソッドは別物だと意識しましょう。

手動でセルに色を塗る作業と比べると、マクロが正しく動けば手動作業の約100分の1の時間で完了します。

型宣言でVBAエラー激減

VBAでエラーを防ぐために、非常に有効な方法が一つあります。それは変数を具体的なデータ型で宣言することです。ワークシートを扱う変数ならDim ws As Worksheetと宣言します。これに対しDim ws As Objectとしてしまう人も多いでしょう。そうするとVBEの「インテリセンス(入力補完)」が効かなくなってしまいます。インテリセンスが効かないと、ドットを入力しても何も起きません。利用可能なプロパティやメソッドの候補が表示されなくなるのです。

候補が表示されない状態では、すべて手打ちすることになります。それではスペルミスや記述漏れのリスクが格段に高まります。実際、私も以前は「どうせ動けばいいや」と型宣言を怠りがちでした。その結果、頻繁にエラーに遭遇してしまったのです。デバッグに多くの時間を費やしていました。しかし具体的な型で宣言する習慣を付けてからは状況が変わりました。VBEが自動で候補を表示してくれるため、タイプミスが激減したのです。

型宣言でエラー激減

以前は変数を型宣言せずに使うことが多くありました。そのせいでインテリセンスが効かず、何度もスペルミスでエラーに遭遇する始末です。しかしDim As Worksheetを使い始めてから格段にエラーが減りました。デバッグ時間が短縮され、精神的な負担も大きく軽減できたと感じます。

VBEのコードウィンドウで、Dim ws As Object と宣言された変数に

マクロ互換性の注意点

VBAで作成したマクロが、ある環境では問題なく動作することがあります。しかし別の環境で実行するとエラーが発生するケースも存在します。このような場合、Excelのバージョン差が原因である可能性を疑いましょう。特に新しいバージョンのExcelで追加された機能を使っていると、古いバージョンではサポートされておらずエラーになることがあります。

私も一度、職場の同僚から「マクロが動かない」と相談されたことがありました。私のPCでは問題なく動いていたマクロでしたが、同僚のPCは少し古いバージョンのExcelを使っており、私が使っていた特定のプロパティがまだ実装されていなかったことが判明したのです。マクロを共有する際は、相手のExcel環境を事前に確認する習慣が大切だと痛感しました。

Excelのバージョン情報ダイアログボックス。日本語インターフェースのExcel

互換性の問題を避けるためには、できるだけ古いバージョンのExcelでも動作するメソッドを選ぶか、バージョンごとに処理を分岐させる工夫が求められます。

VBAエラー解決:参照設定とSet

上記の確認事項を一つずつ試しても解決しないことがあります。まだエラーが出るという経験は誰にでもあるものです。別の場所でまた同じエラーが出ることもあります。そのような時は、少し落ち着いて深い部分を見直してみる必要があるでしょう。まず確認したいのは「参照設定」です。VBAはExcel以外のアプリケーションの機能を利用するケースがあります。OutlookやAccessなどを使うために「参照設定」を行うのです。この参照設定が正しく行われていない場合があります。あるいは必要なライブラリが見つからない場合にもエラーが生じるのです。VBEの「ツール」

メニューから「参照設定」を開いてみましょう。必要なライブラリにチェックが入っているか確認します。または「参照不可」となっていないかを見てみましょう。

オブジェクト変数Set確認でデバッグ時間短縮

次に、オブジェクト変数が正しく「Set」されているかを確認してください。オブジェクト変数は、宣言しただけでは何も参照していません。Setステートメントを使って、具体的なオブジェクトを代入する必要があります。もしSetし忘れていると、エラーの原因になってしまうでしょう。またはSetしたオブジェクトがNothingになっている場合も同様です。

エラーのデバッグに費やした時間を振り返ると、以前は1時間以上かかっていましたが、確認する順番を決めてからは15分程度に短縮されました。

VBEのツール→参照設定ダイアログボックス。リスト項目が多数表示されている。日本

VBAエラー438解決手順

VBAの実行時エラー438は、非エンジニアにとって頭を悩ませるエラーです。私が経験から学んだ、確認する順番をまとめました。

まず①プロパティ名やメソッド名のスペルミス(最多の原因。インテリセンスや赤波線を確認)、②オブジェクトの後ろの記述漏れ、③変数を具体的な型で宣言しているか(Option Explicitも有効)の3点を順に見直します。

それでも直らない場合は、④Excelのバージョン差(開発環境と実行環境で使える機能が違う)、⑤参照設定(VBEの「ツール」から必要なライブラリを確認)、⑥オブジェクト変数が正しくSetされているかの3点を確認してください。

これらを順番に試していけば、エラーの原因はほぼ特定できます。私自身、まだまだ手探りではありますが、少しずつ落ち着いて対応できるようになってきました。

VBEのデバッグ画面で、ローカルウィンドウに変数の値が表示されている状態。日本語

無料プレゼント

Excel業務を自動化する前に確認するチェックリスト(PDF)

自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。

無料でチェックリストを受け取る

¥980 ミニキット

コピペで動かせる3スクリプト+自動化チェックリスト

最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。

ミニキットを見る(¥980)

関連リンクとチェックリスト

関連書籍

Excel・VBA関連書籍を、手元で見返せる形にしておきたい場合

ExcelやVBAのトラブルは、基本の考え方をあとから見返せるだけでかなり楽になります。手元に1冊置いておくと、同じエラーで止まったときに確認しやすいです。

Excel・VBA関連書籍をAmazonで探す

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。

ITエンジニア転職・EBAエデュケーション →

[アンケート] この記事は役に立ちましたか?


1問だけ回答する