VBAで「オブジェクト変数または With ブロック変数が設定されていない」時の対処法|実行時エラー91を初心者向けに解説

VBAで「オブジェクト変数または With ブロック変数が設定されていない」時の対処法|実行時エラー91を初心者向けに解説

本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。

VBAでマクロを実行したときに、
「オブジェクト変数または With ブロック変数が設定されていません」
というエラーメッセージが表示されて、思わず手が止まってしまった経験はありませんか?

特にVBAを始めたばかりの頃は、
「どこが間違っているのか分からない」
「さっきまで動いていたはずなのに急にエラーが出た」
と、原因がつかめず焦ってしまいがちです。

このエラーは、実行時エラー91とも呼ばれ、
オブジェクト変数の設定ミスやタイプミス、コードの使い回しなど、
初心者がつまずきやすいポイントで非常によく発生します。

実際、このエラーは

  • 変数の設定がうまくできていなかった
  • コードを修正した際に、一部だけ直し忘れていた
  • 特定の条件のときだけ、想定と違う動きをしていた

といった、初心者の方がつまずきやすい「ちょっとしたミス」が
原因になっているケースがほとんどです。

この記事では、
「オブジェクト変数または With ブロック変数が設定されていない」エラーが出る理由と、
初心者の方でも順番に確認できる具体的な対処法を、サンプルコードを交えながら分かりやすく解説します。

「VBAは難しそう」「自分には向いていないかも…」と感じている方でも、
エラーの正体が分かれば、落ち着いて対応できるようになります。
同じエラーで何度も悩まないためにも、ぜひ最後までチェックしてみてください。

目次

オブジェクト変数または With ブロック変数が設定されていないとは?

実際に表示されるエラー画面は次の通りです。まずは自分の画面と同じか確認してみましょう。

VBAの実行時エラー91「オブジェクト変数または With ブロック変数が設定されていません」と表示されたエラー画面
実行時エラー91の表示画面。オブジェクト変数が設定されていない状態で処理が実行されるとこのエラーが出ます。

「オブジェクト変数または With ブロック変数が設定されていない」というエラーは、
VBAでは 実行時エラー 91 と呼ばれています。

このエラーは一言でいうと、

「使おうとしているものが、まだ準備されていない状態」

で発生します。

初心者の方にとっては、
「オブジェクト」「With ブロック」「変数」など、
聞き慣れない言葉が一気に出てくるため、
エラーメッセージ自体が分かりにくいのが特徴です。

ここでは、まず難しい言葉は置いておいて、
何が起きているのかをイメージで理解するところから見ていきましょう。


このエラーが出ているときの「状態」をイメージする

たとえば、次のような状況を想像してみてください。

  • まだ用意していない道具を使おうとした

  • 中身が入っていない箱を開けようとした

  • 誰もいない部屋に向かって話しかけた

Excel VBAでも、これとよく似たことが起きています。

プログラムの中で
「このシートを使う」
「このセルを操作する」
と指示しているつもりでも、

▶ 実際には「どれを使うのか」が決まっていない

この状態で処理を進めようとすると、
「オブジェクト変数または With ブロック変数が設定されていない」
というエラーが出ます。


数値の変数と「オブジェクトを扱う変数」の違い

VBAでは、変数には大きく分けて2種類あります。

  • 数値や文字を入れる変数

  • Excelの部品(セル・シートなど)を扱う変数

たとえば、次のようなコードは
初心者の方でも比較的なじみがあると思います。

Dim i As Long
i = 10

これは
「i という箱に、10 という数値を入れる」
という意味です。

一方で、セルやシートを扱う場合は、
「どのセルか」「どのシートか」をはっきり指定する必要があります。

もしここが曖昧なまま処理を進めると、
VBAは

「結局、どれを使えばいいの?」

と判断できず、エラーになります。


「設定されていない」とはどういうこと?

エラーメッセージに出てくる
**「設定されていない」**という言葉が、
初心者の方には少し分かりにくいポイントです。

これは、

  • 変数は宣言されている

  • でも、中身がまだ何も決まっていない

という状態を指しています。

コードは書いてあるのに、

  • 実際には使う対象が決まっていない

  • Excelのどこを操作するのか分からない

そんな「準備不足」のまま実行してしまうことで、
実行時エラー91が発生します。


なぜ初心者ほどこのエラーに遭遇しやすいのか

このエラーは、
VBAを始めたばかりの方ほど遭遇しやすいエラーです。

その理由は、

  • コードの意味を完全に理解する前に書いている

  • 動いたサンプルをコピーして使っている

  • 少し修正しただけで仕組みが変わってしまう

といった状況が重なりやすいためです。

逆に言えば、
エラーの仕組みが分かれば、そこまで怖いものではありません。

次の章では、
このエラーが実際に どんな原因で起きるのか
そして どう直せばよいのかを、
具体的なコード例を使って解説していきます。

通常の変数とオブジェクト変数の違いを整理しよう

VBAを始めたばかりの方の中には、

「変数の設定ミスって言われても、
いつもの変数と何が違うの?」

と感じた方もいるかもしれません。

ここで一度、
通常の変数オブジェクト変数の違いを整理しておきましょう。


通常の変数の例(Set は不要)

まずは、数値や文字を扱う「通常の変数」です。

Dim count As Long
count = 10
Dim msg As String
msg = "こんにちは"

これらは、

  • 数値

  • 文字

といった 「値そのもの」 を扱う変数です。

このタイプの変数では、

  • Dim で宣言して

  • = で値を代入

するだけで使うことができ、
Set は一切必要ありません。


オブジェクト変数の例(Set が必要)

次に、セルやシートなど
Excelの部品を扱う変数を見てみましょう。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim rng As Range
Set rng = ws.Range("A1")

こちらは、

  • ワークシート

  • セル(Range)

といった Excel上の「もの」 を扱っています。

このような変数は、

  • どのシートか

  • どのセルか

はっきり指定してあげないと使えません。

そのため、
オブジェクト変数では必ず Set を使って
「何を指しているのか」を設定します。


「Set が必要なのはオブジェクト変数だけ」

ここが一番大切なポイントです。

  • 通常の変数(数値・文字)
     ▶Set は不要

  • オブジェクト変数(セル・シートなど)
     ▶ Set が必要

実行時エラー91が出るのは、
この「オブジェクト変数」に関係している場合だけ
です。

通常の変数で、

  • 型を間違えた

  • タイプミスをした

といった場合は、
別のエラーが出ることが多く、
エラー91とは原因が異なります。

別のエラーとしては
型が一致しません(実行時エラー13)
などがあります。


この整理を知っておくと安心できる

最初にこの違いを知っておくことで、

  • 「全部の変数に Set が必要なの?」

  • 「どこまでがこのエラーの対象なの?」

といった不安を減らすことができます。

次の章では、
オブジェクト変数を使っているときに限って起こる
実行時エラー91の原因と対処法
を、
具体的なコードで解説していきます。


実行時エラー91が出る主な原因と具体的な対処法

ここからは、
「オブジェクト変数または With ブロック変数が設定されていない」
(実行時エラー91)が出る、具体的な原因と対処法を見ていきます。

難しく感じるかもしれませんが、
原因はある程度パターン化されているため、
順番に確認すれば必ず切り分けできます。


オブジェクトを使う準備ができていない(Set し忘れ)

まず最も多い原因が、
オブジェクトを使うための準備ができていないケースです。

たとえば、次のようなコードを見てください。

Dim ws As Worksheet
ws.Range("A1").Value = "テスト"
Setを指定せずにWorksheet変数を使用し実行時エラー91が発生しているコード画面
Worksheet変数を宣言しただけでSetしていないため、wsが未設定のまま使用されエラーになります。

一見すると問題なさそうに見えますが、
このまま実行すると 実行時エラー91 が発生します。

なぜなら、

  • ws という変数は宣言されている

  • しかし、「どのシートか」が決まっていない

からです。

このような場合は、
使う前に「どのシートか」をはっきり指定する必要があります。

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Range("A1").Value = "テスト"
SetでWorksheetを指定して実行時エラー91が解消されたVBAコード画面
Setで対象のシートを明示すると、正常にセルへ値を書き込めるようになります。

このように、
Set を使って対象を決めてから操作すれば、エラーは解消されます。

▶ポイント

  • 宣言(Dim)だけでは不十分

  • オブジェクトは「どれを使うか」まで指定して初めて使える


With ブロック内で対象が設定されていない

次に多いのが、
With ブロックの使い方が原因のケースです。

Dim ws As Worksheet
With ws 
 .Range("A1").Value = "テスト"
End With
With構文でオブジェクト変数が未設定のまま使用され実行時エラー91が発生しているコード画面
With構文は元となるオブジェクトが設定されていないと実行時エラー91になります。

このコードでも、実行時エラー91が発生します。

理由は先ほどと同じで、
ws がどのシートか決まっていないまま
With ブロックに入っているためです。

正しくは次のように書きます。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
With ws
 .Range("A1").Value = "テスト"
End With
SetでWorksheetを指定してWith構文が正常に動作しているVBAコード画面
事前にSetで対象を指定することで、With構文も正しく動作します。

With ブロックは便利ですが、
中で使う変数がきちんと設定されているか
事前に必ず確認しましょう。

※With ブロックは「省略記法」なので、
元になるオブジェクトが設定されていないと必ずエラーになります。

コードを修正したときの「変数名の変更漏れ」

VBAに少し慣れてくると、
コードをコピーして使い回したり、
変数名を分かりやすく変更したりする機会が増えてきます。

このときによくあるのが、
変数名の変更漏れです。

Dim wsMain As Worksheet
Set wsMain = ThisWorkbook.Worksheets("Sheet1")
ws.Range("A1").Value = "テスト"
変数名の変更漏れにより実行時エラー91が発生しているVBAコード画面
wsMainを設定しているのに、未設定のwsを使用しているためエラーが発生しています。

この例では、

  • wsMain という変数を宣言・設定している

  • しかし実際に使っているのは ws

というズレが起きています。

この場合、ws はどこにも設定されていないため、
実行時エラー91が発生します。

▶ 対処のコツ

  • 変数名を変更したら、必ず全体を確認する

  • 置換機能は「すべて置換」ではなく、1件ずつ目視がおすすめ

変数名の修正漏れを直して実行時エラー91が解消されたVBAコード画面
使用する変数名を統一することでエラーは解消されます。

条件分岐によって変数が設定されないままになるケース

If 文などの条件分岐が原因で、
特定の条件のときだけエラーが出るケースもあります。

Dim ws As Worksheet
If flag = True Then
 Set ws = ThisWorkbook.Worksheets("Sheet1")
End If
ws.Range("A1").Value = "テスト"
If分岐によりオブジェクト変数が設定されないまま実行時エラー91が発生しているVBAコード画面
条件によってはSetが実行されず、変数が未設定のままになるケースです。

このコードでは、

  • flag = True のとき → 正常に動く

  • flag = False のとき → エラー91が出る

という状態になります。

条件によっては
ws が設定されないまま処理が進んでしまうためです。

▶ 対処の考え方

  • すべての分岐で変数が設定されているか確認する

  • Else 側でも Set する or 処理を止める

ElseでExit Subを追加し未設定を防いで実行時エラー91を回避したVBAコード画面
Else側で処理を終了させることで、未設定のまま進まないようにできます。

Option Explicit でミスを未然に防ぐ

ここまで紹介したミスの多くは、
Option Explicit を使うことで早い段階で気づけます。

Option Explicit を設定すると、

  • 宣言していない変数

  • スペルミスした変数

をコンパイル時にエラーとして教えてくれます。

Option Explicit

VBA初心者の方ほど、
最初から入れておくのがおすすめです。

公式の解説は
Microsoft Learn
にも掲載されていますので、あわせて確認してみてください。
Option Explicit ステートメント |Microsoft Learn

Option Explicitを設定した状態で未宣言の変数を使用しコンパイルエラー「変数が定義されていません」と表示されているVBA画面
Option Explicitを有効にすると、宣言していない変数を使用した時点でコンパイルエラーになります。実行前にミスに気づけるのが大きなメリットです。
補足として、Option Explicitは「Setのし忘れ」そのものを防ぐ機能ではありません。
一方で、変数名のタイプミスや宣言漏れを事前に見つけられるため、エラー原因の切り分けが早くなります。

エラー91が出たときのチェックリスト

最後に、エラーが出たときの確認ポイントをまとめます。

  • 使っているオブジェクトは Set されているか

  • 変数名のタイプミス・変更漏れはないか

  • 条件分岐ですり抜けていないか

  • Option Explicit は設定されているか

この順番で確認すれば、
多くの場合は原因を特定できます。

まとめ|実行時エラー91は「準備不足」を落ち着いて確認すれば解決できる

「オブジェクト変数または With ブロック変数が設定されていない」
(実行時エラー91)は、VBA初心者の方が最初につまずきやすいエラーのひとつです。

ただし、このエラーは決して難しいものではなく、

  • オブジェクト変数が正しく設定されているか

  • Set を使って対象を指定しているか

  • 条件分岐や変数名の変更で、設定漏れが起きていないか

といったポイントを順番に確認するだけで、ほとんどの場合は原因を特定できます。

特に大切なのは、
「Set が必要なのはオブジェクト変数だけ」
という点を正しく理解することです。

数値や文字を扱う通常の変数では Set は不要であり、
このエラーは セルやシートなどを扱うときに限って発生する ものです。

エラーが出ると焦ってしまいがちですが、
チェックリストに沿って落ち着いて確認すれば、
VBAは少しずつ「読める」「直せる」ようになっていきます。

同じエラーで何度も悩まないためにも、
今回紹介した考え方をぜひ覚えておいてください。


FAQ|オブジェクト変数・実行時エラー91でよくある質問

Q1. VBAのエラー1004と実行時エラー91は何が違うのですか?

A. 原因となるポイントが異なります。

  • 実行時エラー91
    → オブジェクト変数が設定されていない状態で使われている

  • エラー1004
    → 操作対象はあるが、Excelの仕様上その操作ができない

どちらもよく出るエラーですが、
エラー91は「変数の準備不足」
1004は「操作内容の問題」
と考えると切り分けしやすくなります。


Q2. 実行時エラー91を回避する一番簡単な方法はありますか?

A. Option Explicit を必ず使うことです。

Option Explicit を設定しておくことで、

  • 宣言していない変数

  • スペルミスした変数

を実行前にエラーとして教えてくれます。

初心者の方ほど、
VBAを書くときは必ず最初に入れておくことをおすすめします。


Q3. VBAが廃止されるという話を聞きましたが、本当ですか?

A. 現時点で、Excel VBAがすぐに廃止される予定はありません。

確かに、新しい自動化手段(Office Scripts など)は登場していますが、
業務で使われているVBAが突然使えなくなることは考えにくい状況です。

ただし、

  • マクロのセキュリティ設定

  • Excelのアップデート

によって「急に動かなくなった」と感じるケースはあります。

その場合は、
VBA自体の廃止ではなく、環境や設定の問題を疑いましょう。


Q4. エクセルのマクロが急に使えなくなった原因は何ですか?

A. 以下のような原因が考えられます。

  • マクロのセキュリティ設定が変更された

  • Excelの更新で警告が表示されるようになった

  • コード修正時に変数の設定漏れが起きた

特に、
「一部だけコードを修正したあとに動かなくなった」
という場合は、実行時エラー91の可能性が高いです。


Q5. 通常の変数でも Set を書かないといけませんか?

A. いいえ、Set が必要なのはオブジェクト変数だけです。

  • 数値・文字の変数 → Set は不要

  • セル・シートなどのオブジェクト → Set が必要

この違いを押さえておけば、
不要な混乱を防ぐことができます。


Q6. エラー91が出たとき、最初に何を確認すればいいですか?

A. 次の順番で確認するのがおすすめです。

  1. オブジェクト変数が Set されているか

  2. 変数名のタイプミス・変更漏れがないか

  3. 条件分岐ですり抜けていないか

  4. Option Explicit が設定されているか

この順番で確認すれば、
多くの場合は原因にたどり着けます。

【関連記事】

 

※外部リンク※

※おすすめの動画講座 (PR)

オブジェクト変数やWorkbook/Worksheet操作を体系的に学びたい方には、こちらの講座がおすすめです。

※参考書籍 (PR)

※本ボックスにはアフィリエイトリンク(PR)が含まれます。
くわしくは プライバシーポリシー へ。

VBAで「オブジェクト変数または With ブロック変数が設定されていない」時の対処法|実行時エラー91を初心者向けに解説
最新情報をチェックしよう!