【ExcelVBA】メモリーの解放方法・タイミングについて徹底解説!

皆さんは、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があるのでコードを書くこと自体が無駄なわけですね。そのため、変数を使い終わったタイミングで、メモリ解放するコードを書くという意識が大事です。

まとめ

今回は、メモリの解放方法・タイミングについて解説しました。初めてメモリの解放を学んだ方は、使い方に慣れるまで時間がかかるかもしれません。しっかりと使い方を覚えてメモリを解放していくことで、バグの少ないコードを作ることができます。

ぜひ、使ってみてくださいね!

この記事を書いた人

北海道出身の30歳で、フリーランスエンジニア兼テックライターとして活動中。新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。

Webアプリ、業務アプリ開発において、要件定義 ~ 運用保守まで様々な経験あり。また3歳の娘がいる1児のパパで、日々娘との時間を確保するために仕事を頑張っています!
侍エンジニアでは、【誰でもわかるレベルのわかりやすさ】を意識して、記事を執筆中。

目次