[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『DoEvents関数(VBA)の仕組みにつきまして』(あき)
お世話になります。
めったにありませんが参考例になりますが、TextBox1 = 1 にしてもエクセルのテキストボックスに
1が表示されない場合があります。その場合はTextBox1 = 1の後にDoEventsを追加することで表示
されます。
・
・
TextBox1 = 1
DoEvents
DoEvents関数はVBAの処理を一時中断させて(VBAの処理を離れ)OSに処理を渡すことでExcelの操作が可能とありました。
DoEventsによって、VBAの処理を一時中断させるとTextBox1 = 1が表示されるようになる仕組みが
分かりません。
ご教示願えますと幸いです。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
回答ではなく感想文です。 https://surleconomiejp.blogspot.com/2016/07/doevents.html こちらに幾分詳しい説明があるようです。 # 分かったことになる保証はありませんが。
こちら側の制御を短期的に止めて、TextBox1 = 1に伴う画面更新などの処理が行われる余裕を与えるもの、 くらいのイメージでいいのかなとは個人的には思います。 そうした事象が発生しなければ予め使うことは稀で、 必要に迫られて結構おまじない的に使うことが多い、 たいていはもやもやしながら使う人が多いかも知れませんね。
DoEventsは1つじゃだめで、3つくらい続けて始めて成功するなんてこともあるし、 その時、なぜ3つでないとダメかといったことはわからないのが普通で、 結果オーライですますことが多いでしょう。
本当に理解するには、VBAとは別に、Windowsプログラムのようなものを本格的に学習する必要が あるのかなと想像しています。 一般的なVBA利用者にとっては余り深入りするメリットは乏しそうな印象ですが、 興味があれば、取り組まれてはいかがですか? (γ) 2022/11/05(土) 09:22:41
というより、処理を1次的にOSに渡してOS側の処理をさせる
と言った感じ。
描写し切れてなかった画面描写の続きや、たまっていた処理の残骸などの後かたずけなどなど。
なんとなくOSがマクロの処理に追い付いていないとか感じたら入れてみるといいかも。
それとやっている事を1次中断するわけだから遅くはなります。
(wey) 2022/11/05(土) 09:28:49
ご返答を下さいまして、ありがとうございます。
># 分かったことになる保証はありませんが。 はい、分かりました。 感想文は、参考になりました。
別の件にもなりますが時々[応答なし]になる事がありました。 DoEventsを追加することで現在まで[応答なし] になることはないです。 Workbooks("xxx.xlsm").Worksheets("xx").Activate DoEvents '追加
自分も感想文になりますが以下のように思いました。 DoEventsは確実に動作するようにしているのでTextBox1 = 1の表示、 [応答なし]が改善されたのかと思っています。 OSに渡しても確実に動作するようにVBAで動作しているのではと思いました。
(あき) 2022/11/05(土) 10:27:33
(wey)さん
ご返答を下さいまして、ありがとうございます。
>VBAの処理を一時中断させるというより、処理を1次的にOSに渡してOS側の処 >理をさせると言った感じ。 >OSがマクロの処理に追い付いていないとか感じたら入れてみるといいかも。 はい、分かりました。参考になりました。 OSに渡しても中断ではないので確実に動作するようにVBAが動作していると思いました。
(あき) 2022/11/05(土) 10:29:02
Cells(i, 1).Select Cells(i, 1).Value = i Next MsgBox Time - stt End Sub
Sub ttt2()
stt = Time
For i = 1 To 5000
Cells(i, 1).Select Cells(i, 1).Value = i DoEvents Next MsgBox Time - stt End Sub (wey) 2022/11/05(土) 10:40:56
(wey)さん
度重ね、ご返答を下さいまして、ありがとうございます。
Sub ttt1() 23秒 Sub ttt2() 40秒(DoEvents)使用の場合 >1次中断するわけだから遅くはなります。 はい、分かりました。 大変、参考になりました。
(あき) 2022/11/05(土) 11:29:03
(wey) 2022/11/05(土) 12:02:18
度重ね、ご返答を下さいまして、ありがとうございます。
>私の環境では、おおざっぱに2〜5秒弱程度ですけど。
使用パソコンは10年前以上のパソコン[ Let's note CF-S10 ]です。 メモリはSSDを使用しています。 自分の環境では、23〜40秒でした。 あまりにも差が大きいです。 パソコンの性能、特にスピードが関係していると考えます。 性能が良ければDoEvents追加の必要もないと考えました。 2〜5秒弱程度の情報は、大変参考になりました。 パソコンの性能が問題を引き起こしているものと感じました。 本当にありがとうございました。
(あき) 2022/11/05(土) 12:37:53
Windows10にするとそんなに遅くなるんですか。
遅くなると聞いてて、Windows10にするのをためらっていたんですけど。
やっぱりWindows10にしないで正解かも?
情報ありがとうございました。
(wey) 2022/11/05(土) 13:00:32
度重ね、ご返答を下さいまして、ありがとうございます。
PCに問題がないことを感じましたので一安心しました。
今後、Sub ttt1()、Sub ttt2()を使わせていただきます。
色々と、お世話になりました。
本当にありがとうございました。 (あき) 2022/11/05(土) 14:32:59
DoEventsを入れても、それほど遅くならない方法があります。
■T'sWare Access Tips #114 〜DoEventsをパフォーマンスを下げずに使う方法〜 https://tsware.jp/tips/tips_114.htm
Option Explicit Declare PtrSafe Function GetInputState Lib "user32" () As Long
Sub ttt1() Dim stt As Single, i As Long stt = Timer For i = 1 To 10000 Cells(1, 1).Value = i Next Debug.Print "DoEventsなし", , Format(Timer - stt, "0.000000") End Sub
Sub ttt2() Dim stt As Single, i As Long stt = Timer For i = 1 To 10000 Cells(1, 1).Value = i DoEvents Next Debug.Print "DoEventsあり", , Format(Timer - stt, "0.000000") End Sub
Sub ttt3() Dim stt As Single, i As Long stt = Timer For i = 1 To 10000 Cells(1, 1).Value = i If GetInputState() Then DoEvents Next Debug.Print "DoEvents+GetInputState", Format(Timer - stt, "0.000000") End Sub
イミディエイトウィンドウの結果(単位 秒) DoEventsなし 8.648438 DoEventsあり 21.320310 DoEvents+GetInputState 8.863281
Windows11 MS365 64bit (hatena) 2022/11/05(土) 15:48:06
Sub ttt1()10〜13秒 Sub ttt2() 15〜18秒
DoEventsなし 0.828125
DoEventsあり 11.046880
DoEvents+GetInputState 0.828125
EXCEL 2013 32BIT
(???) 2022/11/05(土) 16:16:44
(hatena)さん
ご返答を下さいまして、ありがとうございます。
>DoEventsを入れても、それほど遅くならない方法があります。 Windows11 64 ビット EXCEL 2019 32BIT DoEventsなし 0.714844 DoEventsあり 15.238280 DoEvents+GetInputState 0.722656 DoEventsを入れても入れなくとも0.7秒台で変わりませんでした。
貴重な情報提供を下さいまして、ありがとうございました。
(あき) 2022/11/05(土) 18:13:34
(???)さん
ご返答を下さいまして、ありがとうございます。
データー提供を下さいまして、ありがとうございました。
>DoEventsなし 0.828125 >DoEventsあり 11.046880 >DoEvents+GetInputState 0.828125
Windows10 64 ビット EXCEL 2019 32BIT DoEventsなし 10.937500 DoEventsあり 12.808590 DoEvents+GetInputState 11.527340
分かりませんがデータを見ますとWindows10かEXCEL 2019か分かりませんが、 設定、破損・・も考えます? (あき) 2022/11/05(土) 18:15:32
追記分になります。
Windows11 64 ビット EXCEL 2021 64BIT
DoEventsなし 1.757813 DoEventsあり 29.359380 DoEvents+GetInputState 1.757813
(あき) 2022/11/05(土) 18:42:19
(???)さん
済みません。説明不足がありました。
同じ、パソコン[ Let's note CF-S10 ]3台を所有して各台別に1〜3をインストールしています。
1.Windows11 64 ビット EXCEL 2019 32BIT 2.Windows10 64 ビット EXCEL 2019 32BIT
追記分 3.Windows11 64 ビット EXCEL 2021 64BIT
(あき) 2022/11/05(土) 20:14:35
そうじゃなくて >DoEventsなし 0.828125 >DoEventsあり 11.046880 >DoEvents+GetInputState 0.828125 は私のデータですよね。 これにいちゃもん付けているのかということ。 スペックは記載しているけど。 (???) 2022/11/05(土) 21:05:11
>DoEventsなし 0.828125 >DoEventsあり 11.046880 >DoEvents+GetInputState 0.828125 >は私のデータですよね。 はい、(???)さんのデーターです。
相手の記載は頭に必ず[>]を付けて自分の記載でない事を示していました。 他の所でも相手の記載には[>]付けて行っています。 [>]の使い方で間違っていましたら、大変申し訳ありませんでした。
(あき) 2022/11/05(土) 21:24:46
私のサンプルコードのみなさんの結果、私のと比べると速いですね。 なんでだろう?と思ってテストしたシートを見直したら、 別のセルに数式が埋め込まれていたのでそれを削除したらすこし速くなりました。
DoEventsなし 3.304688 DoEventsあり 11.828130 DoEvents+GetInputState 3.429688
Windows11 64bit Microsoft365のExcel 64bit
でも、???さんやあきさんのように1秒は切れませんでした。
PCのスペックは、 CPU Ryzen7 4700GE RAM 16GB (hatena) 2022/11/05(土) 22:23:55
DoEventsなし 2.312500
DoEventsあり 3.554688
API入れて見ようかと思ったのですが、Office2010からみたいですし,
>Office2007は2017年に延長サポートも既に終了しています。
>サポート終了のものを使い続けるのは、セキュリティ上非常に危険なのでやめるべきです。
との事なので止めました。
(wey) 2022/11/05(土) 22:37:04
>[>]の使い方で間違っていましたら、大変申し訳ありませんでした。 そういうことではありません。 >Windows10かEXCEL 2019か分かりませんが、? と言っているので私宛かなという意味でした。 (???) 2022/11/06(日) 08:15:03
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.