Excel VBAの処理速度改善を行う際、メモリ使用量の増減を把握したいと考える方は少なくありません。しかし、インターネットやAIで見つけたサンプルコードをそのまま実行すると、実行時エラーや期待した結果が得られないケースがあります。本記事では、Excel VBAでメモリ使用量を確認する方法や、Application.MemoryFreeで発生するエラーの原因、さらに実務で役立つメモリ解放や高速化の考え方について解説します。
Application.MemoryFreeでエラー13が発生する理由
VBAで以下のようなコードを見かけることがあります。
Dim memBefore As Double
memBefore = Application.MemoryFree
しかし、Excel VBAには標準で利用できる「Application.MemoryFree」というプロパティは存在しません。
そのため、環境によっては実行時エラー13(型が一致しません)やコンパイルエラーが発生します。
重要: このコードは他のOffice製品や古い情報、あるいはAIが生成したサンプルコードが混在しているケースで見られますが、Excel VBAでそのまま利用することはできません。
Excel VBAで実際のメモリ使用量を取得する方法
Excelプロセスが使用しているメモリを確認したい場合は、Windows APIやWMIを利用する方法が一般的です。
例えば、Excel.exeが使用しているワーキングセットメモリを取得することで、処理前後の変化を確認できます。
Debug.Print Application.MemoryUsed
なお、Application.MemoryUsedはExcel内部で使用しているメモリ量の参考値であり、Windowsタスクマネージャーの数値と完全には一致しません。
より正確な計測を行う場合は、Process ExplorerやWindowsパフォーマンスモニターを併用する方法が現実的です。
Set 変数 = Nothing は本当に効果があるのか
VBAではオブジェクト変数を解放するために次のようなコードが利用されます。
Set ws = Nothing
Set wb = Nothing
Set rng = Nothing
これはオブジェクト参照を解放する意味では有効ですが、劇的にメモリが減少するとは限りません。
特にExcelは内部キャッシュを保持するため、オブジェクトを解放してもWindows上の使用メモリがすぐに減らないことがあります。
ただし、大量のWorkbook、Worksheet、Rangeオブジェクトを扱うマクロでは、不要になった時点でNothingを設定する習慣は有効です。
処理速度改善に効果が大きい設定
メモリ解放よりも、処理速度改善に直接効果がある設定もあります。
| 対策 | 効果 |
|---|---|
| ScreenUpdating=False | 画面更新停止 |
| Calculation=xlCalculationManual | 再計算停止 |
| EnableEvents=False | イベント停止 |
| 配列処理へ変更 | セルアクセス削減 |
例えば以下のような定型コードは非常に有効です。
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
'処理
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
数万行以上のデータを扱う場合、メモリ解放よりもこちらの効果が大きいケースが少なくありません。
ThisWorkbook.Saveでメモリが減るように見える理由
マクロ実行中にThisWorkbook.Saveを実行すると、一時オブジェクトや変更情報が整理されるため、結果的にメモリ使用量が減少することがあります。
ただし保存処理自体が重く、SharePoint環境やネットワーク経由で運用している場合は待ち時間が大きくなります。
そのため、頻繁にSaveを挟むよりも、処理の見直しや不要オブジェクトの解放を優先したほうが実務上は効率的です。
SharePoint環境で重くなる原因
SharePoint上のファイルを直接開いている場合、ネットワーク遅延や同期処理の影響を受けることがあります。
また、セキュリティソフトやDLP、EDRなどの監視ソフトが動作している企業環境では、CPU使用率やメモリ使用率が高止まりするケースも珍しくありません。
そのため、単純なメモリ不足だけでなく、ネットワークアクセス回数やセルアクセス回数の削減も重要な改善ポイントになります。
まとめ
Excel VBAでApplication.MemoryFreeを使用すると、環境によっては実行時エラーが発生します。これはExcel VBAで利用できる標準プロパティではないためです。
メモリ使用量を確認したい場合はApplication.MemoryUsedやWindows側の監視ツールを活用するほうが現実的です。
また、処理速度改善を目的とする場合は、Set変数=Nothingによるオブジェクト解放だけでなく、画面更新停止や再計算停止、配列処理への変更などを組み合わせることで大幅な高速化が期待できます。


コメント