web-dev-qa-db-ja.com

特定の時間停止する方法(エクセル/ VBA)

次のマクロを含むExcelワークシートがあります。私はそれを毎秒ループさせたいのですが、それを実行する関数が見つかれば危険です。できませんか?

Sub Macro1()
'
' Macro1 Macro
'
Do
    Calculate
    'Here I want to wait for one second

Loop
End Sub
97
Keng

待機方法 を使用します。

Application.Wait Now + #0:00:01#

または(Excel 2010以降の場合)

Application.Wait Now + #12:00:01 AM#
120
Ben S

これをあなたのモジュールに追加してください

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

あるいは、64ビットシステムでは

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

あなたのマクロでそれを次のように呼び出します。

Sub Macro1()
'
' Macro1 Macro
'
Do
    Calculate
    Sleep (1000) ' delay 1 second

Loop
End Sub
59
Buggabill

代わりに:

Application.Wait(Now + #0:00:01#)

私は好きです:

Application.Wait(Now + TimeValue("00:00:01"))

後で読む方がずっと簡単だからです。

38
Achaibou Karim

これは私にとって完璧に動作します。 「do until」ループの前後に任意のコードを挿入します。あなたのケースでは、あなたのdoループの内側の最後に5行(time1 =&time2 =& "do until"ループ)を置いてください。

sub whatever()
Dim time1, time2

time1 = Now
time2 = Now + TimeValue("0:00:01")
    Do Until time1 >= time2
        DoEvents
        time1 = Now()
    Loop

End sub
17
clemo

Kernel32.dllでのSleepの宣言は、64ビットExcelでは機能しません。これはもう少し一般的です。

#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
12
dbuskirk

Clemoのコードのクリーンアップされたバージョン - Accessで動作し、Application.Wait関数はありません。

Public Sub Pause(sngSecs As Single)
    Dim sngEnd As Single
    sngEnd = Timer + sngSecs
    While Timer < sngEnd
        DoEvents
    Wend
End Sub

Public Sub TestPause()
    Pause 1
    MsgBox "done"
End Sub
5
Brian Burns

Application.Wait Second(Now) + 1

3
g t

これはsleepに代わるものです:

Sub TDelay(delay As Long)
Dim n As Long
For n = 1 To delay
DoEvents
Next n
End Sub

次のコードでは、ユーザーが "問題を抱えている"場合にスピンボタンを "グロー"効果で点滅させます。ループで "sleep 1000"を使用しても明滅することはありませんが、ループはうまく機能します。

Sub SpinFocus()
Dim i As Long
For i = 1 To 3   '3 blinks
Worksheets(2).Shapes("SpinGlow").ZOrder (msoBringToFront)
TDelay (10000)   'this makes the glow stay lit longer than not, looks Nice.
Worksheets(2).Shapes("SpinGlow").ZOrder (msoSendBackward)
TDelay (100)
Next i
End Sub
2
Reverus

提示されたソリューションのほとんどはApplication.Waitを使用します。これは現在の秒カウントが始まってからすでに経過した時間(ミリ秒)を考慮に入れていないので、それらは最大1秒の本質的な不正確さを持ちます.

Timerによる方法が最善の解決策ですが、深夜0時のリセットを考慮する必要があるため、ここではTimerを使用した非常に正確なSleepメソッドを示します。

'You can use integer (1 for 1 second) or single (1.5 for 1 and a half second)
Public Sub Sleep(vSeconds As Variant)
    Dim t0 As Single, t1 As Single
    t0 = Timer
    Do
        t1 = Timer
        If t1 < t0 Then t1 = t1 + 86400 'Timer overflows at midnight
        DoEvents    'optional, to avoid Excel freeze while sleeping
    Loop Until t1 - t0 >= vSeconds
End Sub

これを使用して睡眠機能をテストします。(デバッグイミディエイトウィンドウを開く:CTRL + G)

Sub testSleep()
    t0 = Timer
    Debug.Print "Time before sleep:"; t0   'Timer format is in seconds since midnight

    Sleep (1.5)

    Debug.Print "Time after sleep:"; Timer
    Debug.Print "Slept for:"; Timer - t0; "seconds"

End Sub
2
cyberponk
Function Delay(ByVal T As Integer)
    'Function can be used to introduce a delay of up to 99 seconds
    'Call Function ex:  Delay 2 {introduces a 2 second delay before execution of code resumes}
        strT = Mid((100 + T), 2, 2)
            strSecsDelay = "00:00:" & strT
    Application.Wait (Now + TimeValue(strSecsDelay))
End Function
2
ITI

私はこれを問題に答えるために作らせました:

Sub goTIMER(NumOfSeconds As Long) 'in (seconds) as:  call gotimer (1)  'seconds
  Application.Wait now + NumOfSeconds / 86400#
  'Application.Wait (Now + TimeValue("0:00:05"))  'other
  Application.EnableEvents = True       'EVENTS
End Sub
1
dave

私は通常Timer関数を使ってアプリケーションを一時停止します。このコードをあなたのものに挿入してください

T0 = Timer
Do
    Delay = Timer - T0
Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds

待機およびスリープ機能はExcelをロックし、遅延が終了するまで他のことはできません。その一方で、ループ遅延はあなたに待つ正確な時間を与えません。

それで、私はこの回避策を両方の概念の少しを結合することにしました。あなたが望む時間になるまでループします。

Private Sub Waste10Sec()
   target = (Now + TimeValue("0:00:10"))
   Do
       DoEvents 'keeps Excel running other stuff
   Loop Until Now >= target
End Sub

遅延が必要な場合は、Waste10Secに電話をかけるだけです。

1
Maycow Moura

これを試して :

Threading.thread.sleep(1000)
0
DEV