投稿

4月, 2024の投稿を表示しています

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がマクロを実行中でも、他のアプリ等も実行可能です。 ノンプリエンプティブOSにおけるDoEventsは、Ex

VBA でWaitやSleepを使う際の問題

VBAには、そのものずばりの Wait もしくは Sleep がありません。 Application.Wait Application.Wait は指定した「時間」の停止ではなく、指定した「時刻」まで処理を停止するというよく分からない仕様です。そして何より、Application.Waitは動作が安定していません。 試しに次のようなプロシージャーを実行してみます。 Sub uTest()     Dim uStart          uStart = Timer     uWait 1     Debug.Print Timer - uStart '経過時間を表示 End Sub Sub uWait(ByVal uSeconds)     Application.Wait (Now + uSeconds / 86400) End Sub 結果は次の通りで、全く安定しません。  0.921875   0.78125   0.90625   1   0.234375   0.4453125   0.8515625   0.03125   0.59375  私の使い方が悪いのかバグがあるのか。 Timer 関数 そこで、Timer関数を使って次のようなプロシージャーを書いて見ました。 参考にしたのは、次のページです。 タイマー関数 (Visual Basic for Applications) | Microsoft Learn Sub uWait(ByVal uSeconds As Single)     Dim uStart As Single     Dim uElapsed As Single          uStart = Timer          Do         uElapsed = Timer - uStart         If uElapsed < 0 Then '午前0時を超えた場合             uElapsed = uElapsed + 86400 '60 * 60 * 24 seconds         End If     Loop Until uElapsed > uSeconds End Sub 4回実行した結果は、次のとおり概ね正確です。  1.001953   1.001

Defender for Buisiness を試験導入

イメージ
法人版の365 Business Standard を使っているので、セキュリティもDefender for Business を使ってみようかと思いました。 とりあえず、365の管理画面から、試用版の無料ライセンスを入手し、ユーザーに割り当てます。 ライセンスを入手して管理画面が使えるようになるまで結構時間がかかります。 Windows PCをオンボード 次にDefenderの管理画面の「設定」「エンドポイント」「オンボーディング」から、オンボードパッケージをダウンロードし、そこからスクリプトを取り出して実行し、Windows 11 PCをオンボードしました。 オンボードしてから、PCの情報が取得できるまで結構時間がかかります。下手すると次の日じゃないと更新されないんじゃないかと思っています。 オンボードが完了してから、PCのデスクトップにEICARテストファイルを作成するときちんと検出されました。 デバイスのインベントリー デバイスのインベントリ画面を見ると、PCの露出レベルが「中」になっていたため、調べると、Visual Studio 等が古いままだったので、削除したり、更新したりしました。 Defender for Businessのいいところは、Microsoft製品以外の 7-zip や Acrobat、Chrome等のアプリの脆弱性も警告しくれるところです。 また、メールで実行可能ファイルを実行できてしまうなど、設定の甘いところも指摘してくれます。 Macのオンボード 問題だったのはMacの追加でした。 インストールパッケージとオンボードパッケージをダウンロードし、インストールしたのですが、フルディスクアクセスのところにMicrosoft Defenderが表示されませんでした。 その状態で、EICARテストファイルをダウンロードしたりスキャンして見たりしましたが、全然検出されませんでした。 どうやら、オンボードパッケージを実行する際に、インストールパッケージが必要だったようです。 インストールパッケージを再度ダウンロードして、オンボードパッケージを再度実行したところ、表示されるようになり、無事にフルディスクアクセスを許可することができました。 その結果、EICARテストファイルがきちんと検出されるようになりました。これで一安心です。 Manual d