VBA の DoEventsに対する考察
DoEventsとは 長年その意味が良くわからなかったのがDoEventsです。 DoEvents 関数 (Visual Basic for Applications) | Microsoft Learn MicrosoftのTimer関数のサンプルコードでは、ループの合間にDoEvents が実行されています。 Do While Timer < Start + PauseTime DoEvents ' Yield to other processes. Loop タイマー関数 (Visual Basic for Applications) | Microsoft Learn これ、何のために実行してるの? と思い、今回改めて調べてみました。とても参考になったのは次のページです。 読んで字の如くDoEvents #VBA - Qiita なるほど、DoEventsを実行すると、Excelに対して発生していたイベントをExcelに処理させることができるんですね。 ノンプリエンプティブなマルチタスクOS そこで疑問に思ったのは、上のコードに書かれていたYield to other processes.というコメントです。 他のプロセスにゆずる、と書かれているけど、他のプロセス(Edgeなど)は、そんなことしなくても処理を続行できるのでは?、と思いました。 そして思い出したのは、Windows 3.1など、いにしえのノンプリエンプティブなマルチタスクOSです。 Windows 3.1 系統(95, 98, Me等)のOSは、OSがExcel等のアプリにCPUの使用権を渡すと、アプリが使用権を自発的に返すまで待つという仕組みでした。これだとアプリが使用権を返さないと、他のアプリはもちろん、OSまで停止してしまいます。 実際、昔のWindowsだと、Windowsごとフリーズして、再起動するしかないという事がしばしば起きました。 それに対して、Windows NT系のOS(2000, XP, 7, 8, 10, 11)は、アプリ等の実行時間をOSが管理していて、アプリを強制的に停止して、他のアプリやOSを動かす仕組みです。これだとExcelがマクロを実行中でも、他のアプリ等も実行可能です。 ノンプリエンプテ...