VBAのコードでよく見かける Nothing。「何もない」という意味はなんとなくわかるけど、実際にどう使うのかピンとこない方は多いと思います。
この記事でわかること:
Nothingはどんな変数に使えるのかIs Nothingでオブジェクトの未設定を確認する方法Set 変数 = Nothingでオブジェクトを解放する方法- 実務でよく使う
Nothingチェックのパターン
VBAの「Nothing」とは何かを理解するには?
Nothing は、オブジェクト型変数の「空の状態」を表す特別なキーワードです。数値型の初期値が 0、文字列型の初期値が ""(空文字)であるように、オブジェクト型変数の初期状態が Nothing です。
| データ型 | 初期値 |
|---|---|
| Long(数値) | 0 |
| String(文字列) | “”(空文字) |
| Boolean(真偽値) | False |
| Worksheet・Range などのオブジェクト型 | Nothing |
Nothing が使えるのは Workbook・Worksheet・Range・Object などのオブジェクト型変数だけです。数値や文字列の変数には使えません。
「Is Nothing」でオブジェクトの未設定を確認するには?
変数にオブジェクトがセットされているかどうかは、Is Nothing で判定できます。
Dim ws As Worksheet
If ws Is Nothing Then
MsgBox "シートが未設定です"
Else
MsgBox "シートは設定されています"
End If
ws を宣言しただけで何も代入していない場合、ws Is Nothing は True になります。未設定のまま ws.Range("A1") のような操作をしようとするとエラーになるため、事前に Is Nothing でチェックするのが安全です。
逆に「セットされているときだけ処理する」場合は Not を使います。
If Not ws Is Nothing Then
' wsに何かセットされているときだけ実行
ws.Range("A1").Value = "処理済"
End If
「Set 変数 = Nothing」でオブジェクトを解放するには?
処理が終わったあとに Set 変数 = Nothing と書くことで、変数が持っているオブジェクトへの参照を解放できます。
Dim wb As Workbook
Set wb = Workbooks.Open("C:¥データ.xlsx")
' 処理内容(省略)
Set wb = Nothing ' 解放
「解放」というのは「もうこの情報は覚えていなくていい」という指示をVBAに出すイメージです。使い終わった変数をそのままにしておくと、Excelの内部に不要な情報が残り続けることがあります。大きなファイルや長い処理では Nothing で解放しておくのが安全です。
実務での「Nothing」の活用パターンを知るには?
パターン1:変数が正しくセットされたか確認してから処理
Dim rng As Range
If rng Is Nothing Then
MsgBox "セル範囲が設定されていません"
Exit Sub
End If
rng.Font.Bold = True
未設定のまま処理を続けるとエラーになります。先にチェックして Exit Sub で止めるのが実務での定番パターンです。
パターン2:ループで条件に合う行を探して処理
Dim foundRow As Range
Dim i As Long
For i = 2 To 100
If Cells(i, 1).Value = "対象" Then
Set foundRow = Rows(i)
Exit For
End If
Next i
If Not foundRow Is Nothing Then
foundRow.Font.Bold = True
End If
条件に合う行が見つかった場合だけ foundRow がセットされます。最後に Is Nothing で確認することで「見つかった場合だけ処理する」が安全に書けます。
まとめ
Nothingはオブジェクト型変数の「空の状態」を表すキーワードIs Nothingで変数にオブジェクトがセットされているか確認できるNot … Is Nothingでセットされているときだけ処理する書き方ができるSet 変数 = Nothingで処理後にオブジェクトを解放できる- 未設定のオブジェクト変数を使おうとするとエラーになるため、
Is Nothingチェックが安全策になる
よくある質問
Nothing は数値型や文字列型の変数にも使えますか?
使えません。Nothing はオブジェクト型変数専用です。数値型には 0、文字列型には "" が初期値なので、それぞれの型に合った比較をする必要があります。
Set 変数 = Nothing は必ず書かないといけませんか?
必須ではありません。マクロが終了すれば変数は自動的に解放されます。ただしループ内で大量のオブジェクトを扱う場合や、長時間動き続けるマクロでは明示的に解放しておくとメモリ効率が改善します。
Is Nothing の「Is」は何のためにありますか?
オブジェクト同士の比較には = ではなく Is を使います。ws = Nothing と書くとエラーになります。オブジェクト変数の比較は常に Is・Is Not を使う、と覚えておきましょう。
宣言しただけの変数(何もSetしていない)は Nothing ですか?
はい、オブジェクト型変数は宣言した時点で自動的に Nothing の状態になっています。なにかSetするまでは Is Nothing が True を返します。
FindメソッドでセルをRangeに入れたのに Nothing になることがあります。なぜですか?
Find は検索対象が見つからなかった場合に Nothing を返します。そのため Find の結果を変数に入れたあとは必ず Is Nothing でチェックしてから処理するのが定番の書き方です。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



