【Excel VBA】実行時エラー「オブジェクトが必要です」の対処法は?エラーの原因・解決方法を解説

  • 2024.09.13
       
【Excel VBA】実行時エラー「オブジェクトが必要です」の対処法は?エラーの原因・解決方法を解説

Excel VBAを実行した際に「実行時エラー ‘424’: オブジェクトが必要です。」というエラーメッセージが出てくることがあります。このエラーが表示される原因と解決方法について、様々なパターンを例に説明していきます。

「オブジェクトが必要です」エラーとは

「実行時エラー ‘424’: オブジェクトが必要です。」というエラーは、Excel VBAのプログラムを実行した際に処理の中で参照できるオブジェクトが存在しなかったり、オブジェクトが適切に指定されていなかったりした場合に表示されます。

参照できるオブジェクトが存在しないというのは、たとえばオブジェクトではないものにValueプロパティを付けた場合などのことです。次の例では、Valueプロパティが付いている”MyVar”はオブジェクトとして処理されないので、このエラーメッセージが表示されます。

【例】

Sub Sample1()
    Dim MyVar As Variant    '変数MyVarはVariant型です
    MyVar = ActiveSheet.Range("A1")    'この書き方では代入できません
    MsgBox MyVar.Value    '上の行が正常に処理されないのでオブジェクトが参照できません
End Sub

【Valueプロパティの使い方はコチラ】

【Excel VBA】Valueプロパティでセルの値を取得・上書きする方法を解説

VBAのオブジェクトとObject型とは

オブジェクトとは、プロパティ(属性)とメソッド(処理)によって構成されるデータ構造です。プログラミング言語のパラダイム(プログラムの処理の構造やルールの基本理念のこと)の1つである「オブジェクト指向プログラミング(Object-Oriented Programming; OOP)」を表現するために使われます。

Excel VBAでは、代表的なオブジェクトとしてセルの範囲を表すRangeオブジェクトなどがよく使われています。その他にも、Object(オブジェクト)型という型の変数を宣言することで、プログラム内で自由にオブジェクトを扱うことができます。

【変数をオブジェクト型で宣言する書き方サンプル】

Dim MyObj As Object

オブジェクトのプロパティとは、オブジェクトに格納されているデータのことです。たとえばこれまでに使ってきたValueプロパティは、オブジェクトに格納されている(value)を表現するプロパティです。RangeオブジェクトのValueプロパティは、Rangeオブジェクトで指定した範囲のセルの中に入っている数値や文字列などを表しています。

オブジェクトのメソッドとは、オブジェクトの中で定義された関数(function)です。オブジェクトによってどんなメソッドが使えるかは異なります。

【オブジェクトについてもっと詳しく知りたい方はコチラ】

オブジェクト指向とは?具体例を交えてわかりやすく解説

「オブジェクトが必要です」エラーの主な原因は?具体例で解説

Setステートメントがない

このエラーメッセージが表示される要因として最もよくあるのが、Setステートメントを入れ忘れているというものです。

【誤ったコードの例】

Sub Sample1()
    Dim MyVar As Variant 
    MyVar = ActiveSheet.Range("A1")
    MsgBox MyVar.Value
End Sub

上のコードは3行目の記述が誤っているため正常に動きませんでしたが、これはSetステートメントを入れることで解決します。

Setステートメントは変数をオブジェクトに割り当てるという処理を行うための宣言です。このコードの場合、MyVarという変数にRangeオブジェクトを割り当てるようにすることで正常に動くことが期待できます。

【正しいコードの例】

Sub Sample1()
    Dim MyVar As Variant
    Set MyVar = ActiveSheet.Range("A1")
    MsgBox MyVar.Value
End Sub

オブジェクト型ではないものにプロパティやメソッドを付けている

オブジェクト型に当てはまらない型で変数を宣言したにもかかわらず、プロパティやメソッドを付けてしまうと、「オブジェクトが必要です」のエラーが出ます。変数を宣言するときの型の指定や、その変数を実際に使うときの扱い方にはよく注意しましょう。

次のコードは、Variant型で宣言した変数にプロパティが付いているため、「オブジェクトが必要です」のエラーになっています。

【誤ったコードの例】

Sub ForEachError()
    Dim dic As Object    'この変数はオブジェクト型になっています
    Set dic = CreateObject("Scripting.Dictionary")
    dic.Add "Key1", "テックマニア編集部"
    dic.Add "Key2", "鷺坂りな"
    
    Dim item As Variant    'この変数はオブジェクト型ではありません
    For Each item In dic.Items
        MsgBox item.Name    'ここでエラーが発生します
    Next item
End Sub

上のコードの場合はNameプロパティが不要なので、.Nameを削除することで正常に動きます。これは、For Eachで取り出しているdic.Itemsに格納されているデータの一つ一つが全て文字列型であるため、itemはオブジェクトではないということが原因です。

【正しく動くコード】

Sub ForEachFunctional()
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    dic.Add "Key1", "テックマニア編集部"
    dic.Add "Key2", "鷺坂りな"
    
    Dim item As Variant
    For Each item In dic.Items
        MsgBox item    'プロパティは不要です
    Next item
End Sub

【まとめ】エラーが出たらどう対処する?

「オブジェクトが必要です」というエラーが出たときは、まずプログラムの中で変数や値の型が正しく扱われているかを見直しましょう。

このエラーが出てくる根本的な原因は、コードの中でオブジェクトが正しく指定されていないことです。オブジェクトでないものにプロパティやメソッドが付いていないか、Setを付け忘れていないかをチェックしてみてください。

特に、Variant型で宣言した変数をオブジェクトに割り当てるときはSetステートメントを忘れないようにすることを意識することで、エラーの原因を減らせます。

VBAのコードを書くのに慣れてくるとSetを付け忘れがちになるので、このエラーが出てきたときはぜひ試してみてください!

関連記事

VBAの勉強方法は?

書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。

ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。

プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。

<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~

このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。

     

Otherカテゴリの最新記事