
こんにちは。
VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。
cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。
そこで下記のようなコードを入力しました。
userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1
しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。
しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」
と書いてあるのですが正直、書いてあることがよくわかりません。
どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?
よろしくお願いいたします。

No.2ベストアンサー
- 回答日時:
簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。
注意点ですが、
Private Sub CommandButton1_Click()
Dim i As Long
For i = 1 To 50000
DoEvents
Cells(i,1) = ""
Next i
End Sub
Private Sub CommandButton2_Click()
MsgBox "hoge"
End Sub
っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。
これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。
Private Canceled As Boolean
Private Sub CommandButton1_Click()
CommandButton2.Enabled = False
Dim i As Long
For i = 1 To 50000
DoEvents
If Canceled = True Then
MsgBox "キャンセルしました"
Exit Sub
End If
Cells(i, 1).Value = ""
Next i
End Sub
Private CommandButton2_Click()
Canceled = True
End Sub
コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。
temtecomai2さん
とても詳しい御回答どうもありがとうございました。
今回、『再描画』という意味を初めて知りました。
勉強になります!
temtecomai2さんの書いていただいたコードをコピペしてみて
試してみました!
おかげ様でDoEventsの効果がよくわかりました。
それとDoEventsを入れるのと入れないのでは処理速度も違うんですね。
下の例ではDoEventsを入れた方は78秒、入れなかったほうは25秒でした。
これって制御をOSに渡す時間が下のコードの例では53秒(78-25)も掛かるって事なんでしょうか?
No.8
- 回答日時:
No.7 の件について
このカテゴリーがVisual Basicの為、うっかりVBでプログラム
を作ってしまっていました。
手もとにあるExcel97とExcel2000とで作成してみましたが、
テキストボックスにGotFocusプロパティ自体無く、且つ実行
してもエラーも発生しませんでした。
(Win98SE 及びWin2000)
どうも 19746999 さんが使用しているExcel とはバージョン又
は実行環境が異なる為、動作が異なっている事が考えられ
ます。
don_goさん
こんにちは
・・しまった。。
「EXCELのVBAに関する質問」
って最初に書くの忘れていました。
ごめんなさい。これからは気をつけます・・・。
そうですね!
僕が使っているのはEXCEL2002で
VBAのバージョンは
Microsoft Visual Basic 6.0です。
結局違いがわからないままですが、
過去に書いていただいた方の
アドバイスを参考にして
理解していこうと思います。
それではあと1,2日で質問を締め切ろうと思います。
ポイントあげる人迷うなぁ・・・
No.7
- 回答日時:
間違いの例としては、あまり良いのが浮かばなかったので申し訳ありませんが...
DoEvents の有無により動作の違う例を
Private Sub Text1_GotFocus()
MsgBox "GotFocus"
End Sub
Private Sub Command1_Click()
Text1.Text = 1
Text1.SetFocus
DoEvents
MsgBox "hoge"
End Sub
don_goさん
こんにちは
具体的なご回答ありがとうございます。
・・大変申し訳ないのですが
ユーザーフォームを作って
コマンドボタンとテキストボックスを
そのユーザーフォームの上に作って
(もちろんオブジェクト名は統一させました。)
教えていただいたイベントプロシージャを
コピペして試してみたのですが、
よくわかりません。
と言うより「Gotfocus」イベントが働きません。
なのでDoeventsの有無にかかわらず動きが同じに感じます。
試しにシート上にテキストボックスを作って
教えていただいたコードを入力して
(もちろんオブジェクト名は統一させた。)
Gotfocusイベントが働くか確認するために
そのテキストボックスをクリックすると、
ちゃんとGotfocusイベントが動くのですが、
コマンドボタンをクリックしてマクロを実行すると
setfocusメソッドでのところで下記のエラーが出てしまいます。
↓
オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)
いろいろ考えたのですが
どこが間違っているのかわかりませんでした。
わかりにくい質問だと思いますが
何が間違っているのか教えていただけませんか?
何度も質問してしまって申し訳ございませんが
よろしくお願いします。
No.6
- 回答日時:
DoEventsは、MS-WindowsがUNIXやLinux等のマルチタスクOSではなく、
疑似マルチタスクで有るため必要になるものです。
通常マルチタスクOSでは、同時に実行される各種のプログラムに対して
処理に必要な時間と順序をOSが配分して実行しますが、MS-Windows
ではプログラムから処理が戻ってから(今回ではプロシージャが終了して
から)、次のプログラムやキー入力、マウス入力イベント等を実行します。
従って、時間のかかる処理や無限ループなどがあると、他の処理が実行
できなくなり、極端に全体の反応が遅くなったり、動かなくなったりします。
#画面が白くなるのは、表示の更新が行われなくなるためです。
そうなる事を防ぐ為、DoEventsを実行して、他のプログラムやイベント
処理を実行させる必要があります。
但し、Form上のコントロールに対して値をセットした後、DoEventsを実行
した場合、ChangeやGetFocusイベントが実行され、思っていなかった動作
をする事があるので、使用する場所には十分注意する必要があります。
don_goさん
ご回答ありがとうございます。
たくさんのわかりやすいご回答を頂いてきましたが
更に重要な回答を投稿していただいてうれしいです。
それから、もしよろしければ
>但し、Form上のコントロールに対して値をセットした後、DoEventsを実行
した場合、ChangeやGetFocusイベントが実行され、思っていなかった動作
をする事があるので、使用する場所には十分注意する必要があります。
ごめんなさい・・・この部分もう少し詳しく教えていただけないでしょうか。
面倒くさかったら無視してください^-^
No.4
- 回答日時:
表題の>DoEvents関数って何?
について、DoEventsは関数に分類されず、「ステートメント」に分類されています。
VBAの解説書などでは、
オブジェクト
プロパティ
メソッド
ステートメント
関数
に分類されています。念のため。
意味はWEBで照会してください。
ーー
DoEventsもOKWAVEで質問して、聞くのも良いが、WEB照会したら、働きの説明も、実例も多数出てきますよ。
imogasiさん
ご回答ありがとうございました
>DoEventsもOKWAVEで質問して、聞くのも良いが、WEB照会したら、働きの説明も、実例も多数出てきますよ。
・・・本当だいっぱい出てきた。
教えていただいてありがとうございます。。。
No.3
- 回答日時:
Windowsはイベント-なにかが起きることー
(しかし、それは予期せぬものではなく約束されたもの)
が発生することにより動作します。
たとえばキーが押されたとか、時間が来たとか。
CPUは1っこしかないのでタイムシェアーでいろいろな
プログラムがイベントを発生させて動いています。
しかし、あなた(ユーザー)がそのことを考えずにプログラミング
すると、他のプログラムは自分の番が来ないので動けなくなり、
画面が真っ白になったままになったりするわけです。
最初のコードはCPUを占領します。(そうなっちゃう)
2番目のコードはDoEvents のところで一回処理を止め、
(windows に渡し)次に自分の番がきたときに、
次のステップを続けます。
当然処理速度は桁違いに遅くなります。
otto0001ottoさん
わかりやすいご回答ありがとうございました。
VBAもまだまだ未熟者ですが
パソコン全体の事はもっとド素人です。
もっとパソコンについてオールラウンドな
知識を身につけることが大切だと思いました。
これからも日々勉強を怠らずに頑張ります♪
また何かわからないことがあったら
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Visual Basic(VBA) ユーザーフォームに2つのコンボボックス銀行名「ConboBox1」支店名を「ConboBox2」とし 4 2022/08/03 17:34
- Visual Basic(VBA) VBAで実行時エラー'424' オブジェクトが必要ですと出る 2 2022/10/07 09:25
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて見た映画を教えてください!
初めて見た映画を覚えていますか?
-
いちばん失敗した人決定戦
あなたの「告白」での大失敗を教えてください。
-
最強の防寒、あったか術を教えてください!
とっても寒がりなのですが、冬に皆さんがされている最強の防寒、あったか術が知りたいです!
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
DoEventsがやはり分からない
Visual Basic(VBA)
-
VBA コードを実行すると画面が真っ白になる
Visual Basic(VBA)
-
DoEventsが必要な理由について
Visual Basic(VBA)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
マクロ実行時、ユーザーフォームにラベルのテキストが表示されません。
Access(アクセス)
-
6
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
7
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
8
VBAコード記述に際して、コード全体を自動的にインデント付ける方法
Access(アクセス)
-
9
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
10
Refreshメソッドの使い方
Visual Basic(VBA)
-
11
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
12
Excel VBAで、ユーザーフォームをモードレス表示している間、処理を止めるには?
Visual Basic(VBA)
-
13
VBAで仕様書は書きますか?
Visual Basic(VBA)
-
14
Excel VBA で処理中断(DoEvents)ができなくて困ってい
Visual Basic(VBA)
-
15
VBAでの一時停止と再開の方法
その他(プログラミング・Web制作)
-
16
CloseとDisposeの違い
Visual Basic(VBA)
-
17
「RunSQL」と「Execute」の違い
Access(アクセス)
-
18
テキストボックスのvalueとtextの違い
Visual Basic(VBA)
-
19
ExcelVBA実行後に時々落ちる
Visual Basic(VBA)
-
20
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
Excel VBA での処理時間計測結...
-
SQLの速度をあげるには・・・
-
小数点を含む数値かどうか判断...
-
テキストファイルの空行をスキ...
-
C言語プログラミングで、多項式...
-
プログラミングの授業でPython...
-
VBでの簡易電卓の作成(減算方...
-
VBS でプログラムを先頭から再試行
-
イベントドリブン
-
プログラム上のCPU稼働率低減に...
-
wavelet変換のソフト
-
win10で、正確な待ち時間の作り方
-
C言語でのUTF-8の文字列の処理...
-
ASICの動作
-
If Not c Is Nothing Then ~延...
-
DoEvents関数って何?
-
処理速度向上のための小さな努力
-
Macターミナルで実行中のプログ...
-
バックグラウンドのプロセスの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
win10で、正確な待ち時間の作り方
-
Excel VBAにて、2GB超の点群デ...
-
小数点を含む数値かどうか判断...
-
あっち向いてホイのプログラム...
-
プログラム上のCPU稼働率低減に...
-
DoEvents関数って何?
-
SQLの速度をあげるには・・・
-
テキストファイルの空行をスキ...
-
Excel VBA データ削除の高速化
-
ナップザック問題?をエクセル...
-
If Not c Is Nothing Then ~延...
-
絶対パスの取得について
-
ノットイコールを教えて下さい
-
符号付きにすべきか、符号なし...
-
実行時のCPU使用率を増やしたい
-
基本情報技術者試験詳しい方へ...
-
Excel(VBA)でSetTimer関数を使...
-
VC++2010 GDIオブジェクトの解...
-
テキスト処理の速度の速い言語
おすすめ情報