[[20221105065649]] 『DoEvents関数(VBA)の仕組みにつきまして』(あき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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

>VBAの処理を一時中断させる

というより、処理を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


Sub ttt1()
stt = Time
For i = 1 To 5000
    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


え、そんなに時間がかかりましたか?
新規ブックではないのかな?
私の環境では、おおざっぱに2〜5秒弱程度ですけど。
あ〜、コンマの入れ忘れなら、大体そんな感じでした。

(wey) 2022/11/05(土) 12:02:18


(wey)さん

 度重ね、ご返答を下さいまして、ありがとうございます。

 >私の環境では、おおざっぱに2〜5秒弱程度ですけど。

 使用パソコンは10年前以上のパソコン[ Let's note CF-S10 ]です。
 メモリはSSDを使用しています。 自分の環境では、23〜40秒でした。
 あまりにも差が大きいです。
 パソコンの性能、特にスピードが関係していると考えます。
 性能が良ければDoEvents追加の必要もないと考えました。
 2〜5秒弱程度の情報は、大変参考になりました。
 パソコンの性能が問題を引き起こしているものと感じました。
 本当にありがとうございました。

(あき) 2022/11/05(土) 12:37:53


Let's note CF-S10 調べてみました。
Core i5 2540M(2.6GHz)
私のPCより全然高性能じゃないですか。
2010年のノートPC物だし。

Windows10にするとそんなに遅くなるんですか。
遅くなると聞いてて、Windows10にするのをためらっていたんですけど。
やっぱりWindows10にしないで正解かも?
情報ありがとうございました。

(wey) 2022/11/05(土) 13:00:32


(wey)さん

 度重ね、ご返答を下さいまして、ありがとうございます。

 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

INTEL(R)CORE(TM)I5-4200U 1.6GHZ
Windows10 64BIT INTEL(R)CORE(TM)I5-4200U 1.6GHZ

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


Windows10かEXCEL 2019か分かりませんが、?
(???) 2022/11/05(土) 19:25:27

 (???)さん

 済みません。説明不足がありました。

 同じ、パソコン[ 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

Office2007_32bitなので
ttt1とttt2しかできませんでした。
第1世代?の i5-M520 2.4GHz

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.