皆さんは、VBAでメモリの解放をしたことがありますか?変数に入れた値をメモリ解放せずにいると、処理が重たくなったり、メモリリークで処理が動かなくなることもあります。そこで今回は、
VBAでメモリを解放する方法を知りたい
といった基礎的なことから
- VBAでメモリを解放するサンプルコード
- 【よくある議論】VBAでメモリの解放は必要か?
といった応用的な方法まで、徹底的に解説します!
メモリとは?
はじめに、メモリについて簡単に解説します。メモリとは、PC上でデータを一時的に記憶しておく場所です。データのコピー、削除などの具体的な操作だけでなく、変数を使う場合にもメモリを使います。
特に、変数を使う場合は「メモリの解放」をしないと、処理が終わるまで無駄なメモリを使い続ける状態になるため、処理が遅くなったりメモリリークと呼ばれる強制的に処理が止まるエラーを引き起こす原因となってしまいます。
そのため、メモリの解放を意識してVBAのコードを書いていかなければなりません。
VBAで変数のメモリを解放する方法とは?
次に、変数のVBAでメモリの解放をする方法を解説します。次のように書くことで、簡単にメモリを解放することができます。
メモリ解放方法:
変数名 = nothing 'オブジェクト以外の場合 set 変数名 = nothing 'オブジェクトの場合
このように書くことで、変数を使うために確保したメモリの領域を解放することができます。
VBAでメモリを解放するサンプルコード
次に、サンプルコードをもとに、具体的な使い方について解説します。
サンプルコード:
Sub Test() '変数宣言 Dim rng1 As Range Dim rng2 As Range '変数に値をセット Set rng1 = Range("A1") Set rng2 = Range("A2") '値1をセット & 解放 rng1.Value = "変更1" Set rng1 = Nothing '値2をセット & 解放 rng2.Value = "変更2" Set rng2 = Nothing End Sub
rng1.Value = “変更1″のように値を変更した後、Set rng1 = Nothingでメモリを解放しています。このように、使い終わった変数はメモリの解放をするのが重要です。
【よくある議論】VBAでメモリの解放は必要か?
ここまでメモリの解放について解説していきましたが、必ずメモリの解放が必要か?といったらそうではありません。理由は、サブシージャの処理が終わる「End Sub」まで到達すると、自動でメモリが解放されるからです。
先ほどのサンプルでいうと、次のように最後にメモリ解放をしている場合は、書く意味があまりありません。
最後にメモリ解放したサンプル:
Sub Test2() '変数宣言 Dim rng1 As Range Dim rng2 As Range '変数に値をセット Set rng1 = Range("A1") Set rng2 = Range("A2") '値をセット rng1.Value = "変更1" rng2.Value = "変更2" 'メモリを解放 Set rng1 = Nothing Set rng2 = Nothing End Sub
Nothingでメモリを解放したあとに、End Subがあるのでコードを書くこと自体が無駄なわけですね。そのため、変数を使い終わったタイミングで、メモリ解放するコードを書くという意識が大事です。
まとめ
今回は、メモリの解放方法・タイミングについて解説しました。初めてメモリの解放を学んだ方は、使い方に慣れるまで時間がかかるかもしれません。しっかりと使い方を覚えてメモリを解放していくことで、バグの少ないコードを作ることができます。
ぜひ、使ってみてくださいね!