Page 231 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼DoEventsの使い方 ぴかる 02/10/19(土) 8:38 ┗Re:DoEventsの使い方 ichinose 02/10/20(日) 10:03 ┗Re:DoEventsの使い方 ぴかる 02/10/21(月) 9:17 ─────────────────────────────────────── ■題名 : DoEventsの使い方 ■名前 : ぴかる ■日付 : 02/10/19(土) 8:38 -------------------------------------------------------------------------
みなさん、おはようございます。 社内のあるPCでのみ自作ソフトを開いて閉じてを繰り返すと3回目にメモリ不足で開けられなくなりました。たまたまこちらを見てたら、ほぼ同じ内容[#869]があり参考にさせて頂きました。しかし、DoEventsの使い方がよく理解できていません。ヘルプをみてもピンときませんでした。こんな感じで対応したのですが、OKでしょうか?。 問題のファイルに↓を入れてみたら開けられるようになりました。 でもループは、必要なのでしょうか? Sub AUTO_CLOSE() DoEvents End Sub また、ピカつーるのクラスモジュールに↓を入れて全ブックを対象にする事も考えています。問題ないでしょうか? Private Sub WBK_BeforeClose(Cancel As Boolean) DoEvents End Sub アドバイスよろしくお願いいたします。 |
▼ぴかる さん: おはようございます。 私もはっきりはわからないのですが、 Doeventsについて Helpをみる限り、 「現在実行しているイベント以外のイベントが処理できるように、制御をOSに渡します。」 と記述されいます。 Sub test() Do While Range("a1").Value = 1 DoEvents Loop End Sub 例えば、セルA1に1を入れた状態で上のtestといプロシジャーを実行し場合、動きは遅くなりますが、Excelの手動操作がtest実行中でも可能ですよね。 で、[#869]の件ですが、 手動で開く・閉じるを繰り返してもメモリー不足が起きないとき、コードでメモリ不足が起きるのは何故? 違いは、手動操作は、一度OSに制御が戻っているところが違うなあと思い、 想像したのは、ひとつのプロシジャーが終了し、制御がOSに渡る時点で本当の意味でのメモリー解放がおこなわれているのではないかということです。あくまでも仮定です。 Sub test1() Do While Range("a1").Value = 1 Set bk = Workbooks.Open(Filename:="d:\book1.xls") bk.Close Loop End Sub Test1の場合、ブックがオープンされる際にファイルのオープン情報がメモリー上に蓄積される。次いでクローズした時点で、本当は、確保されたメモリーを解放してくれれば問題ないのですが、メモリーは、解放されずいるのだろう(たぶん、情報の抜け殻だけがはいっているような状態)。これを繰り返しているからメモリー不足が発生する。 これに、 Sub test1() Do While Range("a1").Value = 1 Set bk = Workbooks.Open(Filename:="d:\book1.xls") DoEvents bk.Close Loop End Sub と、Doeventsをループ中に入れ、一度OSに制御を渡す事により、メモリの整理をさせると、メモリ不足を起こさないのではないか? 結果、実際にDoeventsを入れた場合は、メモリー不足が起こらなかったというのが[#869]なのですが・・。 >問題のファイルに↓を入れてみたら開けられるようになりました。 >でもループは、必要なのでしょうか? この意味がちょっとわからないのですが、 >Sub AUTO_CLOSE() > DoEvents >End Sub 中でどのようなコードが書かれているかわかりませんが、 このEnd Subで、マクロが終了しているとしたら、Doeventsを入れる意味は何なのかな? もしかしたら、ぴかるさんの場合は、別の原因かもしれませんね(Doeventsをいれたら、直ったということなので、判断が難しいですが・・)。 |
ichinoseさん、おはようございます。 色々とご丁寧にありがとうございました。普段、接していない内容なので"ちんぷんかんぷん"でしたがご説明いただき大変勉強になりました。 (でもまだ分かってない事の方が多いですが・・・。勉強します。^^; ) >手動で開く・閉じるを繰り返してもメモリー不足が起きないとき、コードでメモリ不足が起きるのは何故? 違いは、手動操作は、一度OSに制御が戻っているところが違うなあと思い、 あれ?、うちでは手動でなってました。 >>問題のファイルに↓を入れてみたら開けられるようになりました。 >>でもループは、必要なのでしょうか? >この意味がちょっとわからないのですが、 >>Sub AUTO_CLOSE() > >> DoEvents > >>End Sub >中でどのようなコードが書かれているかわかりませんが、 >このEnd Subで、マクロが終了しているとしたら、Doeventsを入れる意味は何なのかな? 社内補修費集計ソフト(共有、読み取り専用)にて発生しました。まっ、わからんなりにやってみようということで↑を追加したら問題解決となりました。ループについては、AUTO_CLOSE時にたった1回の実行でメモリが開放されるの?と疑問をもったからです。 ピカつーるへの採用は、とりあえず保留しようと思ってますが全てのブックが対象となり、クローズ時にメモリ開放となると結構いいかなぁとも思っています。どう思われます?。 |