• ベストアンサー

Application.ScreenUpdating=Falseを使うと・・・。

VBAでユーザーフォームを表示させ、コマンドボタンを押すと ユーザーフォームを閉じて処理を開始すると言う設定をしているのですが ここにApplication.ScreenUpdating=Falseを追加すると ユーザーフォームが閉じずに処理を行なってしまいます。 (最後まで開いたまま) コマンドボタンのクリックイベントの最初にUserForm1.hideと入れ、その後にApplication.ScreenUpdating=Falseを入れた後に 行なう処理を書いているのですが、どこか間違っていますでしょうか? お教え下さい。よろしくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

fk_sapさん、こんばんは。Wendy02です。 ここらの話は、設計の問題なんですね。 人の好き好きにもあると思いますし、あまり、これという方法もあるわけではありません。 >ユーザーフォームを消して「処理中」などと書いたシートを >表示させてみようかなどと、技術もないクセにそう言う理想ばかりが先走ってしまって・・・(汗) ご指摘のとおり、その問題は、「処理中」いう表示ですね。私は、凝ったことをせずに、ユーザーフォーム上のラベルなどに出してしまいます。フリーソフトのExcelユーティリティには、すごく凝った、プログレスバーもどき(本物は配布できないはず)などしている人がいますが、それは、VBでするならともかく、私は、Excelでは、すこぶる簡単にしてしまいます。 他にワークシート上に出すと言っても、よく、Windowのタイトル部分や、ステータスバー部分を使うことは思いつくのですが、必ずしも、人は見ないような気がしてやめてしまいます。「処理中」などと書いたシート なんて、オブジェクトとしては、私には重過ぎるように思いますね。 >Beepを入れることによって、どう言う効果があるのでしょうか? これは、私の癖かもしれませんね。終了が気が付かないことがあるからです。MsgBox は、最後にクリックをしなければ終われません。その代わりに、終了の合図にWshShell.PopUpを使う人がいます。クリックを押さないで、MsgBox を終わらせられるからです。私は、どちらも面倒なので、Beepだけで済ませてしまいます。

fk_sap
質問者

お礼

Wendy02さん、こんにちは!どうもありがとうございます! 昨日、マイページを開けてみたら質問履歴がなくなっていて 自分の質問が見られなかったので、お礼が遅くなってしまいました。 Wendy02さんはすごいですよねー。何を聞いてもいとも簡単に解決して下さるので、尊敬しきりです。 私などは、VBAのVの字も知らなかったのに、会社で本をたったの2冊渡されて 「これを見て、このシステムを作れ」なんて、出来る訳ないですよねー。 もっと色んなことを知りたいのですが、本に載ってることには限界があって・・・ やっぱり、経験ですかねー。 なのでWendy02さん達のような、ご親切な方々のおかげで本当に助かっています。 余談が長くてすみません。どうもありがとうございました!!

その他の回答 (3)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

#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 の合わせ技でやった方が確実かもしれません。

fk_sap
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。Wendy02です。 例えば、こんな風な方法も出来るはずです。ユーザーフォームが消えて、砂時計だけが処理を示していることが分りますが、ふつうは、ユーザーフォーム自体は、出しっぱなしのことが多いのではないでしょうか? Private Sub CommandButton1_Click()   Me.Hide   DoEvents 'ここに入れる   Application.ScreenUpdating = False   'ループ系のコード   Application.ScreenUpdating = True   Beep   Me.Show End Sub

fk_sap
質問者

補足

Wendy02さん、こんにちは。いつもありがとうございます! ユーザーフォームは出しっぱなしの方がいいんですかねー? ユーザーフォームを消して「処理中」などと書いたシートを 表示させてみようかなどと、技術もないクセにそう言う理想ばかりが先走ってしまって・・・(汗) どちらがいいのか、考えてみます。 でも、とにかく今回教えて頂いたことで こう言う場合の対処の仕方も覚えましたので、勉強になりました! よろしければ、教えて頂きたいのですが No.1のKenKen_SP さんが教えて下さったの(wait)と、Wendy02さんが教えて下さったの(DoEvents)と 結果は同じに見えますが、どう違う・・・と言うより、どちらがお勧めですか? また、Beepを入れることによって、どう言う効果があるのでしょうか? 今後の勉強のためにも、よろしくお願いします。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんにちは。KenKen_SP です。 > ユーザーフォームが閉じずに処理を行なってしまいます。 その方が処理中であることが明確でいいと思いますが、、 恐らく Userform1.Hide のあとで、すぐ次の処理へ移ってしまい Excel がビジーになるため、画面表示が間に合わないためでしょう。 次のようにウェイトを置いてみてください。   Me.Hide   Application.Wait 1   Application.ScreenUpdating = False   '(処理) それから、Hide はフォームを非表示にするだけで、メモリ上には 残っています。最後に   Application.ScreenUpdating = True   Me.Show とします。 完全に終了させるなら、   Unload Me ですね。

fk_sap
質問者

お礼

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

関連するQ&A

  • VBAのScreenUpdating

    教えてください 高速化のためにApplication.ScreenUpdating = Falseを記述しましょうと言われますが Application.ScreenUpdating = FalseはVBAのすべての記述に付けたほうが良いのでしょうか

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

  • VBA ユーザーフォームを速く開く方法について

    VBA ユーザーフォームを速く開く方法について 現在Excel2000を使用しています。 VBAにてユーザーフォーム1と2を作成して、ユーザーフォーム1のコマンドボタンを押すと userform2.showが実行されてユーザーフォーム2が開きますが、フォーム2にはテキスト ボックスなどが約400個程設置してあり、そのせいかフォーム2が開くのに約8~10秒程かかり ます。 そこでそのフォームを速く開きたいのですが、(1秒~2秒程で)どうしたら速く開くでしょうか? Application.DisplayFullScreen = Falseなどを使用しても余り効果がありません。 パソコン自体の処理速度もあると思いますが、できるだけ速くしたいです。 よろしくお願いします。

  • キーボードでScreenUpdatingの切り替え

    Application.ScreenUpdating = True Application.ScreenUpdating = False の切り替えをキーボードからコントロールすることは可能 でしょうか?かなり長いマクロの処理があるのですが、 処理の途中で画面更新をON/OFFさせて進行状況を見たいのです。

  • EXCEL VBA----ユーザーフォームの表示で・・・

    こんにちは、お知恵をお貸し下さいませ。 Userform1のCommandbutton1をクリック ↓ Userform1を隠して(hide)Userform2を表示させる ↓ Userform2に必要な項目を入力後(Userform2の)Commandbutton1をクリック ↓ (処理) ↓ (処理終了後)Userform2を閉じてからUserform1を表示させる 上記の処理をしたいのですが、最後の(処理終了後)の所で Userform2が表示されたままで、Userform1が表示されてしまいます。 Userform2.hide と Userform1.show の間に waitメソッドを置いても同様です。 Application.ScreenUpdating=False を使用しないとうまく行くのですが・・・。 とてもわかりづらい説明で申し訳ありませんが、どうぞよろしくお願い致します。

  • TEXTBOX_CHANGEのイベント抑制

    TEXTBOX_CHANGE イベントでのイベント抑制方法を教えてください。 エクセルのVBAで、ユーザーフォーム内のTEXTBOXの内容を変更した際にイベントが発生しない様にしたいのですが、うまくいきません。 Private Sub TextBox1_Change() Application.EnableEvents = False UserForm1.TextBox1.Text = "" Application.EnableEvents = True UserForm1.TextBox1.SetFocus End Sub  ユーザーフォーム内では Application.EnableEvents  は使えないのかな?? どなたかご教授をお願いします。

  • Excel VBAで別のブックからユーザーフォームの閉じる

    Excel VBAで別のブックからユーザーフォームの閉じたいのですが うまくいきません。 教えてください。 Private Sub CommandButton2_Click() Application.Visible = False Unload Workbook.("材料リスクマップ検索Ver2.xls")UserForm3・・・・※ Workbooks.Close userform3:=ThisWorkbook.Path & "あああ.xls" Workbooks("\いいい.xls").Close savechanges:=False UserForm1.Show vbModeless End Sub ※印のところが赤字にかわります。 コマンドボタン2は、いいい.xlsにあり、フォームを閉じたいのはあああ.xlsのUserform3です。 その後、ファイル名いいい.xlsは閉じます。 コードが間違っているかと思いますが、どんな風にすればよいかわかりません。初歩的なこととは思いますがよろしくお願い致します。

  • VBAでユーザーフォームを再表示させたい。

    ExcelのVBAでユーザーフォームを作成し、 Initializeイベントで初期化をし、コマンドボタンを クリックしたら処理を行うように作成しました。 ところがコマンドボタンによって処理を行った後、 再度Initializeイベントを呼びたいんです。。 (コンボボックスの表示を更新する処理を 含んでいるため) なんとかうまい方法はないでしょうか??

  • ユーザーフォームの描画が遅れるのは?

    ExcelのVBAで簡単な処理をしているのですが、困っています。 ユーザーフォームにラベル1つとコマンドボタンを2つ用意しました。 ラベルには「・・・よろしいですか?」と質問形式の文章を 表示し、コマンドボタンにはそれぞれ「OK」と「キャンセル」を 表示してあります。 「OK」のコマンドボタンをクリックされたら、2つのコマンドボタン のvisibleプロパティをfalseにして隠し、ラベルには 「しばらくお待ちください。」と表示してセルの計算をさせます。 私の考えでは、コマンドボタンが消えラベルに「しばらく・・」が 表示されてから計算が行われセル上に計算結果が 表示されるはずなのですが、何故か計算結果が全て表示されてから コマンドボタンが消え、ラベルに「しばらく・・」と表示され 次の命令を実行してしまいます。 何がいけないのかが分かりません。 宜しくお願いいたします。 Private Sub CommandButton1_Click()  UserForm1.CommandButton1.Visible=False  UserForm1.CommandButton2.Visible=False  UserForm1.Label1.Caption="しばらくお待ちください。" '計算のsubへ飛ぶ  Call Keisan  UserForm1.Label1.Caption="終了しました。" End Sub

  • Excel VBAで、ユーザーフォームの値を、モジュールで使用したい。

    VBA初心者です。(おそらく)基本的な質問で、申し訳ありません。 ユーザーフォーム1には、テキストボックス1とコマンドボタン1が配置されているとします。 Sub TEST () Dim N Userform1.Show MsgBox N End Sub Private Sub CommandButton1_Click() Dim N N = TextBox1.Text UserForm1.Hide End Sub Sub TESTを実行した時に、ユーザーフォーム1からNの値を引き継ぐには、どうしたら良いのでしょうか?よろしくお願いします。

専門家に質問してみよう