Jeffは、VBAを使用してPDF形式で多数のレポートを生成する洗練されたExcelワークブックを持っています。複数のPCにまたがるExcel201332ビットでうまく動作します。逆に、Office 365を実行している他の複数のPCでは、出力の途中でJeffが「メモリ不足」エラーを受け取ります。

したがって、マクロは古いバージョンのExcelでは完全に機能しますが、最新バージョンでは機能しません。 (繰り返しになりますが、Jeffは複数のPCでこれをテストしたため、結果は再現可能です。)Jeffは、この問題の原因となる可能性のある既知のメモリリークまたはOffice365のマクロの違いがあるのではないかと考えています。

一般に、メモリ使用量は、変数とそれらがマクロでどのように使用されるかという1つの主要な問題に関係しています。具体的には、可変配列で機能します。すべての変数を宣言し(この点で役立つようにOption Explicitディレクティブを使用)、配列のディメンションをチェックして、めちゃくちゃ巨大な配列を宣言しようとしていないことを確認することをお勧めします。

オブジェクト変数も大量のメモリを使用する可能性があります。 Setキーワードを使用してオブジェクトを変数に割り当てる場合は、完了時にオブジェクト変数をNothingに設定してください。これはループ内で特に重要です。ループを通過するたびに別のオブジェクト変数が宣言される場合、ループの各反復中にその変数をクリアしなかった場合、メモリをすぐに使い果たす可能性があります。

マクロが回転している間、画面の更新をオフにするためのポイントもあります。マクロが画面を継続的に更新しようとすると、リソースが使用され、マクロの速度が低下します。

ただし、Jeffの状況では、メモリ使用量は大きな問題ではないと思われます。結局のところ、彼は32ビットバージョンのExcelから(おそらく)64ビットバージョンに移行しています。これにより、Excelはこれまで以上に大きなメモリスペースを利用できます。したがって、「メモリ不足」エラーの可能性は高くなるのではなく、低くなると考えられます。

残念ながら、ここにミックスに投入するレンチがあります。 「メモリ不足」エラーが発生した場合、原因はメモリではない可能性があります。

Microsoftは、この特定のメモリは本質的に一般的なものであり、ほぼすべての原因で発生する可能性があることを長年にわたって文書化しています。 (私の本では、それはエラーメッセージを役に立たなくしますが、マイクロソフトに質問するのは誰ですか。イライラします!)

私が行うことを検討するもう1つのこと(Jeffのコードを見たことがない)は、線形にプログラミングしていないことを確認することです。つまり、コードを個々のサブルーチンに分割して、小さな個別のタスクを実行します。次に、メインの制御ルーチンから各サブルーチンを呼び出すことができます。これの利点は、スコープによるメモリ管理です。

変数は、それらが使用されるプロシージャ内でのみスコープを持ちます。

(グローバルスコープを持っていると宣言しない限り、これは当てはまりますが、それは別の魚のやかんです。)これは、プロシージャ内で使用される変数が破棄され、プロシージャが終了すると自動的にメモリが解放されることを意味します。

ただし、サブルーチンがないようにマクロが線形に記述されている場合、マクロが実行されている間、すべての変数がシステムに保持されます。メモリ管理の観点からは、コードをプロシージャに分割して、メモリ使用量を最小限に抑えることをお勧めします。

この方法でコードをモジュール化することのもう1つの利点は、エラーが発生した場合、一般的に価値のない「メモリ不足」であっても

エラー-特定の手順内で発生する可能性が高いため、実際のエラーが発生している場所を特定する可能性が高くなります。私の考えでは、潜在的な障害点をより効率的に追跡するこの機能は大きなメリットです。

それでも問題が解決しない場合は、ブックを保存すると、VBAがメモリスペースでガベージコレクションを実行するように強制されるという報告がいくつかあります。このため、マクロの最後だけでなく、マクロでブックを頻繁に保存することを提案する人もいます。このレポートがどれほど正確かはわかりませんが、既にマクロを使用してブックを保存している場合は、保存回数を減らすのではなく、増やすことをお勧めします。

最後に言及すべきことが1つあります。現在Office365 Business Premiumを使用している場合は、SharePointOnlineとExcelWebAppが含まれています。したがって、これらのバージョンでは、Excelファイルのサイズが10MBに制限されています。ファイルが非常に大きい場合は、Excel 2013では問題なく機能した可能性がありますが、このファイルサイズの制限により、Office 365 BusinessPremiumでは失敗します。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(13619)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice365のExcelに適用されます。