VBA実行時エラー424「オブジェクトが必要です」が出た時に確認した3つの場所

請求書を集計するマクロを使えば、日々の定型作業が劇的に楽になります。以前は手作業で膨大な時間がかかっていましたが、VBAでマクロを作成してからはボタン一つで数分で終わるようになりました。その結果、作業時間が手作業の100分の1以下に短縮されました。

ところが、ある日突然エラーが起きます。その日は、いつも通りにマクロを実行したときのことです。「実行時エラー424:オブジェクトが必要です」という内容です。すると、普段はスイスイ動くマクロが止まり、次に何をすれば良いのか分からなくなりました。頭の中が真っ白になりクリックを何度も繰り返すほどです。特に締切が迫っている業務の最中で、冷や汗が止まりませんでした。

このエラーはVBAを扱っているとよく遭遇しますが、原因と対処法をしっかり理解しておらず、毎回インターネットで検索していました。今回はタイミングが悪く、検索している時間も惜しい状況だったので、原因を根本から理解して自分で解決できるようになりたいと考えました。

この記事では、私が実際に経験した「実行時エラー424:オブジェクトが必要です」について、原因とその解決方法を具体的に説明していきます。もしこのエラーに遭遇したら、落ち着いて原因を特定してみてください。

マクロ機能追加、オブジェクトエラー

請求書を月ごとに集計するマクロを作りました。私にとってなくてはならない存在です。たとえば、毎月、経理部から請求書データを渡されます。それをExcelファイルにまとめるのです。さらに集計してレポートを作成していました。これはかなりの時間と労力を要する作業です。マクロのおかげで格段に効率化されました。他の業務に集中できるようになったのです。

ある日、新しい機能を追加することにしました。月ごとの集計だけでなく年間の総計も必要でした。新しいシートを追加する処理を考えます。そこに年間の合計値を計算するコードを加えました。コードの追加自体はそれほど複雑ではありません。作業はすぐに完了しました。意気揚々とマクロを実行してみます。無情にも画面にエラーメッセージが出ました。「実行時エラー424:オブジェクトが必要です」という内容です。

VBAエディタで実行時エラー424の日本語ダイアログが表示されている画面

なぜ?動かないコード、オブジェクトエラーに困惑

「え?いつも動いていたのに、なんで?」と焦りました。さっきまで普通に動いていたコードです。追加した部分に問題があることは明らかです。しかし具体的にどこが間違っているのか分かりません。そのため、全く見当がつかない状態でした。メッセージには「オブジェクトが必要です」とあります。どのオブジェクトが必要とされていないのでしょうか。その理由がさっぱり分からなかったのです。知らない言葉で話しかけられているような感覚でした。

とりあえず、追加したコードをコメントアウトします。

Set忘れとエラー424の教訓

エラー424の原因として最もよく言われるのが「Setステートメントの付け忘れ」です。オブジェクト型の変数を扱う際に不可欠な記述で、実際のオブジェクトを代入するときに使います。Dim ws As Worksheetと宣言しただけでは、変数は何も指し示していません。Set ws = ThisWorkbook.Sheets(“Sheet1”)のように書いて初めて、シートを代入できます。

私が追加したコードでもこれが原因でした。新しいシートを追加する処理で、Dim newSheet As Worksheetと宣言しただけでした。この時、頭の中ではシートがすでに追加されたつもりになっていました。つまり、肝心なSetの行を書き忘れていたのです。newSheet.Name = “年次集計”としたところ、空っぽの変数に名前を付けようとして「オブジェクトが必要です」と怒られました。

日本語のエラーメッセージが出た後、Setステートメントが抜けているVBAコードの

Setが非常に重要な役割を果たすと、この経験で再認識しました。

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

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

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

空のVariant型で起きるエラー424

Set忘れ以外にも原因があるとは知りませんでした。私が遭遇したケースとは少し違うパターンです。しかしこれもVBAでよくあるパターンです。「Variant型」の変数を扱うときによく起きます。オブジェクトのプロパティをドットで呼んだ場合です。

このVariant型はあらゆるデータを格納できる便利な型です。数値や文字列や日付なども入れることができます。しかし型が固定されていないという弱点を持つ点に注意してください。意図しない型として扱われてしまうことがあるのです。例えば、あるセルに文字列が入っているとします。その文字列をVariant型の変数に代入しました。その変数は文字列として扱われるべきです。しかし何らかの理由で空っぽになることがあります。NullやEmptyとして扱われてしまった場合です。その変数にドットでプロパティを呼び出してみます。すると「オブジェクトが必要です」というエラーが出るのです。

Variant型変数にドットでアクセスして日本語エラーが表示されたエディタ画面

未格納変数へのオブジェクトアクセスエラー

Variant型変数に何も格納されていない状態です。あたかもオブジェクトであるかのように扱いました。この状態では、VBAは「これはオブジェクトではない」と判断します。そのためドットでプロパティを呼ぶことはできません。Dim dataと宣言した変数があるとしましょう。何も代入しないままdata.Value = “テスト”と書きます。この場合もエラー424が発生する可能性が高いのです。

読み取り専用プロパティへの代入エラー

もう一つ、意外と見落としがちな原因があります。プロパティへの代入というパターンです。これは読み取り専用のプロパティに値を入れようとしたケースに当たります。VBAではオブジェクトの性質をプロパティで操作します。しかし中には書き換えることができないものも存在するのです。値を読み取ることしかできない読み取り専用です。

例えばExcelのシートオブジェクトを見てみましょう。UsedRangeという便利なプロパティがあります。これはデータが入力されている範囲を返してくれるものです。しかしこのプロパティ自体に値は代入できません。シートの使用状況に応じて自動的に決まるからです。ユーザーが直接書き換えることを想定していません。

UsedRangeへの値代入でエラー

Dim myRange As Rangeと変数を宣言しました。これにUsedRangeを代入するのは問題ありません。しかしその後に直接値を代入しようとすると危険です。myRange.Value = “新しい値”と書いたとしましょう。ここでエラー424が発生する可能性があります。UsedRangeは値を持たせるためのものではありません。使用状況を示すためのオブジェクトだからです。そのため、ここに値を代入しようとしても拒否されます。

読み取り専用プロパティに代入しようとして日本語の実行時エラーが出た画面

このようなエラーに遭遇した場合は確認が必要です。自分が代入しようとしているプロパティを調べます。本当に書き込み可能なのかどうかを確かめましょう。

宣言漏れを防ぐOption Explicit

ここまでエラー424の具体的な原因を見てきました。Setステートメントの付け忘れがその一つです。Variant型変数へのドット誤用も紹介しました。読み取り専用プロパティへの代入というパターンもあります。これらの原因を未然に防ぐために役立つ手法が存在するのです。それが「Option Explicit」という宣言です。

モジュールの先頭にこの一文を記述しておきます。すべての変数を明示的に宣言することを強制する機能です。通常は変数を宣言しなくても自動的に処理されます。初めて使うときにVariant型として宣言されてしまうのです。これは一見すると便利に思えるかもしれません。しかしタイプミスによる思わぬバグを生み出します。

変数誤認識を防ぐOption Explicit

例えばDim ws As Worksheetと宣言すべき箇所があります。タイプミスでDim wws As Worksheetと書いたとしましょう。宣言がない場合VBAはwwsを新しい変数と認識します。そのままエラーを出さずに処理を進めてしまうのです。しかし本来意図していたwsには何も代入されていません。その結果、後でws.Name = “集計”のようなコードを実行してみます。ここでようやくエラー424が発生してしまうのです。

そのため、Option Explicitを記述しておけば安心です。タイプミスを実行する前にエディタが検出してくれます。

エラーの解決にかかる時間は以前の半分以下です。

エラー再発の原因:不完全修正と実行順序

まず、エラーの原因を特定し修正したはずだとします。しかしまた同じエラーが出てしまうこともあるのです。そんな経験は皆さんにもあるのではないでしょうか。私自身も一度は解決したと思ったエラーが再発しました。たとえば、翌週に同じマクロを実行すると再び同じエラー画面が表示されました。しばらく経ってから再発してしまい頭を抱えたのです。

このような場合考えられる原因はいくつかあります。まず一つ目の可能性として修正が不完全なケースです。複数の箇所で同じようなミスをしていたとします。しかし一つしか修正していなかったという場合です。VBAコードは似たような処理が繰り返されることがあります。一見同じように見えても微妙な違いがあるものです。そのため関連する部分も丁寧に確認する必要があります。エラーが出た箇所だけを見ていてはいけません。

マクロの実行順序と干渉

二つ目の可能性としてコードの実行順序が考えられます。他のマクロとの干渉が起きていないか確認しましょう。複数のマクロが連携して動くような複雑なシステムです。たとえば、あるマクロの処理が別のマクロに影響を与えることがあります。具体的には、あるマクロがオブジェクトを解放したとしましょう。その後、別のマクロがそのオブジェクトを使おうとしました。これで予期せぬエラーを引き起こすケースがあります。

私自身が経験したケースも紹介しておきます。あるシートを操作するマクロを修正した時のことです。

最後に、確認する順番を整理してみました。

まずエラーが出た行を特定し、Setステートメントの付け忘れがないか確認します。次にVariant型の変数にドットでアクセスしていないか、初期化が漏れていないかを見直します。それでも解決しない場合は、読み取り専用プロパティへの代入になっていないかを確認してください。

さらにOption Explicitを記述して宣言漏れやタイプミスを検出できるようにし、修正したコードが他のマクロと干渉していないかも合わせて確認します。

この順番で潰していけば、ほとんどの実行時エラー424は解決できるはずです。焦らず一つずつ確認してみてください。

無料プレゼント

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問だけ回答する