TL;DR —
Nothingは 空の参照 の状態です。つまり、どのオブジェクトも指していないオブジェクト変数 のこと。判定はIf x Is Nothing—Is演算子を使い、素の=は決して使いません。オブジェクトは=では比較できないからです。Set x = Nothingは参照を解放します。すべてのオブジェクト変数はNothingとして 始まり、まだNothingのまま使ってしまうことが、実行時エラー 91、Object variable or With block variable not set の源になります。
Sub NothingBasics()
Dim ws As Worksheet ' Nothing から始まる - どのシートも指していない
Set ws = FindSheet("Data") ' Nothing を返すことがある関数
If ws Is Nothing Then ' = ではなく Is(ここで素の = はコンパイルできない)
MsgBox "Sheet not found"
Exit Sub
End If
ws.Range("A1").Value = 1
Set ws = Nothing ' 参照を解放する
End Sub
Nothing はオブジェクトのライフサイクルにおける「解放」の段階です。オブジェクトを
New で作り、Set で変数をそこへ向け、Nothing で参照を手放し
ます。これはまた、すべてのオブジェクト変数の 出発点 の状態でもあります — だからこそ、Set していない
オブジェクトは破裂するのです。
この記事で学べること
- 考え方の軸 —
Nothingは 空のポインタ、どのオブジェクトにも付いていないラベルである - なぜ
If x Is Nothingで判定しなければならず、If x = Nothingでは決してだめなのか - 最もよくある実用 —
Nothingを返したFindや検索を守る Set x = Nothingが実際に効くときと、無害な儀式にすぎないときNothingがEmpty・Null・""とどう違うか(互いに置き換えられない)
考え方の軸:空のポインタ
オブジェクト変数が実体を指すラベルなら、Nothing はそのラベルが どこも 指していない状態です。ゼロで
も、空文字列でも、「空白」でもありません — それらは 値 を表します。Nothing は、向こう側にオブジェク
トを持たない 参照 の、特定の状態なのです。
すべてのオブジェクト変数はそこから始まります。Dim ws As Worksheet と書いた瞬間、ws は Nothing で
す。Set が本物のシートへ向けるまで Nothing のままです。この一つの事実が、実行時エラー 91 を説明しま
す。オブジェクト変数を Set する 前に 使えば、Nothing の中身を取り出そうとしていることになり —
Object variable or With block variable not set です(Set を参照)。Nothing は、
参照が生まれる場所であり、解放したときに帰っていく場所でもあります。
Is Nothing で判定する、= Nothing では決してしない
これは、誰もが一度ははまる罠です。参照が空かどうかを = でテストすることはできません。
If ws = Nothing Then ' 誤り - コンパイルできない / 型エラー
If ws Is Nothing Then ' 正しい - Is は値ではなく同一性を比べる
= は「この二つの 値 は等しいか?」と問い、そう比べるには既定値が要ります — だからこそ Range("A1") = 5
は動くのに ws = Nothing は動かないのです。Is は別のことを問います。「この二つのラベルは 同じ オブジ
ェクトを(あるいは、どちらも何も)指しているか?」。Nothing かどうかの判定、あるいは二つの変数が同じオブ
ジェクトを参照しているかの確認は 同一性 の問いなので、Is を使います。逆を判定するには、こう包みます。
If Not ws Is Nothing Then。
最もよくある実用:Nothing を返した Find を守る
実際のマクロで Nothing が現れる最も多い場所は、検索の結果です。Range.Find は一致が見つからないと
Nothing を返します — そしてその結果に .Row で手を伸ばせば、まっすぐ実行時エラー 91 です。
Dim hit As Range
Set hit = ws.Columns("A").Find(What:="Total", LookAt:=xlWhole)
If hit Is Nothing Then ' 実行時エラー 91 を防ぐ防御
MsgBox "No 'Total' row found"
Exit Sub
End If
MsgBox "Found in row " & hit.Row ' 安全 - hit が実在するセルを指しているとわかっている
「見つからないかもしれない」あらゆる API — Find、ヘルパーに包んだ Dictionary の検索、オブジェクトを
返す関数 — は、Nothing を手渡してくることがあります。あなたを救う習慣はこれです。代入が Nothing を
生みうるときは、結果を使う前に Is Nothing を判定する。
Set x = Nothing が実際に効くとき
多くのチュートリアルが飛ばす、正直な答えがこれです。ふつうのローカルなオブジェクト変数について、Sub の
末尾での Set x = Nothing はたいてい 冗長 です。VBA は、変数が手続きの終わりでスコープを外れると、ロ
ーカルなオブジェクト参照を自動的に解放します。先に Nothing にしておくのは無害ですが、必要ではなく儀式
です。
本当に効くのは、次の三つの場合です。
- 循環参照。 オブジェクト A が B への参照を持ち、B が A への参照を持ち返すと、互いを生かし続けて、
Subが終わっても回収されません。明示的にSet A.Partner = Nothingとして循環を断ち切れば、両方を解 放できます。 - モジュールレベル・グローバル・
Staticのオブジェクト変数。 これらは、値を入れた手続きより長く生き るので、オブジェクト — そしてそれがロックしている Excel のリソース — を、解放するかブックを閉じるまで抱 え込みます。使い終わったら意図して解放しましょう。 - 外部アプリケーションのオブジェクト。 自分で作った
Outlook.ApplicationやWord.Applicationは、そ れへの参照がすべてNothingになるまでバックグラウンドで動き続けます。相手のプログラムが閉じられるよう、 すみやかに解放しましょう。
原則はこうです。参照が長生きだったり共有されていたりする場所では意図して解放する。すべてのローカル変数
に Set x = Nothing をおまじないのように付けて回らない。
Nothing は Empty・Null・空文字列とは違う
英語がひとまとめにするせいで、四つの異なる「空っぽさ」が人をつまずかせます。VBA はこれらを厳密に区別しま す。
Nothing— どのオブジェクトも指していない オブジェクト 参照(If obj Is Nothing)。Empty— 一度も代入されていない 未初期化のVariant(If IsEmpty(v))。Null— 「有効なデータがない」を意図的に保持するVariant。多くはデータベースのフィールド由来です (If IsNull(v))。""— 長さ 0 のString。空ではあっても本物の文字列です(If s = "")。
これらは互いに置き換えられず、それぞれ専用のテストを持ちます。Variant に Is Nothing を使ったり、オブ
ジェクトに IsNull を使ったりしても、期待どおりには動きません。Nothing はオブジェクト専用です — 参照
のためだけにとっておきましょう。
ExcelMaster の活用
Nothing はオブジェクトの一生の両端に座っていて、そのまわりの誤りはどれも見逃しやすい形で失敗します。コ
ンパイルできない = Nothing、守りなしに使って 91 を投げる Find の結果、参照が一度も解放されずに動き続
ける外部アプリ、といった具合です。
ExcelMaster は、その防御をあなたの代
わりに書きます — どの検索のあとにも If Not hit Is Nothing Then を置き、あらゆる同一性の判定に Is を使
い、Set x = Nothing をすべてのローカルにばらまくことなく、本当に解放の要る長生きの参照や外部の参照を解
放します。あなたは望む結果を伝えるだけ。ライフサイクルはこちらが引き受けます。ブックとコードはあなたの手
元に残ります。
よくある質問
VBA の Nothing とは何を意味しますか?
Nothing は、オブジェクト変数の空の参照の状態です — 変数がどのオブジェクトも指していないということ。すべ
てのオブジェクト変数は、Set が一つ与えるまで Nothing として始まり、Set x = Nothing はそれをその状
態へ戻します。オブジェクトにのみ当てはまり、値には当てはまりません。
If x = Nothing が使えないのはなぜですか?
= は 値 を比べるものであり、オブジェクト参照には比べる値がないからです — なので If x = Nothing はコ
ンパイルに失敗するか、型エラーを起こします。代わりに同一性の演算子を使いましょう。If x Is Nothing。逆
を判定するなら If Not x Is Nothing と書きます。
マクロの最後でオブジェクトを Nothing に Set する必要はありますか?
たいていは要りません。VBA は手続きが終わるとローカルなオブジェクト変数を自動的に解放するので、ふつうのロ
ーカルに対する Set x = Nothing は無害な儀式です。ただし、循環参照、手続きより長く生きるモジュールレベ
ルやグローバルのオブジェクト変数、そしてすみやかに解放すべき Outlook.Application のような外部アプリケー
ションのオブジェクトについては、確かに意味があります。
Find や検索が何も返さなかったかを確かめるには?
使う前に結果を Is Nothing で判定します。Set hit = ws.Columns("A").Find("Total") としてから、If hit Is Nothing Then ... Exit Sub です。Range.Find は一致がないと Nothing を返し、Nothing の結果に
.Row で触れると実行時エラー 91、Object variable or With block variable not set を起こします。
Nothing・Empty・Null・空文字列の違いは?
Nothing はどのオブジェクトも指していないオブジェクト参照、Empty は未初期化の Variant、Null は多く
はデータベース由来の「有効なデータがない」を保持する Variant、"" は長さ 0 の String です。これらは別
個の状態で、別個のテスト(Is Nothing・IsEmpty・IsNull・= "")を持ち、互いに置き換えられません。
検証環境
動作確認: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-19.
関連ガイド: VBA Set · VBA New · VBA Dim · VBA CreateObject · VBA With
