プロが教えるわが家の防犯対策術!

VBAでユーザーフォームを表示させ、コマンドボタンを押すと
ユーザーフォームを閉じて処理を開始すると言う設定をしているのですが
ここにApplication.ScreenUpdating=Falseを追加すると
ユーザーフォームが閉じずに処理を行なってしまいます。
(最後まで開いたまま)

コマンドボタンのクリックイベントの最初にUserForm1.hideと入れ、その後にApplication.ScreenUpdating=Falseを入れた後に
行なう処理を書いているのですが、どこか間違っていますでしょうか?

お教え下さい。よろしくお願いします。

A 回答 (4件)

fk_sapさん、こんばんは。

Wendy02です。

ここらの話は、設計の問題なんですね。
人の好き好きにもあると思いますし、あまり、これという方法もあるわけではありません。

>ユーザーフォームを消して「処理中」などと書いたシートを
>表示させてみようかなどと、技術もないクセにそう言う理想ばかりが先走ってしまって・・・(汗)

ご指摘のとおり、その問題は、「処理中」いう表示ですね。私は、凝ったことをせずに、ユーザーフォーム上のラベルなどに出してしまいます。フリーソフトのExcelユーティリティには、すごく凝った、プログレスバーもどき(本物は配布できないはず)などしている人がいますが、それは、VBでするならともかく、私は、Excelでは、すこぶる簡単にしてしまいます。

他にワークシート上に出すと言っても、よく、Windowのタイトル部分や、ステータスバー部分を使うことは思いつくのですが、必ずしも、人は見ないような気がしてやめてしまいます。「処理中」などと書いたシート なんて、オブジェクトとしては、私には重過ぎるように思いますね。

>Beepを入れることによって、どう言う効果があるのでしょうか?

これは、私の癖かもしれませんね。終了が気が付かないことがあるからです。MsgBox は、最後にクリックをしなければ終われません。その代わりに、終了の合図にWshShell.PopUpを使う人がいます。クリックを押さないで、MsgBox を終わらせられるからです。私は、どちらも面倒なので、Beepだけで済ませてしまいます。
    • good
    • 0
この回答へのお礼

Wendy02さん、こんにちは!どうもありがとうございます!
昨日、マイページを開けてみたら質問履歴がなくなっていて
自分の質問が見られなかったので、お礼が遅くなってしまいました。

Wendy02さんはすごいですよねー。何を聞いてもいとも簡単に解決して下さるので、尊敬しきりです。
私などは、VBAのVの字も知らなかったのに、会社で本をたったの2冊渡されて
「これを見て、このシステムを作れ」なんて、出来る訳ないですよねー。
もっと色んなことを知りたいのですが、本に載ってることには限界があって・・・
やっぱり、経験ですかねー。

なのでWendy02さん達のような、ご親切な方々のおかげで本当に助かっています。

余談が長くてすみません。どうもありがとうございました!!

お礼日時:2005/12/09 09:59

#1 です。



ウェイト処理とは、プログラムの実行速度が速すぎる場合、その速度を落とす
ために入れるものです。

Me.Hide でフォームを非表示にしたあと、CPU パワーを使うループ処理などに
すぐ移行すると CPU の稼働率が高まり、OS が画面の再描写ができなくなって
スクリーン上に残ってしまったようです。

そこで、ループ処理に移行するまえに、Application.Wait 1 で 1 秒程度の
ループ処理実行の待機時間を設けることで、その間に OS がフォームの非表示
を再描写しています。

対して DoEvents は、簡単に言えば、、

マクロを実行すると Excel の CPU 占有率が高まり、画面描写など OS が担当
する部分に CPU パワーを割けなくなることがあります。DoEvents を使うと、
この Excel が占有している CPU パワーを一瞬 OS に渡します。

つまり、画面の再描写等の OS が担当する処理が、DoEvents の合間に行われる
ことになります。

最近の PC は高速ですから、DoEvents でも良いのですが、今回のような処理を
行う場合は、ウェイトと DoEvents の合わせ技でやった方が確実かもしれません。
    • good
    • 0
この回答へのお礼

KenKen_SPさん、詳しいご説明ありがとうございます。
なんとなくですが、わかったような気がします。
奥が深いですねー。
色々勉強になります。ありがとうございました!!

お礼日時:2005/12/09 09:45

こんにちは。

Wendy02です。

例えば、こんな風な方法も出来るはずです。ユーザーフォームが消えて、砂時計だけが処理を示していることが分りますが、ふつうは、ユーザーフォーム自体は、出しっぱなしのことが多いのではないでしょうか?

Private Sub CommandButton1_Click()
  Me.Hide
  DoEvents 'ここに入れる
  Application.ScreenUpdating = False
  'ループ系のコード
  Application.ScreenUpdating = True
  Beep
  Me.Show
End Sub

この回答への補足

Wendy02さん、こんにちは。いつもありがとうございます!
ユーザーフォームは出しっぱなしの方がいいんですかねー?
ユーザーフォームを消して「処理中」などと書いたシートを
表示させてみようかなどと、技術もないクセにそう言う理想ばかりが先走ってしまって・・・(汗)

どちらがいいのか、考えてみます。

でも、とにかく今回教えて頂いたことで
こう言う場合の対処の仕方も覚えましたので、勉強になりました!

よろしければ、教えて頂きたいのですが
No.1のKenKen_SP さんが教えて下さったの(wait)と、Wendy02さんが教えて下さったの(DoEvents)と
結果は同じに見えますが、どう違う・・・と言うより、どちらがお勧めですか?

また、Beepを入れることによって、どう言う効果があるのでしょうか?

今後の勉強のためにも、よろしくお願いします。

補足日時:2005/12/07 11:36
    • good
    • 0

こんにちは。

KenKen_SP です。

> ユーザーフォームが閉じずに処理を行なってしまいます。

その方が処理中であることが明確でいいと思いますが、、
恐らく Userform1.Hide のあとで、すぐ次の処理へ移ってしまい
Excel がビジーになるため、画面表示が間に合わないためでしょう。

次のようにウェイトを置いてみてください。

  Me.Hide
  Application.Wait 1
  Application.ScreenUpdating = False
  '(処理)


それから、Hide はフォームを非表示にするだけで、メモリ上には
残っています。最後に

  Application.ScreenUpdating = True
  Me.Show

とします。

完全に終了させるなら、

  Unload Me

ですね。
    • good
    • 0
この回答へのお礼

KenKen_SPさん、いつもありがとうございます。
ウェイトなるものを置くと、見事解決してくれました!
本当にありがとうございました!!!

お礼日時:2005/12/07 11:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A