ExcelVBA 「メモリが不足しています。」

実行時エラー ‘7’:ExcelVBA 「メモリが不足しています。」


エラーメッセージ

読んで字のごとく、「メモリ不足」が原因の実行時エラーです。ExcelVBA処理において、このエラーが発生する原因は、いろいろと考えられますが、たまに、不要なLoop繰り返し処理により、メモリ不足となってしまう場合があります。
 
このケースでは、適切なLoopとなるよう特定条件でこのLoopを脱出すれば良いので、無駄なLoopが突き止められれば、わりと簡単に解消できると思います。
 
また、別のケースでは、物理的、且つ、圧倒的にデータ量が多いケースです。
 
このデータ量とは、「データ件数」のみで語れるものではありません。
というのは「データ件数」という概念は、行方向、つまり縦方向に、どれだけデータ数が多いか、
といったものですが、忘れてならないのは「横方向の列数」という概念です。
一般的に、顧客管理などでは、例えば、顧客マスタは、顧客の基本情報を抱えるものですので、
顧客CD、顧客名、フリガナ、生年月日、郵便番号、住所1、住所2…・。
のように、延々と増えた場合においても、数十列、100列はないのではないでしょうか。
 
(私の経験上、100列を超える顧客マスタは見たことがありません。)
 
つまり、数百列におよぶ顧客マスタは、まず考えにくいので、データの件数が多い、少ない、といった会話になってくるのですが、これが、月別の売上/実績/修正値/2カ年などを管理するような表の場合、
最近のお客様の例では、600列が1行のデータというケースがありました。

Excelを手作業で長いこと業務で運用されていると、いつの間にか膨大なデータ量を1ブックで管理するようになることが有りますが、数年をかけて徐々に増えてゆくため、なかなか気づきにくく、変更見直しや改良をしにくいのだと思います。
 
ここで言いたかったことは、メモリ消費という原因に対して、解決策は幾つかありますが、理想論は別として、現実的に、列数が数百列におよぶデータ範囲をマクロで処理する際に、「メモリ不足」が発生する場合の回避策は、ただ1つと考えます。
 
それは、処理単位をいくつかに分割し、「メモリ不足」が発生しないようプログラム修正を行うことで、回避するしかありません。データベースを使えば回避できるか?と言われれば、データベース構築においても、そんなDB設計を行うSEは恐らくいませんので、そもそもファイル設計から見直しとなります。
 
となれば、別の問題として、「発生コスト」が直結してくる事になります。
どんなトラブルも回避するための策はあるのですが、かけられる予算も限られてくる場合には、知恵を出して、致命的エラーを乗り切らなければなりません。
 
Excel2007以降では、ワークシート内の取り扱い可能なデータ件数が、(2の20乗)1,048,576件と拡張されましたが、理論上の上限ですので、現実的は列数が少ない100列以下で、3万行未満というのが、弊社の考える、Excelの1シートの「そろそろ別ブックに・・」をオススメする件数の目安でしょうか。

といっても、厳しい現実の中でも、VBAで処理できるよう対応するのが腕の見せ所ですので、
頑張って参りたいと思います。
 
(あっ、もう一つの方法がありました。ExcelVBAでは、特に連続した繰り返しのセル操作、連続したワークシート操作はエラーの原因になるのですが、Excelブックを一旦「上書き保存する」ことで、メモリ解放され実行時エラーを回避できる事があります。また、DoEventsなども有効と思われますので、たった1つではありませんね、失礼いたしました!)
 
最後に、この「メモリが不足しています。」エラーですが、あまりに大量なデータ範囲は、配列に格納できないので、(※出来たとしてもしない事をオススメいたします。)例えば、1000行や500行づつ小分け処理をすれば、この実行時エラーは間違いなく回避されますので、お試しください。
 
Excelエラー解決サービス提供を開始!

本サービスは、緊急性が高く、問題解決を必要とするケースでご利用メリットがあります。

関連する記事

全国対応!お気軽にお問い合わせください