Microsoft 製品に組み込まれている Visual Basic の実装。
グローバル変数は値は残りますが、実行の度にごみがたまるなんてことはないと思います。
ヤマ勘では配列を使われていてRedimあたりでやり方を間違えられているものと考えます。
なお、VBAではメモリを解放するなんて機能はないはずです。
一番良いのはメインモジュールでローカルに変数を定義し、引数として各サブプロシージャで使うようにすることです。
この場合、メインモジュールが終わった時点で初期化されます。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
EXCEL VBAで有限要素法の処理を行い複数地点を三角形に分割し、それを描画する処理を行っています。
そこで処理の開始から終了までの経過時間を測定したところ、1回目は1分30秒前後、2回目は1分50~2分前後、3回目は2分20秒前後と
同一データで同一処理を繰り返すたびに処理に要する時間が20~25秒前後増加していっています。
現時点では処理を10回ほど繰り返してもメモリー不足で処理が停止することはありません。単純に遅くなるだけです。
一旦EXCELを終了し、再度立ち上げれば処理時間は短い値に復活します。
ネットでいろいろ調べたら、グローバル変数や配列を使用しているとき、メモリー上で開放しないといけないような記述がありました。
原因として考えられるのは、何でしょうか。
もしメモリーの問題だとすると配列にはEraseで対応可能ですが、rangeでもない単純な変数のメモリーを開放する方法が分かりません。
構造体宣言もしており、そのデータもグローバル変数になっています。
お分かりになりましたら、お教え頂けると助かります。
宜しくお願いいたします。
Microsoft 製品に組み込まれている Visual Basic の実装。
ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。
質問作成者が受け入れた回答
グローバル変数は値は残りますが、実行の度にごみがたまるなんてことはないと思います。
ヤマ勘では配列を使われていてRedimあたりでやり方を間違えられているものと考えます。
なお、VBAではメモリを解放するなんて機能はないはずです。
一番良いのはメインモジュールでローカルに変数を定義し、引数として各サブプロシージャで使うようにすることです。
この場合、メインモジュールが終わった時点で初期化されます。
yamano_boriです。
その後の状況を報告いたします。
1.VBAで処理最初にダミーコードの標準モジュールを追加し、処理の最後でその標準モジュールをRemoveする処理を加えたものを作成
2.別ブックで、任意のブックのクローズとオープンするツールを作成し、上記1の処理を動作させた場合の処理時間の比較をしてみました。
計算を含む処理本体と描画にかかる時間を分けて計測してみました。
1.の対応の結果、処理時間の大幅な変化は発生しなくなりました。
処理本体の所要時間1:40~2:15で、描画は0:25~0:26 [分:秒]と割と安定しています。
2.ツール使用時
処理本体の所要時間1:20~1:55で、描画は0:15~0:20 [分:秒]
という結果でした。
ツールを使用した方が平均的に処理時間が25秒ほど早まるという結果が出ています。
処理に要する全体の時間が2分前後なので、25秒ほど縮まるという効果は大きいものがあります。
もう少し調べて、トライして見ます。有難うございます。
yamano_boriです。回答ありがとうございます。返事が遅くなって申し訳ありません。
その後の状況を報告させて頂きます。
グローバル変数部分を止めて、全て引数として各プロシージャに引き渡すように変更してテストしてみましたが、やはり結果は変わりませんでした。配列は使用していますが、Redimで配列数を変更するような処理は行っておらず、処理の終了時にはEraseでクリアしていますので、問題ないと思っています
EXCELを立ち上げた最初の処理時間が最も短く、EXCELを立ち上げたまま同一処理を繰り返していくと依然として処理時間が長くなっていってしまいます。当初の2倍以上の処理時間に簡単になってしまいます。
VBAコードを変更した直後もEXCELを立ち上げたときと同様処理時間が短くなりますので、処理の初期化と絡んでいることは間違いなさそうです。
VBでVBAコードを動的に追加できるとの情報は得ており、そこのサイトでもこの方法により処理時間の短縮が可能と説明しています。当方にはVBの環境がないため確認に至っておりません。
VBAコードをダミーで動的に追加・削除するコードをVBAのみで出来れば、この問題は解決しそうに思います。
現在は、都度対象のブックをクローズしてから立ち上げるだけの別ブックを作成して、それでの処理スピードの変化を確認しています。
何かよい方法がありましたら、お手数をお掛け致しますが、お教え願えれば幸いです。
宜しくお願いします。
y sakuda さん、アドバイスありがとうございます。
yamano_bori さん、こんにちは。
y sakuda さんからいただいたアドバイスもご参考にしてみてくださいね。
同じような情報をお探しの方にもご参考になるよう、今回は私の方で \[回答としてマーク\] をいたしました。
VBA で直接メモリーを開放するのは難しいかもしれませんが、、、引き続き、何かよいアドバイスもお待ちの方がいれば、ご投稿よろしくお願いします。
yamano_bori さん、こんにちは。
Answers への投稿、ありがとうございます。
VBA に関しての質問ですね。
こちら、すでに VBA フォーラム で同じ内容が質問されているようですが、投稿されたのは yamano_bori さんご本人でしょうか。
Microsoft Answers には VBA に関するカテゴリがないため、上記スレッドが yamano_bori さんが投稿されたものでしたら、引き続きそちらのスレッドで確認されたほうがいいかと思います。
Windows や Office の質問の場合には、ぜひ Answers を利用くださいね。