2015-01-08 5 views
1

MS Access 2010에서 쿼리를 실행하는 동안 상태 표시 줄 업데이트에 관한 질문을 게시했습니다. 관심이 있으시면 How to show progress on status bar when running a sequence of queries in MS Access을 참조하십시오.코드 실행시 상태 표시 줄의 진행 상태 표시 방법 (쿼리가 아님)

작동하지 않는 코드에 대한 매우 간단한 질문입니다. 누군가가 대답 할 수 있다면 더 복잡한 질문에 대한 코드가 작동하지 않는 이유를 이해하는 데 도움이되기를 바랍니다.

Function PutMessageInStatusBar1() 

Dim RetVal As Variant 
Dim i As Long 

RetVal = SysCmd(4, "Before loop 1") 
For i = 1 To 500000000 
Next 

RetVal = SysCmd(4, "Before loop 2") 
For i = 1 To 500000000 
Next 

RetVal = SysCmd(4, "Before loop 3") 
For i = 1 To 500000000 
Next 
RetVal = SysCmd(5) 

End Function 

코드를 실행하는 데 매크로를 작성했습니다. 경고를 끄고 위의 함수를 호출하고 "Finished"라는 메시지 상자를 표시 한 다음 경고를 켭니다.

실행하면 상태 표시 줄에 "준비"라고 표시됩니다. 아마도 코드에서 루프 1을 실행하는 동안 일시 중지가 발생합니다. 그런 다음 "이전 루프 2"와 마지막으로 "루프 3 이전"을 표시합니다.

왜 "Before loop 1"이 표시되지 않습니까?

RetVal = syscmd (5)를 함수의 시작 부분에 두어 어떤 차이가 있는지 확인하려고했습니다. 그렇지 않았습니다.

답변

2

SysCmd 호 이후에 DoEvents으로 전화하십시오. 그러면 코드가 향상되기 전에 Windows가 디스플레이를 업데이트하라는 신호를 보냅니다.

이 기능에서는 다음 상태 표시 전에 각 상태 표시 줄 메시지가 표시됩니다.

Function PutMessageInStatusBar2() 
    Const lngMilliseconds As Long = 1000 

    SysCmd acSysCmdSetStatus, "Before loop 1" 
    DoEvents 
    Sleep lngMilliseconds 
    SysCmd acSysCmdSetStatus, "Before loop 2" 
    DoEvents 
    Sleep lngMilliseconds 
    SysCmd acSysCmdSetStatus, "Before loop 3" 
    DoEvents 
    Sleep lngMilliseconds 
    SysCmd acSysCmdSetStatus, "Done." 
    DoEvents 
    Sleep lngMilliseconds 

    SysCmd acSysCmdClearStatus 

End Function 

Sleep는 Windows API 방식을 기반으로하며 표준 모듈의 선언 구역에 선언 :

Option Compare Database 
Option Explicit 
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 
+0

이 완벽! 정말 고마워요. 미치게 만들어 줬어요. 나는 또한 상수와 절전 기능을 사용하여 주셔서 감사합니다 - 훨씬 깨끗한 코드를 만듭니다. – Zajonc

+0

반갑습니다. Sleep 기능은 32 비트 VBA에서 유용합니다. 나는 그것이 64 비트 VBA를 위해 변경 될 필요가 있을지도 모른다라고 생각한다. 그러나 나는 그것을 아직도 다루지 않고 있었다. – HansUp

+0

한 가지 질문 : 왜 SysCmd 5 대신 SysCmd acSysCmdSetStatus, ""를 사용 했습니까? – Zajonc