
VBAでユーザーフォームを表示させ、コマンドボタンを押すと
ユーザーフォームを閉じて処理を開始すると言う設定をしているのですが
ここにApplication.ScreenUpdating=Falseを追加すると
ユーザーフォームが閉じずに処理を行なってしまいます。
(最後まで開いたまま)
コマンドボタンのクリックイベントの最初にUserForm1.hideと入れ、その後にApplication.ScreenUpdating=Falseを入れた後に
行なう処理を書いているのですが、どこか間違っていますでしょうか?
お教え下さい。よろしくお願いします。
No.4ベストアンサー
- 回答日時:
fk_sapさん、こんばんは。
Wendy02です。ここらの話は、設計の問題なんですね。
人の好き好きにもあると思いますし、あまり、これという方法もあるわけではありません。
>ユーザーフォームを消して「処理中」などと書いたシートを
>表示させてみようかなどと、技術もないクセにそう言う理想ばかりが先走ってしまって・・・(汗)
ご指摘のとおり、その問題は、「処理中」いう表示ですね。私は、凝ったことをせずに、ユーザーフォーム上のラベルなどに出してしまいます。フリーソフトのExcelユーティリティには、すごく凝った、プログレスバーもどき(本物は配布できないはず)などしている人がいますが、それは、VBでするならともかく、私は、Excelでは、すこぶる簡単にしてしまいます。
他にワークシート上に出すと言っても、よく、Windowのタイトル部分や、ステータスバー部分を使うことは思いつくのですが、必ずしも、人は見ないような気がしてやめてしまいます。「処理中」などと書いたシート なんて、オブジェクトとしては、私には重過ぎるように思いますね。
>Beepを入れることによって、どう言う効果があるのでしょうか?
これは、私の癖かもしれませんね。終了が気が付かないことがあるからです。MsgBox は、最後にクリックをしなければ終われません。その代わりに、終了の合図にWshShell.PopUpを使う人がいます。クリックを押さないで、MsgBox を終わらせられるからです。私は、どちらも面倒なので、Beepだけで済ませてしまいます。
Wendy02さん、こんにちは!どうもありがとうございます!
昨日、マイページを開けてみたら質問履歴がなくなっていて
自分の質問が見られなかったので、お礼が遅くなってしまいました。
Wendy02さんはすごいですよねー。何を聞いてもいとも簡単に解決して下さるので、尊敬しきりです。
私などは、VBAのVの字も知らなかったのに、会社で本をたったの2冊渡されて
「これを見て、このシステムを作れ」なんて、出来る訳ないですよねー。
もっと色んなことを知りたいのですが、本に載ってることには限界があって・・・
やっぱり、経験ですかねー。
なのでWendy02さん達のような、ご親切な方々のおかげで本当に助かっています。
余談が長くてすみません。どうもありがとうございました!!
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 の合わせ技でやった方が確実かもしれません。
KenKen_SPさん、詳しいご説明ありがとうございます。
なんとなくですが、わかったような気がします。
奥が深いですねー。
色々勉強になります。ありがとうございました!!
No.2
- 回答日時:
こんにちは。
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を入れることによって、どう言う効果があるのでしょうか?
今後の勉強のためにも、よろしくお願いします。
No.1
- 回答日時:
こんにちは。
KenKen_SP です。> ユーザーフォームが閉じずに処理を行なってしまいます。
その方が処理中であることが明確でいいと思いますが、、
恐らく Userform1.Hide のあとで、すぐ次の処理へ移ってしまい
Excel がビジーになるため、画面表示が間に合わないためでしょう。
次のようにウェイトを置いてみてください。
Me.Hide
Application.Wait 1
Application.ScreenUpdating = False
'(処理)
それから、Hide はフォームを非表示にするだけで、メモリ上には
残っています。最後に
Application.ScreenUpdating = True
Me.Show
とします。
完全に終了させるなら、
Unload Me
ですね。
KenKen_SPさん、いつもありがとうございます。
ウェイトなるものを置くと、見事解決してくれました!
本当にありがとうございました!!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Access(アクセス) accessについて(超初心者です) 1 2023/02/11 11:18
- Access(アクセス) アクセス 意図せずサブプロシージャを移動してしまうのを止めたい 1 2022/09/02 09:19
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
このQ&Aを見た人はこんなQ&Aも見ています
-
性格悪い人が優勝
できるだけ性格悪い人になって回答をお願いします。
-
【お題】甲子園での思い出の残し方
【お題】「球場の砂を持って帰る」はもう古いと思った高校球児が、甲子園で負けた際に、思い出に残そうと思って行ったこと
-
人生で一番思い出に残ってる靴
皆さんの人生で一番思い入れのある靴の話を伺ってみたいです。
-
スタッフと宿泊客が全員斜め上を行くホテルのレビュー
スタッフも宿泊客も、一流を通り越して全員斜め上なホテルのレビューにありがちな内容を教えて下さい
-
かっこよく答えてください!!
あなたは今にも別れそうなカップルの彼女の恋愛相談に乗っています。
-
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
エクセル VBA実行中のApplication.ScreenUpdatingについて
Excel(エクセル)
-
screenupdatingが機能しなくて困ってます
Visual Basic(VBA)
-
-
4
Application.ScreenUpdatingがならなくなった
Visual Basic(VBA)
-
5
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
6
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
7
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
8
マクロ実行時、ユーザーフォームにラベルのテキストが表示されません。
Access(アクセス)
-
9
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
10
エクセルのマクロで印刷プレビューを閉じる方法
Excel(エクセル)
-
11
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
12
Excel ユーザーフォームをモードレスで表示後
Visual Basic(VBA)
-
13
エクセルStatusBar表示が変化しない
Excel(エクセル)
-
14
コンボボックスの開いたリストを閉じるには
Access(アクセス)
-
15
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
16
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
17
エクセルVBAでコンボボックスの非表示について
iOS
-
18
Accessの画面更新を一時的に停止する方法。
その他(データベース)
-
19
EXCEL VBA 印刷プレビューダイアログのボタン操作を判定したい
Visual Basic(VBA)
-
20
(Excel+VBA)ユーザーフォームのみ表示で完結させたい。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
Excel VBA で処理中断(DoEvents...
-
ボタンが押された事を検知する...
-
「キャンセル」ボタン付きの処...
-
【C#】 あるイベントから別イ...
-
エクセルVBAでクリップボード内...
-
ACCESS側からEXCELの書式を設定...
-
VBA kernel32 の意味
-
VBSの処理中一旦処理を止めて再...
-
OSシャットダウン時の常駐アプ...
-
起動後直に実行するコードはど...
-
スタティックテキストが表示さ...
-
VC++のwin32アプリ作成における...
-
Loopとフリーズ
-
VC++2008にて、画面の動的変更...
-
サスペンド(休止やスタンバイ...
-
マルチスレッドを実現したい
-
for文実行中を途中で中断するに...
-
Excel VBA 実行中に一瞬フリー...
-
終了処理について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
ACCESS側からEXCELの書式を設定...
-
VBA kernel32 の意味
-
メッセージボックスのボタン名変更
-
VBSで応答不要のメッセージボッ...
-
Application.ScreenUpdating=Fa...
-
エクセルVBAでクリップボード内...
-
Excel VBA で処理中断(DoEvents...
-
【C#】 あるイベントから別イ...
-
VBA メッセージボックスを自動...
-
マウスのクリックを無視したい
-
Excel VBA 実行中に一瞬フリー...
-
VBスクリプトで「お待ち下さい...
-
Excel VBA 自動的に閉じるMsgBox
-
VBA、UserFormを前面に出力して...
-
PostMessageの連続送信
-
[VC++] AfxBeginThreadで生成し...
-
【MFC】イベントの無効化について
-
MFCのワーカースレッドとUIスレ...
-
「キャンセル」ボタン付きの処...
おすすめ情報