
こんにちは、タケイチです。
VBAには、処理を止める。待つ。という動作があります。
この動作には、2つの待ちがあります。
①決めた時間数待つ
②希望の返り値が返ってくるまで待つ
今回は、①の決めた時間数分待つ方法について検討していきます。
処理を一度止めたり、何秒間待つ。という動きには、Sleep関数を使ったり、Waitメソッドを使うのは実際どちらが良いのか?
僕は、使いやすいという理由だけで、自作のDoEventsを使った〇秒待つ!というコードを作っていました。
結論から言うと、Sleep関数が僕的には一番良い!という結論に至りましたが、64ビットと32ビットでの宣言方法の違いがあり、汎用性に欠けていましたので、どちらにでも対応した宣言方法も備忘録として残します。
では、いってみましょう。
結論はSleep関数を使って待つのが最善の方法だ!
Sleep関数、Waitメソッド、DoEventsメソッドの中では、Sleep関数が一番最良でした。
個人的には、Sleep関数は最初の宣言が面倒で避けていて、自作のDoEventsで乗り切っていたんですが、自作のDoEventsはPCに一番負担のかかる方法でした。
Sleep関数のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) #End If Public Sub Sleepを使った待つ() Dim time As Long time = 5000 Sleep time End Sub |
今回のコードで一番重要視しているのは、最近のOSの64Bit主流の流れと昔ながらの32Bit使用者の互換性です。
Sleep関数を使わない理由としては、僕の職場はいろいろなVerが使われているので、どのExcelでもできるようにというのと、どのハードウェアでも対応できるようにと考えました。
何でSleep関数が最強なのか?
Sleep関数の実験をしたので、ぜひ参考にしていただきたいですが、CPUの使用率の上がり方が全然違います。
Sleep :平均4%
Wait :平均26%
DoEvents:平均28%
今回の実験コード紹介
実験に使ったコードを紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
#If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) #End If Public Sub 実験コード() For looprun1 = 1 To 3 Debug.Print "Sleep" & looprun1 Call Sleepを使った待つ Debug.Print "Wait" & looprun1 Call Waitを使った待つ Debug.Print "自作" & looprun1 Call 自作の待つ Next looprun1 For looprun1 = 1 To 3 Debug.Print "Sleep" & looprun1 + 3 Call Sleepを使った待つ Next looprun1 For looprun1 = 1 To 3 Debug.Print "Wait" & looprun1 + 3 Call Waitを使った待つ Next looprun1 For looprun1 = 1 To 3 Debug.Print "自作" & looprun1 + 3 Call 自作の待つ Next looprun1 End Sub Public Sub Sleepを使った待つ() Dim time As Long time = 5000 Sleep time Call CPU使用率を確認する End Sub Public Sub Waitを使った待つ() Dim time As Long time = 5000 Application.Wait [Now()] + time / 86400000 Call CPU使用率を確認する End Sub Public Sub 自作の待つ() Dim itumade As Date Dim ima As Date itumade = time() + TimeSerial(0, 0, 5) Do While itumade > time() DoEvents Loop Call CPU使用率を確認する End Sub Public Sub CPU使用率を確認する() 'WMIにて使用する各種オブジェクトを定義・生成する。 'ローカルコンピュータに接続用のオブジェクト Dim oLocator As Object 'ローカルをさらにサーバー接続用のオブジェクト Dim oService As Object 'ローカルデータをここに格納して必要情報を取得する Dim oClassSet As Object Dim oClass As Object 'CPUの使用率を格納 Dim CPUPercent As Variant 'ローカルコンピュータに接続する。 Set oLocator = CreateObject("WbemScripting.SWbemLocator") Set oService = oLocator.ConnectServer 'クエリー条件を WQL にて指定する。 Set oClassSet = oService.ExecQuery("Select * From Win32_Processor") 'コレクションを解析する。 For Each oClass In oClassSet CPUPercent = oClass.LoadPercentage Next '最後に示す Debug.Print "CPU使用率:" & CPUPercent & "%" 'MsgBox "CPU使用率:" & CPUPercent & "%" '使用した各種オブジェクトを後片付けする。 Set oClassSet = Nothing Set oClass = Nothing Set oService = Nothing Set oLocator = Nothing End Sub |
Declareが間違ってますよ。
かなり遅れての返信申し訳ありません。
コメントありがとうございます。
やってみたんですが、64bitでは動いております。
32bitのPCがなくなってしまった為、32bitの方は試せておりません。
修正をしたいのですが、どのような修正が必要そうでしょうか?