スライドショー

【ExcelVBA】Nothingの設定方法・If文で条件分岐する方法を徹底解説!

皆さんは、VBAでオブジェクト変数の値を設定・クリアする方法を知っていますか?

ブック、シート、セルなどのオブジェクトを変数にして処理を作るとき、使わなくなった変数はオブジェクトを解放しないと余計なメモリを使ってしまいます。

そのため、オブジェクト変数の値を設定・クリアする方法を覚えておくと便利です!

そこで今回は、

・「Nothing」を使ってオブジェクトの状態を空にする方法

といった基礎的なことから、

・If文 & Is演算子を使ってNothingを判定する方法

・【よくある議論】「Set obj = Nothing」でメモリの解放はすべきか?

といった応用的な方法まで、徹底的に解説します!

Nothingとは?

VBAでオブジェクトの変数を扱うときは、参照型で値をセットします。

Set 変数名 = セットするオブジェクト」のように値を入れるのですが、使わなくなったタイミングオブジェクトを解放しないと、メモリを余計に使い続けてしまうんですよね。

このような時に、オブジェクト解放する方法が「Nothing」です。

使い方:

Set 変数名 = Nothing

Nothingをオブジェクト変数にセットすることで、オブジェクトを解放することができます。

Nothingを使ったオブジェクト解放方法については以下で詳しく解説しているので、気になる方は見てみてくださいね!

【ExcelVBA】メモリーの解放方法・タイミングについて徹底解説!
更新日 : 2019年4月29日

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の使い方について基礎から徹底的に解説しました。

オブジェクト変数を使うケースはとても多いので、覚えておくのがおすすめです!

使い方も簡単なので、実際にコードを書いて試してみてくださいね!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

フリーランスエンジニア兼ライターのワキザカ サンシロウです。
ExcelVBAの自動化ツール開発、WEB開発をメインにエンジニア業務をこなしつつ、サムライエンジニアにてライター業務をしております。

プログラミングをこれからやってみたい方に向けて、ためになる記事を全力で書いていきますので宜しくお願い致します!

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説