【VBA】「オブジェクト変数またはWithブロック変数が設定されていません」からの脱出法

【業務効率化】VBA
スポンサーリンク

こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!

Excel作業で頻発するのがこのエラー。

画面に突然現れる「実行時エラー ’91’: オブジェクト変数またはWithブロック変数が設定されていません」。

突然の表示に、思わずドキッとしてしまいますよね。「何か重大なミスをしてしまったのでは……」と不安になる方も多いはずです。

そこで今回は、このエラーの内容と、コピペで即活用できる解決策を分かりやすく解説していきます。

【業務効率化】VBAの記事を見る

エラーの正体は「中身が空っぽの箱」

このエラーが発生する原因の多くは、命令語「Set(セット)」の記述漏れにあります。

VBAにおいて、ワークシートやセル範囲といった「オブジェクト(操作対象)」を変数(箱)に代入する際は、必ず「Set」というキーワードを用いる必要があります。

これを忘れてしまうと、変数の中身は「Nothing(空っぽ)」の状態になってしまいます。

中身がない変数に対して「処理を実行して!」と命令しても、VBAは「対象が存在しないので無理です!」とエラーを返します。これが、あのエラーメッセージの正体です。

よくある間違いパターン(Bad & Good)

それでは、具体的なミスを例に挙げて確認していきましょう。

特に、セルの検索を行う「Findメソッド」を使用する際によく発生します。

❌ 【Bad】 エラーが出る書き方

Sub ErrorSample()
    Dim FoundCell As Range
   
    ' ここでエラー発生!Setを忘れています
    FoundCell = Range("A:A").Find("売上データ")
   
    MsgBox FoundCell.Address
End Sub

数値や文字列を代入する際は x = 10 のように記述しますが、Range(セル)などのオブジェクトを扱う際は、それだけでは正しく動作しないのです。

⭕ 【Good】 正しい書き方

Sub FixedSample()
    Dim FoundCell As Range
   
    ' 先頭に Set をつけるだけ!
    Set FoundCell = Range("A:A").Find("売上データ")
   
    ' 見つからなかった場合の対策も入れておきます
    If Not FoundCell Is Nothing Then
        MsgBox "データは " & FoundCell.Address & " にありました!"
    Else
        MsgBox "データは見つかりませんでした。"
    End If
End Sub

もう一つの落とし穴:検索で見つからなかった時

実は、正しく「Set」と記述していても、このエラーが発生するケースがあります。

それは、「検索対象の文字列が見つからなかったとき」です。

Findメソッドは、条件に一致するセルが見つからない場合、変数に「Nothing(空っぽ)」を代入します。

その状態で「Address(セルの場所)」などの情報を取得しようとすると、「参照先がない」ためにエラーが起きてしまうのです。

そのため、先ほどの「Good」コードのように、If Not FoundCell Is Nothing Then(もし変数の中身が空っぽでなければ、という確認)を入れておくのです。

明日から使えるコード

最後にそのまま使えるエラー回避用の汎用コードをご紹介します。ぜひコピーして活用してください。

Sub SafeSearch()
    Dim ws As Worksheet
    Dim rng As Range
    Dim searchStr As String
   
    ' シートの設定(ここでもSetが必要です!)
    Set ws = ThisWorkbook.Sheets("Sheet1")
    searchStr = "探したい文字"
   
    ' 検索実行
    Set rng = ws.Range("A:A").Find(What:=searchStr, LookAt:=xlPart)
   
    ' エラー回避の条件分岐
    If rng Is Nothing Then
        MsgBox "「" & searchStr & "」は見つかりませんでした。", vbExclamation
    Else
        MsgBox "発見!場所は: " & rng.Address, vbInformation
        rng.Select ' 見つけたセルを選択
    End If
End Sub

まとめ

このエラーに遭遇したら、以下の2点をチェックしましょう!

  1. 「Set」を書き忘れていないか?
  2. Findなどで「見つからなかった時(Nothing)」の処理を書いているか?

これら2つのポイントを意識するだけで、もうあのエラー画面に慌てる必要はなくなります!

【業務効率化】VBAの記事を見る


VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

この記事を書いた人
ぐー

手取り15万円の会社員でも、年間100万円以上の節約・資産管理・スキルアップで新NISAで年間360万円投資し、iDeCoもフル活用しています。日商簿記3級持っています。

このブログでは、私が実践してきた節約術やリアルな資産運用、稼ぐ力を高めるITスキルについて発信しています。

生活を豊かにしたくて、高配当株投資で年間配当金60万円をめざしています。現在は年間配当金25万円以上達成!

ゲーム・漫画・アニメなどが好きです。
一緒に資産形成をがんばりましょう!
よろしくお願いします!

ぐーをフォローする
【業務効率化】VBAITスキル
スポンサーリンク
ぐーをフォローする

コメント

タイトルとURLをコピーしました