こんにちは、ふみです。みなさんは Excel マクロを実行したときに「動的なローカル変数が多すぎます。」というコンパイルエラーが発生したことはありますか?
私は先日、自作の Excel マクロを実行したときにこのコンパイルエラーが発生しました。その後、エラーを解消することができたので、その方法について紹介します。
動的なローカル変数が多すぎるエラーの原因
このコンパイルエラーはデータ量が多い変数をプロシージャ内で変数を宣言すると発生します。
Excel マクロ実行時にこのコンパイルエラーが発生する場合、エラーの原因になっているデータ量が多い変数のコードの記述を修正すると解決することができます。
Excel マクロファイルをユーザーとして利用しているときにこのエラーが表示された場合は、自力で解決することができないので、Excel マクロファイルを提供しているプログラムの開発者に修正を依頼してください。
変数を配列に変更するとオートメーションエラーが発生
「動的なローカル変数が多すぎます。」のコンパイルエラーについて Google 検索してみたところ、コンパイルエラーの解決方法として「動的に配列を確保することでエラーを回避できます。」という記事を発見しました。
該当のエラーにつきましては、動的に配列を確保することでエラーを回避できます。
以下の例を参考にしてみてください。
Dim O6() As JV_O6_ODDS_SANRENTAN
出典:JRA公式競馬データ配信サービス JRA-VAN Data Lab. 競馬ソフト開発コーナー JV-Link 質問箱
ReDim O6(1)
:
:
Call SetData_O6(buff, O6(0))
実際にこの方法を試してみたところ、コンパイルエラーは発生しなくなりましたが、そのかわりに実行時エラー「オートメーション エラーです。起動されたオブジェクトはクライアントから切断されました。」が3回に1回程度の確率で発生するようになってしまいました。(Excel 365 はこのエラーが確認できませんでした。)
このエラーが発生するとデバッグ不可能でExcel が強制終了し、再起動後、[回復済み]の Excel ファイルが生成されます。
変数の宣言をプロシージャの外に移動してエラーを解消
動的に配列を確保する方法で新たに発生したオートメーションエラーを切り分け調査したところ、変数を宣言したプロシージャが終了するタイミングでオートメーションエラーが発生していることがわかりました。
変数を宣言したプロシージャが終了しないようにする為、変数宣言の記述(Dim ~)をプロシージャの外側(Sub ~より上の位置)に移動したところ、上記のオートメーションエラーが発生しなくなりました。
ちなみに、プロシージャの外側でデータ量の多い変数を宣言する場合、変数を配列に変更しなくても「動的なローカル変数が多すぎます。」のコンパイルエラーが発生しなくなりました。
まとめ
- データ量が多い変数をプロシージャ内で変数を宣言するとコンパイルエラーが発生する
- データ量が多い配列変数をプロシージャ内で変数を宣言するとオートメーションエラーが確率で発生する
- 配列変数に起因するオートメーションエラーは配列変数を宣言したプロシージャが終了するタイミングでエラーになる
- コンパイルエラーとオートメーションエラーはデータ量の多い変数をプロシージャの外で宣言するとエラーが解消することがある
ありがとうございました。
コメント