VBAのNothingとは|Is Nothing・Not Is Nothing・Set変数=Nothingの使い方

VBAのコードでよく見かける Nothing。「何もない」という意味はなんとなくわかるけど、実際にどう使うのかピンとこない方は多いと思います。

この記事でわかること:

  • Nothing はどんな変数に使えるのか
  • Is Nothing でオブジェクトの未設定を確認する方法
  • Set 変数 = Nothing でオブジェクトを解放する方法
  • 実務でよく使う Nothing チェックのパターン

VBAの「Nothing」とは何かを理解するには?

Nothing は、オブジェクト型変数の「空の状態」を表す特別なキーワードです。数値型の初期値が 0、文字列型の初期値が ""(空文字)であるように、オブジェクト型変数の初期状態が Nothing です。

データ型初期値
Long(数値)0
String(文字列)“”(空文字)
Boolean(真偽値)False
Worksheet・Range などのオブジェクト型Nothing

Nothing が使えるのは WorkbookWorksheetRangeObject などのオブジェクト型変数だけです。数値や文字列の変数には使えません。

「Is Nothing」でオブジェクトの未設定を確認するには?

変数にオブジェクトがセットされているかどうかは、Is Nothing で判定できます。

Dim ws As Worksheet

If ws Is Nothing Then
    MsgBox "シートが未設定です"
Else
    MsgBox "シートは設定されています"
End If

ws を宣言しただけで何も代入していない場合、ws Is NothingTrue になります。未設定のまま 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 と書くとエラーになります。オブジェクト変数の比較は常に IsIs Not を使う、と覚えておきましょう。

宣言しただけの変数(何もSetしていない)は Nothing ですか?

はい、オブジェクト型変数は宣言した時点で自動的に Nothing の状態になっています。なにかSetするまでは Is NothingTrue を返します。

FindメソッドでセルをRangeに入れたのに Nothing になることがあります。なぜですか?

Find は検索対象が見つからなかった場合に Nothing を返します。そのため Find の結果を変数に入れたあとは必ず Is Nothing でチェックしてから処理するのが定番の書き方です。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール