OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

メモリ不足にならないためには

  • 暇なときにでも
  • 質問No.117234
  • 閲覧数1128
  • ありがとう数0
  • 気になる数0
  • 回答数2
  • コメント数0

Excel2000のVBAで起きる事なのですが、夜空をイメージし
無地の黒い背景に200個ほどの”☆”をランダムに大きさや色を変え、セル(番地も指定した範囲でランダム)に書き込み、一旦消して、また次の書き込みをするという、ループ満載の初歩的なプログラムを書きました。2,3回繰り返すとメモリ不足のメッセージが出て動かなくなります。1:このようなメモリ不足は何故おきるのでしょうか?2:これをさけるためメモリの消費量というをどのように見積もることができるのでしょうか?
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル13

ベストアンサー率 46% (643/1383)

うーん、何処かでメモリ漏れが起きてるんじゃないでしょうかねぇ。
恐らく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
こんな感じですか。

不明点とかがあれば、補足してみてください。
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル13

ベストアンサー率 34% (574/1662)

どんなプログラムか見ないとなんとも言えませんが。 おそらく、星を一個書くごとにか何かで使ったメモリが そのまま再利用されず、次々と消費されている状況だろうと思います。
どんなプログラムか見ないとなんとも言えませんが。

おそらく、星を一個書くごとにか何かで使ったメモリが
そのまま再利用されず、次々と消費されている状況だろうと思います。


このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ