나눔터  
  HOME > 나눔터 > 묻고답하기 > 엑셀
엑셀
엑셀에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내
작성자:  

 놀란토끼 (atmyhome)

추천:  2
파일:     조회:  2269
제목:   [RE]Api에 관한 질문입니다. 부탁합니다.
     
  * 답변하시는 분들께 도움이 되도록 자신의 환경을 아래 항목 옆에 기재해 주세요.

1. 엑셀 버전(95,97,2000,2002): 2000
2. 윈도우즈의 버전(win95,win98,winME,winNT,win2000,winXP): XP
3. CPU (486,PentiumI/II/III/IV...): IV
4. RAM (32,64,128,256,512MB,1G...): 256

* 아래줄에 질문을 작성하세요 >>

좋은신 분들 덕분에 조금씩 실력이 늘고 있는 초보입니다. 감사드립니다.
1초이하의 단위로 시간을 표시하는 방법에 대해서 질문을 올립니다.
자세한 질문내용은 첨부파일에 있습니다.
==============[김상수님 글에 대한 답변입니다]==============

답변이 없어서..... api허접의 답변입니다. 이해당부드립니다.

Sub DDERun()
  strVelocity = "DDES|SF10139!Volume"
  ThisWorkbook.SetLinkOnData strVelocity, "myUpdate"
End Sub

Sub myUpdate()
  With ThisWorkbook.Worksheets("price").Range("A65536").End(xlUp)(2)
    .Value = Timer / 86400
    .Offset(0, 1).Value = ThisWorkbook.Worksheets("price").Range("D2").Value
  End With
End Sub

구문을 사실상 한줄바꾸었습니다.

.Value = Timer / 86400
인데요..
초이하를 18등분 더 쪼개줍니다.(이론상으로는 1/30초 정밀도를 갖는다는데 실제 해보니까 그렇게 까지 정밀하지는 않은거 같습니다.)

따라서 김상수님의 코드가 1초내에 10번이상 수행되지 않는다면 그냥 vb함수인 timer 를 사용하여도 충분하리라 생각됩니다.
(화일첨부합니다. 검토해보세요)


그런데 시간을 정밀하게 측정하는 api는  timeGetSystemTime , timeGetTime 등이 있다고 하여(인터넷 마구 뒤져보다가 발견한거라 엉터리일수 있습니다.),
그중 timeGetTime의 용법을 사용해봤지만
이론상으로는 1/1000초의 정밀도를 갖는다고 하지만 이함수가 오히려 엉터리인거 같습니다.
시간이 거꾸로 가는 사태가 발생되더군요..
(첨부화일의 모듈2에 api함수를 기재해보았습니다.)

결론은 timer함수로 그냥 사용할수 있다면 가급적이면 api함수를 동원할게 아니라 timer함수로 참는게 좋을듯해서.......
==============[놀란토끼님 글에 대한 답변입니다]==============

timeGetTime API함수에 대한 설명을 잘못한거 같습니다.
코드를 다음과 같이 수정합니다.
timeGetTime함수가 엉터리라고 설명붙인 부분은 제가 잠시 착각했습니다. 너그러이 용서를....

Declare Function timeGetTime Lib "winmm.dll" () As Long
Dim old_time
Dim old_gettime
Sub DDERun1()
  strVelocity = "DDES|SF10139!Volume"
  old_time = Timer
  old_gettime = timeGetTime
  ThisWorkbook.SetLinkOnData strVelocity, "myUpdate1"
End Sub

Sub myUpdate1()
  With ThisWorkbook.Worksheets("price").Range("A65536").End(xlUp)(2)
    .Value = old_time / 86400 + (timeGetTime - old_gettime) / 86400000
    .Offset(0, 1).Value = ThisWorkbook.Worksheets("price").Range("D2").Value
  End With
End Sub

부연설명하자면 timeGetTime함수 사용 아주 쉽습니다.
Declare Function timeGetTime Lib "winmm.dll" () As Long
선언만 덜렁해두고
필요한곳 어디든지 인수필요없이 timeGetTime를 적어주면 그것으로 끝납니다.

timeGetTime의 값은 컴퓨터가 부팅된뒤부터 지난 시간을 천분의1초단위로 표시해준다고 하네요. 따라서 시간형식에 맞게 나누기만 해주면 됩니다. timeGetTime/1000/60/60/24 로 나누었습니다.
(위 방식 써도 아무런 무리가 없다고 판단됩니다.)

현재시간을 정확히 기재하는 방식의 정석은 timeGetSystemTime입니다. 황기성님이 너무 자세하게 설명하고 있어 저도 감사하게 생각합니다. 사실 timeGetSystemTime 이 있다는 것말 알았었지 용법은 잘 몰랐었거든요.... 

 
[불량 게시물 신고]  
        
  

작성일 : 2003-08-29(15:43)
최종수정일 : 2003-08-29(15:43)
 


 ◎ 관련글

  제 목   작성자   날짜
Api에 관한 질문입니다. 부탁합니다. 김상수 2003-08-28
[RE]Api에 관한 질문입니다. 부탁합니다. 놀란토끼 2003-08-28
[RE]Api에 관한 질문입니다. 부탁합니다. 놀란토끼 2003-08-29