- ベストアンサー
メモリ不足にならないためには
Excel2000のVBAで起きる事なのですが、夜空をイメージし 無地の黒い背景に200個ほどの”☆”をランダムに大きさや色を変え、セル(番地も指定した範囲でランダム)に書き込み、一旦消して、また次の書き込みをするという、ループ満載の初歩的なプログラムを書きました。2,3回繰り返すとメモリ不足のメッセージが出て動かなくなります。1:このようなメモリ不足は何故おきるのでしょうか?2:これをさけるためメモリの消費量というをどのように見積もることができるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
うーん、何処かでメモリ漏れが起きてるんじゃないでしょうかねぇ。 恐らくVBAが動作してる間にExcelが終了してしまって、メモリリークに繋がってしまったんじゃないかと・・・ 特に、Workbook_Open()とかWorksheet_Activate()とかに無限ループを作ってしまい、ループが動いている最中に[×]ボタンで終了したりするとこのような動作になったかと思います。 解決策としては、起動時にはプログラムが走らないようにして、コマンドボタンを押したときとかに、プログラムを実行するようにすればいいでしょう。 あと、「停止ボタン」を作って、このボタンを押してから終了させるとなおエラーは減ると思います。 それ以外では、ループの最後にDoEventsを入れてみると改善されません? こんな感じ↓ Do ループ内部のプログラム DoEvents Loop あと、Sleep() APIを使って、ある程度の待ち時間を入れてやるといいかも。 (Genaral) (Declarations)に 'Windowsの機能の「Sleep」を呼び出せるようにする。 Private Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long) って行を追加しまして、 プログラム本体を Do ループ内部のプログラム Sleep 50 '50ミリ秒待機する DoEvents Loop のようにします。 あと、これは関係ないかもしれませんが、Application.ScreenUpdating プロパティを使えば、マクロの実行中に画面を更新する/しない を設定することが出来ます。 描画中に画面を更新しないようにしておくと、動きが高速になりますし、画面のちらつきが発生しにくくなります。 Do Application.ScreenUpdating = False '画面の更新をオフ '☆を描くプログラム Application.ScreenUpdating = True '画面の更新をオン Sleep 50 '50ミリ秒待機する DoEvents Loop こんな感じですか。 不明点とかがあれば、補足してみてください。
その他の回答 (1)
- terra5
- ベストアンサー率34% (574/1662)
どんなプログラムか見ないとなんとも言えませんが。 おそらく、星を一個書くごとにか何かで使ったメモリが そのまま再利用されず、次々と消費されている状況だろうと思います。