昨日まで快適に動いていたマクロがあります。それが突然エラーを吐いて止まりました。メッセージは「オブジェクト変数が設定されていません」です。初心者には少し冷たく感じる文言でしょう。実は私も、このエラーに何度泣かされたか分かりません。何が原因なのか分からず、溜息をつく日々がありました。しかし、このエラーの正体は、実はとてもシンプルなのです。それは「中身が空っぽの箱を、無理やり使おうとしている状態」を指しています。そこで今回は、実務でのエラー遭遇時を振り返ります。私が真っ先に見直すポイントを整理しました。この記事を読めば、エラー91の正体を突き止められます。
そして冷静に対処できるようになるはずです。
オブジェクト変数エラーの盲点
その日も出社して、いつものようにボタンを押しただけでした。しかし、画面には無情にも黄色いハイライトが浮かびます。実行時エラー91の文字が表示されました。実は、前日まで完璧に動作していたプログラムだったのです。そのため、最初は自分の目を疑いました。パソコンが壊れたのかとさえ思ったほどです。ところが、原因を調べていくと少しの環境変化が影響していました。具体的には、読み込むファイルの名前が微妙に変わっていたのです。すると、プログラムは指定された場所を見つけられません。中身が空の状態で処理を続けようとします。その結果として、このエラーが発生していました。
そこで私は、エラーメッセージの「オブジェクト変数」に注目します。これはVBAにおいて、セルやシートなどの「モノ」を指す言葉です。つまり、何らかの「モノ」を操作しようとしたわけです。しかし、その「モノ」が実際には存在しなかったという意味になります。この基本を理解するだけで、原因探しの視界がぱっと開けました。
マクロ停止、まさかの1文字違い
前日まで普通に動いていたマクロがあります。共有フォルダのファイル構成を変えただけで止まりました。エラー画面が出て非常に驚きました。何が悪いのか見当もつきません。コードを1時間書き換え続けました。実は参照先のパスが1文字違っていただけだったのです。解決した瞬間にどっと疲れが出たのを覚えています。

VBA Set忘れ エラー91
VBAを書き始めた人が最初につまずくのが、この「Set」というキーワードです。実は、数値や文字を変数に入れるときには「Set」は必要ありません。しかし、セルやシートを代入するときにはルールが変わります。必ず「Set」を書かなければならないのです。ところが、忙しくコードを書いていると、ついこの三文字を忘れてしまいます。たとえば、変数に特定のセルを覚えさせようとしたときです。ただのイコールだけで繋いでしまうことがあるでしょう。すると、VBAは「それはオブジェクトの代入ではない」と判断します。その結果、変数は空っぽのまま残ってしまいます。
後の処理でエラー91を引き起こす原因になるのです。そこで、もしエラーが出たら代入部分を確認してください。まずは「Set」があるかを見直しましょう。実は、私も未だにこのミスをすることがあります。なぜなら、他の言語ではあまり見かけない独特のルールだからです。だからこそ、意識的にチェックする習慣をつけることが大切でしょう。また、複数の変数を使っている場合は原因の特定が必要です。どの行で代入に失敗したかを探らなければなりません。実は、代入そのものの行ではエラーが出ません。
Set忘れ発覚までの30分
私の場合、このSet忘れに気づくまでに30分ほどかかってしまいました。

ここで一度立ち止まって考えてみてください
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。現役エンジニアのサポートで、未経験から実践的なスキルを身につけられます。
FindメソッドのNothing対策
特定の文字を検索する「Findメソッド」は、実務で非常に便利な機能です。しかし、これがエラー91の温床になりやすい場所でもあります。実は、検索した文字が見つからなかった場合に問題が起きます。Findメソッドは「Nothing」を返すのです。つまり、「何も見つかりませんでした」という結果を返します。ところが、私はその結果を確認せずに処理を進める癖がありました。すぐ次のコードを書いてしまっていたのです。たとえば、見つかったセルの色を変えるコードを直接繋げて書きました。すると、文字が見つからなかった場合に命令が矛盾します。「空っぽの場所の色を変えろ」
という指示になってしまうのです。これこそが、エラーが発生する典型的なパターンでしょう。そこで重要なのが、「もし見つかったら」という条件分岐を入れることです。実は、この一手間を加えるだけでマクロの安定性は格段に向上します。具体的には、「If Not 変数 Is Nothing Then」を使います。
Findメソッドの脆弱性と条件判定の教訓
Findメソッドの結果を使ってセルの値を書き換えようとしました。検索に失敗した瞬間にエラーが出たのです。検索対象のリストに1文字でも誤字があると止まります。とても脆弱なコードだったことに気づきました。解決までに数時間を費やしてしまいます。その後は必ず条件判定を入れるようにしました。

Withブロック外のドットエラー
コードをスッキリさせるために便利な「With」ステートメントがあります。しかし、ここにも大きな落とし穴が存在します。Withで指定した範囲の外で、コードを書いてしまうミスです。うっかり「.(ドット)」から始まる文を入れてしまうことがあります。すると、VBAはそのドットが何を指しているのか理解できません。その結果、「Withブロック変数が設定されていません」というメッセージが出ます。そしてエラー91を引き起こしてしまうのです。実は、私もコードを整理しているときにこのミスをよくやります。コピー&ペーストを繰り返していると起こりがちです。
たとえば、シートを指定するWithブロックを閉じた後を想像してください。その中の処理を一行だけ外に出してしまった場合です。ドット一つで繋がっているため、見た目には正しいように見えてしまいます。しかし、VBAにとっては親が誰だか分からない迷子のような状態なのです。そこで対策として、End Withの場所を常に意識することが大切になります。
インデントに泣いた30分
Withブロックの中だと思い込んで記述していた行がありました。実はEnd Withのすぐ下にあったのです。見た目は綺麗に並んでいたので気づくのが遅れました。30分ほど画面を睨み続けてしまいます。インデントのズレを直した瞬間に自分のミスだと気づきました。非常に情けなくなったのを覚えています。
オブジェクトの寿命と変数エラー
変数がエラーを起こすもう一つの理由は、その「モノ」が消えてしまった場合です。実は、一度Setで変数に代入したシートであっても注意が必要です。そのファイルを閉じれば変数は無効になってしまいます。ところが、私はファイルを閉じた後に操作をしようとしてしまうことがありました。その変数を使って何かを処理しようとしたのです。たとえば、集計が終わったからファイルを閉じたとします。そして最後に「完了」と書き込もうとしたときです。すると、既に存在しないシートを操作しようとしてしまいます。その結果として、またしてもエラーが発生するのです。
実は、これはメモリ上に変数の名前だけが残っている状態です。中身へのリンクが完全に切れてしまっています。そこで、処理の順番を今一度見直してみる必要があるでしょう。もしファイルを閉じる処理があるなら、書き込みの完了を確かめてください。閉じる前に全ての操作が終わっているべきなのです。また、外部のアプリケーションを操作している場合も同様のことが起きます。実は、ブラウザやメールソフトのオブジェクトも同じです。終了させれば変数は Nothing になってしまいます。だからこそ、オブジェクトの寿命を意識することが非常に重要になります。
ファイル開閉マクロの落とし穴
複数のファイルを開いて閉じる処理を含むマクロほど、このミスが起きやすいと感じました。
エラー91も即解決!ローカルウィンドウ
エラー91に立ち向かうための最強の武器は、実は「ローカルウィンドウ」です。VBAエディタの「表示」メニューから、いつでも呼び出すことができます。実は、これを使えば変数の中身をリアルタイムで覗き見ることができるのです。ところが、この機能を知らずにデバッグしている人が意外と多いです。メッセージボックスだけで確認を済ませてしまいます。そこで私は、エラーが出たらすぐにローカルウィンドウを開くよう推奨しています。画面の下の方に表示されるこの窓には、現在使っている変数が一覧で並ぶ仕組みです。そして、その右側にある「値」の列をチェックしてみてください。
もし「Nothing」と書いてあれば原因は明らかです。それがエラーを引き起こしているに違いありません。実は、何が原因で空になっているのかを突き止めるヒントもここに隠されています。たとえば、オブジェクトを展開していくとプロパティがずらりと表示されます。中身が空であれば、展開することすらできません。これを確認するだけで、頭の中で悩む時間は大幅に短縮されるでしょう。
ローカルウィンドウでデバッグ作業が数倍速に
実は、私もローカルウィンドウを常用するようになってから変化がありました。デバッグ作業が数倍速くなったのです。だからこそ、食わず嫌いせずに一度使ってみてほしい機能の一つと言えます。操作は非常に簡単で、コードを一行ずつ実行する「F8キー」と組み合わせるだけです。

Nothing理解と粘り強さでエラーを克服
以前の私は、エラーが出るたびに「自分は才能がないんだ」と落ち込んでいました。しかし、Nothingという概念を正しく理解してからは考え方が変わります。エラーは「このままだとプログラムが壊れるから止まったよ」という合図だと思えるようになったのです。そこで、コードを書く際に「もしNothingだったら?」と事前に想定する癖をつけました。すると、予期せぬエラーでマクロが止まることが劇的に減ったのです。たとえば、シートが見つからない場合に、エラーで止まるマクロは不便です。「シートがありません」と優しく教えてくれる仕組みの方が安心できます。
今では私も、エラーが出ても冷静に対処できます。「あそこのSetを忘れたかな」と笑えるようになりました。そこで皆さんも、エラーを敵だと思わずに接してみてください。自分を成長させてくれるパートナーだと思うことが大切です。
Is Nothingの判定を入れるようになってから、原因不明のエラーで止まることがかなり減りました。

VBA習得は粘り強さ
実は、VBAの習得に一番必要なのは専門知識ではありません。何よりも「粘り強さ」が求められるのです。そして、このエラーを自分の力で解決できたとき、その粘り強さが本物に変わります。これからも、一歩ずつ自分のペースでコードを書き続けていきましょう。
無料プレゼント
Excel業務を自動化する前に確認するチェックリスト(PDF)
自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。
¥980 ミニキット
コピペで動かせる3スクリプト+自動化チェックリスト
最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。
関連リンクとチェックリスト
関連記事
VBAの実行時エラーは91番だけではありません。「型が一致しません」というエラーで悩んでいる場合は、次の記事もあわせて読むと整理しやすいです。
関連書籍
Excel・VBA関連書籍を、手元で見返せる形にしておきたい場合
ExcelやVBAのトラブルは、基本の考え方をあとから見返せるだけでかなり楽になります。手元に1冊置いておくと、同じエラーで止まったときに確認しやすいです。
学習サービスとアンケート
このスキルを活かしてさらに前へ進むなら
PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。
[アンケート] この記事は役に立ちましたか?

