皆さんは、VBAでオブジェクト変数の値を設定・クリアする方法を知っていますか?
ブック、シート、セルなどのオブジェクトを変数にして処理を作るとき、使わなくなった変数はオブジェクトを解放しないと余計なメモリを使ってしまいます。
そのため、オブジェクト変数の値を設定・クリアする方法を覚えておくと便利です!
そこで今回は、
・「Nothing」を使ってオブジェクトの状態を空にする方法
といった基礎的なことから、
・If文 & Is演算子を使ってNothingを判定する方法
・【よくある議論】「Set obj = Nothing」でメモリの解放はすべきか?
といった応用的な方法まで、徹底的に解説します!
Nothingとは?
VBAでオブジェクトの変数を扱うときは、参照型で値をセットします。
「Set 変数名 = セットするオブジェクト」のように値を入れるのですが、使わなくなったタイミングでオブジェクトを解放しないと、メモリを余計に使い続けてしまうんですよね。
このような時に、オブジェクト解放する方法が「Nothing」です。
使い方:
Set 変数名 = Nothing
Nothingをオブジェクト変数にセットすることで、オブジェクトを解放することができます。
Nothingを使ったオブジェクト解放方法については以下で詳しく解説しているので、気になる方は見てみてくださいね!
If文 & Is演算子を使ってNothingを判定する方法
ここまでオブジェクト変数を解放する方法を解説しましたが、変数を使って処理を作るときは、オブジェクトの変数の状態(値が入っている or Nothing)を意識して作っていくケースが圧倒的に多いです。
そのため、オブジェクト変数の状態を確認する方法を覚えておくのがおすすめです!
オブジェクト変数が「Nothing」のときの処理を作る方法
『オブジェクト変数が「Nothing」のときの処理を作る方法』と読んで、次のように書くことを想像した方もいるのではないでしょうか?
Sub Test() Dim wsObj As Worksheets Set wsObj = Nothing If wsObj = Nothing Then MsgBox "【wsObj】の値は【Nothing】です!" End If End Sub
一見あっているかのように見えますが、このコードだとエラーが出てしまいます。
実行結果:
条件を判定するIf文で、「If wsObj = Nothing Then」のように書いて条件を判定しようとしていますが、オブジェクト変数でNothingを判定するときは「Is演算子」を使って次のように書かなければなりません。
Sub Test() Dim wsObj As Worksheets Set wsObj = Nothing If wsObj Is Nothing Then MsgBox "【wsObj】の値は【Nothing】です!" End If End Sub
実行結果:
慣れないうちは大変かもしれませんが、「オブジェクト変数とIs演算子はセット」で覚えるのがおすすめです!
オブジェクト変数に値が入っているときの処理を作る方法
「オブジェクト変数がNothingのときの処理」と同じぐらい、オブジェクト変数に値が入っているときの処理を作るケースはよくあります。
というか、「オブジェクト変数に値が入っているとき」の処理を作るケースの方が多いですね。
そのため、「オブジェクト変数に値が入っているときの処理を作る方法」を覚えておくのがおすすめです!
使い方は簡単で、先ほどのIf文で使ったIs演算子の条件の前に、Not演算子を付けるだけです。
わかりやすくするために、先ほどの処理とNot演算子を使ったときサンプルを用意しました。
サンプル:
'Nothingだったときの処理 If オブジェクト変数 Is Nothing Then '処理 End If '値が入っていたときの処理 If Not オブジェクト変数 Is Nothing Then '処理 End If
Not演算子をIf文の条件の最初につけるだけなので、合わせて覚えておくと便利です!
補足:「Set obj = Nothing」でメモリの解放はすべきか?
ここまでオブジェクト変数を解放する方法・状態を意識して処理を分ける方法などを解説してきましたが、、、VBA界隈では、オブジェクト変数の解放をいつやればいいの?といった議論がよくされています。
ここからは補足なのですが、以下を意識してオブジェクト解放する処理を作っておけばOKです!
・オブジェクト変数は使わなくなったタイミングで、「Nothing」する
・End Subのタイミングで自動的にNothingされるので、最後まで使う場合は「Nothing」しなくても良い
ネットで調べていると稀に、処理の最後で全てのオブジェクト変数をまとめて「Nothing」している次のようなコードを見かけますが、全く意味がありません。
Sub Test1() 'オブジェクト変数をセット Dim wsObj1 As Range Dim wsObj2 As Range Dim wsObj3 As Range Dim wsObj4 As Range Set wsObj1 = Range("A1") Set wsObj2 = Range("B1") Set wsObj3 = Range("C1") Set wsObj4 = Range("D1") 'オブジェクト変数を使う何らかの処理 wsObj1.Value = "ほげほげ" wsObj2.Value = "ふがふが" wsObj3.Value = "ほげほげ" wsObj4.Value = "ふがふが" 'オブジェクトを解放する意味のないコード Set wsObj1 = Nothing Set wsObj2 = Nothing Set wsObj3 = Nothing Set wsObj4 = Nothing End Sub
なぜなら、処理の最後の「End Sub」で自動的にオブジェクトが解放されるからです。
そのため、「使い終わったタイミングでNothingをセット・最後まで使った変数はNothing不要」と頭の片隅に入れておくと、わかりやすく無駄のないコードが書けるのでおすすめです!
まとめ
今回は、VBAのNothingの使い方について基礎から徹底的に解説しました。
オブジェクト変数を使うケースはとても多いので、覚えておくのがおすすめです!
使い方も簡単なので、実際にコードを書いて試してみてくださいね!