달력

5

« 2024/5 »

  • 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
2013. 3. 29. 11:06

엑셀VBA - 타이머 엑셀VBA 이야기2013. 3. 29. 11:06

728x90
반응형

 

엑셀VBA - 타이머 

출처 카페 > 파워포인트전문가클럽 | 후다닥
원문 http://cafe.naver.com/powerpoint/772
  STEP> 따라하기
 

PC의 가장 큰 미덕 중 하나는 빠르다는 것입니다. 분명 예전보다 빠른 컴퓨팅
의 시대에 살고 있지만 우리는 PC가 빠르다는 것을 오래 체감하진 못합니다. 새로운 PC를 사거나 업그레이드를 하거나 새로 OS를 막 설치했을 때 느끼려나...그런데 프로그래밍의 경우 종종 "빨리 빨리"가 아닌 잠깐 멈추고 싶은 경우가 생기죠 그래서 종종 몇 초를 멈추었다가 다시 시작하는 방법을 묻는 질문이 있습니다

그래서 생각하는 꼼수 중 하나는 수 십만 법을  헛 루프 돌리는 것입니다. For~Next Do~Loop를 사용하여 아무 하는 일 없이 수 십 만법 돌리도록 하는 것입니다. 그러나 이런 경우 성능이 좋은 PC와 그렇지 않은 PC간에 차이가 생길 겁니다. 성능이 좋아 수 십만 법의 루프를 10초 내 끝내는데, 성능이 떨어지는PC는 몇 10분 정도 걸리는 수가 있습니다. 그래서 오늘은 몇 가지의 시간지연함수를 소개하고자 합니다

<1> DelayTime()함수

다음의 DelayTime()함수 시작시점을 Timer함수로 얻어오고 여기에 원하는 시간을 더해 루프를 돌 때 마다 확인합니다. 물론 Do~Loop를 반복하는 동안 DoEvents를 사용하여 CPU를 독점하여 사용하지 않도록 합니다.

Sub DelayTime(PauseTime As Single)
    Dim start      As Single   

    start = Timer
    Do While Timer < start + PauseTime
        DoEvents
    Loop

End Sub

<2> WaitSeconds()함수

다음은 더 간단하게 한 줄로 끝내는 함수입니다. 아래의 WaitSeconds()함수Application개체의 Wait메소드를 사용합니다.

[Wait메소드에 대한 도움말]

지정한 시간 동안 실행 중인 매크로를 잠시 중지합니다. 지정한 시간이 되면 True를 반환합니다.

*중요*
Wait 메소드는 모든 작업을 일시 중지하여 Wait가 영향을 주는 동안 다른 작업을 실행할 수 없게 합니다. 그러나 인쇄나 재계산과 같은 백그라운드 작업은 계속할 수 있습니다.

Wait메소드 다음에 언제까지 중단할지를 지정합니다. 그래서 "Now+얼마"를 하면 지금으로부터 얼마간을 중단하게 됩니다.

Sub WaitSeconds(waitTime As Integer)
    Application.Wait (Now + TimeValue("00:00:" & Format(waitTime, "00")))

End Sub

<3> Sleep()함수

API함수를 사용하는 방법도 있습니다. Sleep()이라는 함수를 사용하는데, 매개변수로는 밀리세컨즈를 줍니다. 그러니까 우리에게 친숙한 초 단위를 밀리세컨즈로 바꾸려면 1000을 곱하면 됩니다. 가령 다음의 경우 3초를 지연시키기 위해‘3000'을 주었습니다.

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sleep (3000)  '// Will pause for 3 seconds

<4> GetTickCount함수

또 다른 API함수로 GetTickCount라는 함수를 사용하기도 합니다.

Declare Function GetTickCount Lib "kernel32" () As Long 

Sub Delay(nSeconds As Long)
  Dim TimeOut As Long 

  TimeOut = (GetTickCount / 1000) + nSeconds
  Do
    DoEvents
  Loop Until TimeOut < (GetTickCount / 1000)
End Sub


728x90
반응형
:
Posted by mapagilove