過去ログ

                                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

アドバイスよろしくお願いいたします。
 ───────────────────────────────────────  ■題名 : Re:DoEventsの使い方  ■名前 : ichinose  ■日付 : 02/10/20(日) 10:03  -------------------------------------------------------------------------
   ▼ぴかる さん:
おはようございます。
私もはっきりはわからないのですが、
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をいれたら、直ったということなので、判断が難しいですが・・)。
 ───────────────────────────────────────  ■題名 : Re:DoEventsの使い方  ■名前 : ぴかる  ■日付 : 02/10/21(月) 9:17  -------------------------------------------------------------------------
   ichinoseさん、おはようございます。

色々とご丁寧にありがとうございました。普段、接していない内容なので"ちんぷんかんぷん"でしたがご説明いただき大変勉強になりました。
(でもまだ分かってない事の方が多いですが・・・。勉強します。^^; )

>手動で開く・閉じるを繰り返してもメモリー不足が起きないとき、コードでメモリ不足が起きるのは何故? 違いは、手動操作は、一度OSに制御が戻っているところが違うなあと思い、
あれ?、うちでは手動でなってました。

>>問題のファイルに↓を入れてみたら開けられるようになりました。
>>でもループは、必要なのでしょうか?
>この意味がちょっとわからないのですが、
>>Sub AUTO_CLOSE()
>
>>  DoEvents
>
>>End Sub
>中でどのようなコードが書かれているかわかりませんが、
>このEnd Subで、マクロが終了しているとしたら、Doeventsを入れる意味は何なのかな?
社内補修費集計ソフト(共有、読み取り専用)にて発生しました。まっ、わからんなりにやってみようということで↑を追加したら問題解決となりました。ループについては、AUTO_CLOSE時にたった1回の実行でメモリが開放されるの?と疑問をもったからです。

ピカつーるへの採用は、とりあえず保留しようと思ってますが全てのブックが対象となり、クローズ時にメモリ開放となると結構いいかなぁとも思っています。どう思われます?。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 231