2009-01-22 9 views

Antwort

58
Declare Sub Sleep Lib "kernel32" Alias "Sleep" _ 
(ByVal dwMilliseconds As Long) 

Verwenden Sie die folgende Syntax, um die Sleep-Funktion aufzurufen:

Sub Sleep() 
Sleep 1000 'Implements a 1 second delay 
End Sub 
+0

Ahh hat gerade das selbst gefunden. Vielen Dank! –

+1

Ich sollte beachten, dass ich in Excel 2007 Sleep direkt ohne Wrapper VBA Sub aufrufen kann. –

+1

Die Declare-Anweisung sollte sich in einem Modul befinden, um zu vermeiden, dass "Anweisungen deklarieren als öffentliche Mitglieder des Objekts nicht zulässig sind". – HuckIt

6

Ein paar Änderungen zu arbeiten, um den Code zu bekommen benötigt. Der folgende Code ist die korrigierte Version.

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

Sub SleepVBA() 
Sleep 1000 'Implements a 1 second delay 
End Sub 
8

Ein anderer Weg, ohne kernel32 mit:

Dim started As Single: started = Timer 

Do: DoEvents: Loop Until Timer - started >= 1 
1

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

irgendwie erstellt zusätzliche Probleme irgendwo anders in meinem Code hinzufügen. I beendet diese Funktion nach oben mit, dass ich auf einem anderen Forum gefunden und tweeked ein bisschen:

Function WaitTime(n As Double) 
'Function that wait an amount of time n in seconds 
TWait = Time 
TWait = DateAdd("s", n, TWait) 
Do Until TNow >= TWait 
    TNow = Time 
Loop 
End Function 

hoffe, das hilft :)

+1

Der einzige Grund, warum ich mir vorstellen kann, dass das Hinzufügen des Funktionskopfs "Probleme" verursachen würde, wenn Sie den Funktionsnamen "Sleep" in einem Modul oder einer Klasse im aktuellen Prozess bereits verwenden würden. –

2

ich dies in Excel verwenden und es funktioniert super:

Application.Wait DateAdd("s", 1, Now()) 

DateAdd() ist eine Funktion, die eine Zeit relativ zu Now() setzt (in diesem Fall können Sie andere Werte als Argument verwenden), "s" ist das Zeitmaß (Sekunden in diesem Fall), und das Inkrement ist 1. So Hier teilt der Funktionsaufruf der App mit 1 Sekunde warten.

See also for more detail about the use of the DateAdd function.

+0

Dies funktioniert nicht in Access as-is – MAW74656

+0

@ MAW74656 Fair genug; Ich habe in Excel gesagt, und ich habe nicht in Access getestet. Du sagst "wie es ist", kennst du einen Workaround? – Gaffi

+0

@ Gaffi- Nein, ich habe keine Ahnung, wie ich umgehen kann. – MAW74656

5

Der ganze Rest der Methoden Excel in Excel immer vollständig unempfänglich Folge warten zu machen. Die Lösung, um Excel warten zu lassen, während eine reaktionsfähige Benutzeroberfläche sichergestellt wird, besteht darin, dieses Warte-Sub mit der Anzahl von Sekunden zu warten, die gewartet werden soll.

Sub Wait(seconds As Integer) 
     Dim now As Long 
     now = Timer() 
     Do 
      DoEvents 
     Loop While (Timer < now + seconds) 
    End Sub 
+0

Das Problem bei der Verwendung dieser Methode ist, dass DoEvents fast die gesamte CPU-Zeit verbraucht. – phrebh

2

Es ist möglich, die Excel Wait() - Prozedur von Access VBA zu verwenden.

Der erste Schritt besteht darin, sicherzustellen, dass die Excel-Bibliothek von Ihrem Projekt referenziert wird.

Wenn dass der folgende Code getan wird für 10 Sekunden warten, arbeiten:

Call Excel.Application.Wait(Time:=DateAdd("s",10,Now())) 
1

Wenn Sie Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long), können Sie diesen Fehler in einem Objektmodul erhalten.

enter image description here

Wenn ja, können Sie es als privat deklarieren:

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