本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。
VBAでマクロを実行したときに、
「オブジェクト変数または With ブロック変数が設定されていません」
というエラーメッセージが表示されて、思わず手が止まってしまった経験はありませんか?
特にVBAを始めたばかりの頃は、
「どこが間違っているのか分からない」
「さっきまで動いていたはずなのに急にエラーが出た」
と、原因がつかめず焦ってしまいがちです。
このエラーは、実行時エラー91とも呼ばれ、
オブジェクト変数の設定ミスやタイプミス、コードの使い回しなど、
初心者がつまずきやすいポイントで非常によく発生します。
実際、このエラーは
- 変数の設定がうまくできていなかった
- コードを修正した際に、一部だけ直し忘れていた
- 特定の条件のときだけ、想定と違う動きをしていた
といった、初心者の方がつまずきやすい「ちょっとしたミス」が
原因になっているケースがほとんどです。
この記事では、
「オブジェクト変数または With ブロック変数が設定されていない」エラーが出る理由と、
初心者の方でも順番に確認できる具体的な対処法を、サンプルコードを交えながら分かりやすく解説します。
「VBAは難しそう」「自分には向いていないかも…」と感じている方でも、
エラーの正体が分かれば、落ち着いて対応できるようになります。
同じエラーで何度も悩まないためにも、ぜひ最後までチェックしてみてください。
オブジェクト変数または With ブロック変数が設定されていないとは?
実際に表示されるエラー画面は次の通りです。まずは自分の画面と同じか確認してみましょう。

「オブジェクト変数または 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 = "テスト"

一見すると問題なさそうに見えますが、
このまま実行すると 実行時エラー91 が発生します。
なぜなら、
-
wsという変数は宣言されている -
しかし、「どのシートか」が決まっていない
からです。
このような場合は、
使う前に「どのシートか」をはっきり指定する必要があります。
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Range("A1").Value = "テスト"

このように、Set を使って対象を決めてから操作すれば、エラーは解消されます。
▶ポイント
-
宣言(Dim)だけでは不十分
-
オブジェクトは「どれを使うか」まで指定して初めて使える
With ブロック内で対象が設定されていない
次に多いのが、
With ブロックの使い方が原因のケースです。
Dim ws As Worksheet
With ws
.Range("A1").Value = "テスト"
End With

このコードでも、実行時エラー91が発生します。
理由は先ほどと同じで、ws がどのシートか決まっていないまま
With ブロックに入っているためです。
正しくは次のように書きます。
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
With ws
.Range("A1").Value = "テスト"
End With

With ブロックは便利ですが、
中で使う変数がきちんと設定されているかを
事前に必ず確認しましょう。
元になるオブジェクトが設定されていないと必ずエラーになります。
コードを修正したときの「変数名の変更漏れ」
VBAに少し慣れてくると、
コードをコピーして使い回したり、
変数名を分かりやすく変更したりする機会が増えてきます。
このときによくあるのが、
変数名の変更漏れです。
Dim wsMain As Worksheet
Set wsMain = ThisWorkbook.Worksheets("Sheet1")
ws.Range("A1").Value = "テスト"

この例では、
-
wsMainという変数を宣言・設定している -
しかし実際に使っているのは
ws
というズレが起きています。
この場合、ws はどこにも設定されていないため、
実行時エラー91が発生します。
▶ 対処のコツ
-
変数名を変更したら、必ず全体を確認する
-
置換機能は「すべて置換」ではなく、1件ずつ目視がおすすめ

条件分岐によって変数が設定されないままになるケース
If 文などの条件分岐が原因で、
特定の条件のときだけエラーが出るケースもあります。
Dim ws As Worksheet
If flag = True Then
Set ws = ThisWorkbook.Worksheets("Sheet1")
End If
ws.Range("A1").Value = "テスト"

このコードでは、
-
flag = Trueのとき → 正常に動く -
flag = Falseのとき → エラー91が出る
という状態になります。
条件によってはws が設定されないまま処理が進んでしまうためです。
▶ 対処の考え方
-
すべての分岐で変数が設定されているか確認する
-
Else 側でも Set する or 処理を止める

Option Explicit でミスを未然に防ぐ
ここまで紹介したミスの多くは、
Option Explicit を使うことで早い段階で気づけます。
Option Explicit を設定すると、
-
宣言していない変数
-
スペルミスした変数
をコンパイル時にエラーとして教えてくれます。
VBA初心者の方ほど、
最初から入れておくのがおすすめです。
公式の解説は
Microsoft Learn
にも掲載されていますので、あわせて確認してみてください。
▶Option Explicit ステートメント |Microsoft Learn

一方で、変数名のタイプミスや宣言漏れを事前に見つけられるため、エラー原因の切り分けが早くなります。
エラー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. 次の順番で確認するのがおすすめです。
-
オブジェクト変数が
Setされているか -
変数名のタイプミス・変更漏れがないか
-
条件分岐ですり抜けていないか
-
Option Explicit が設定されているか
この順番で確認すれば、
多くの場合は原因にたどり着けます。
【関連記事】
- VBAの書き方で失敗しないために|読みやすくて修正しやすい変数・コメント・構造のコツ
- マクロのステップインとは?初心者でもわかるVBAのデバッグ基本操作を解説
- 【Excel VBA】イベントでエラーが出るときの原因と対処法まとめ|SelectionChangeとChangeの違いも解説
※外部リンク※
- オブジェクト変数またはブロック変数が設定されていない |Microsoft Learn
- 変数を宣言する |Microsoft Learn
- Option Explicit ステートメント |Microsoft Learn
※おすすめの動画講座 (PR)※
オブジェクト変数やWorkbook/Worksheet操作を体系的に学びたい方には、こちらの講座がおすすめです。
※参考書籍 (PR)※
- 【Excel VBAのエラーを直す本 なぜ、あなたのVBAはスムーズに動かないのか?】(Amazon)
- 【できるExcel マクロ&VBA Copilot対応】(Amazon)
- 【世界でいちばん簡単な ExcelVBAのe本[最新第4版]】(Amazon)
※本ボックスにはアフィリエイトリンク(PR)が含まれます。
くわしくは プライバシーポリシー へ。
