현재 오프라인 상태입니다. 인터넷에 다시 연결하기를 기다리고 있습니다.

Excel용 RealTimeData 서버를 만드는 방법

Office 2003에 대한 지원이 종료되었습니다.

Microsoft는 2014년 4월 8일 Office 2003에 대한 지원을 종료했습니다. 이러한 변경에 따라 해당 소프트웨어 업데이트 및 보안 옵션이 영향을 받습니다. 사용자에게 미치는 영향 및 계속 보호를 받는 방법에 대해 알아보십시오.

요약
Microsoft Excel에서 제공하는 RTD라는 새로운 워크시트 함수를 사용하여 실시간으로 데이터를 검색하기 위해 COM(구성 요소 개체 모델) 자동화 서버를 호출할 수 있습니다. 이 문서에서는 Visual Basic을 사용하여 Excel의 RTD 함수와 함께 사용할 RealTimeData 서버를 만드는 방법을 설명합니다.
추가 정보
RTD 워크시트 함수에는 다음 구문이 포함되어 있습니다.
=RTD(ProgID,Server,String1,[String2],...)
첫 번째 인수인 ProgID는 RealTimeData 서버의 ProgID(프로그래밍 ID)를 나타내고, Server 인수는 RealTimeData 서버가 실행되는 컴퓨터의 이름을 나타냅니다. RealTimeData 서버를 로컬로 실행하는 경우에는 이 인수를 null 문자열로 지정하거나 생략할 수 있습니다. 나머지 인수들은 단순히 RealTimeData 서버에 보낼 매개 변수를 나타냅니다. 이러한 매개 변수의 고유한 각 조합은 "항목 ID"가 연결되어 있는 하나의 "항목"을 나타냅니다. 매개 변수는 대/소문자를 구분합니다. 예를 들어, 다음 구문은 RTD 서버를 호출하여 서로 다른 세 개의 항목 id를 만드는 방법을 보여 줍니다.
=RTD("ExcelRTD.RTDFunctions",,"AAA", "10")

=RTD("ExcelRTD.RTDFunctions",,"AAA", "5")

=RTD("ExcelRTD.RTDFunctions",,"aaa", "5")
COM 자동화 서버를 Excel의 RTD 함수와 함께 사용할 RealTimeData 서버로 만들려면 COM 자동화 서버에서 IRTDServer 인터페이스를 구현해야 합니다. 즉, 다음과 같은 IRTDServer 메서드를 모두 구현해야 합니다.

ServerStart
Excel에서 RealTimeData 서버의 첫 번째 RTD 항목을 요청하면 호출됩니다. ServerStart는 성공하면 1을 반환하고 실패하면 음수 값을 반환해야 합니다. ServerStart 메서드의 첫 번째 매개 변수는 RealTimeData 서버에서 업데이트가 있음을 Excel에 알릴 때 사용하는 콜백 개체입니다.
ServerTerminate
Excel에서 RealTimeData 서버의 RTD 항목이 더 이상 필요 없으면 호출됩니다.
ConnectData
Excel에서 RealTimeData 서버의 새 RTD 항목을 요청하면 호출됩니다.
DisconnectData
Excel에서 특정 항목이 더 이상 필요 없으면 호출됩니다.
HeartBeat
RealTimeData 서버의 업데이트 알림이 Excel에 마지막으로 전달된 후 지정된 시간이 경과하면 Excel에서 호출됩니다.
RefreshData
Excel에서 항목의 새로 고침을 요청하면 호출됩니다. RefreshData는 RealTimeData 서버에서 업데이트가 있음을 Excel에 알린 후에 호출되며 업데이트할 항목의 수와 함께 각 항목의 ID와 값을 반환합니다.

예제 RealTimeData 서버 만들기

다음 예제에서는 Microsoft Excel 2002에서 RealTimeData 서버를 만들고 사용하는 방법을 보여 줍니다. 이 서버는 단순히 워크시트에서 10초마다 업데이트되는 카운터를 제공합니다. 이 서버는 항목 문자열을 두 개까지 허용합니다. 첫 번째 항목 문자열은 AAA, BBB 및 CCC일 수 있습니다. 이외의 다른 항목 문자열은 잘못된 것으로 간주되고 RTD 함수에 #VALUE!가 반환됩니다. 두 번째 문자열은 반환 값이 증가되는 방법을 나타내는 숫자 값입니다. 두 번째 문자열을 생략하면 증가 값이 기본값인 1로 설정됩니다. 두 번째 문자열이 숫자 값이 아니면 RTD 함수에 #NUM!이 반환됩니다.
  1. Visual Basic에서 새 ActiveX DLL 프로젝트를 시작합니다.
  2. 프로젝트 메뉴에서 참조를 누르고 Excel 개체 라이브러리를 선택한 다음 확인을 누릅니다.
    Microsoft Excel 2002의 경우 Microsoft Excel 10.0 Object Library를 선택합니다.
    Microsoft Office Excel 2003의 경우 Microsoft Excel 11.0 Object Library를 선택합니다.
  3. 프로젝트 메뉴에서 Project1 속성을 누릅니다. 프로젝트 이름ExcelRTD로 변경한 다음 확인을 누릅니다.
  4. 클래스 모듈 Class1이름 속성을 RTDFunctions로 변경합니다. RTDFunctions에 다음 코드를 추가합니다.
    Option ExplicitImplements IRtdServer  'Interface allows Excel to contact this RealTimeData serverPrivate m_colTopics As Collection    Private Function IRtdServer_ConnectData(ByVal TopicID As Long, Strings() As Variant, GetNewValues As Boolean) As Variant    '** ConnectData is called whenever a new RTD topic is requested        'Create a new topic class with the given TopicId and string and add it to the    'm_colTopics collection    Dim oTopic As New Topic    m_colTopics.Add oTopic, CStr(TopicID)    oTopic.TopicID = TopicID    oTopic.TopicString = Strings(0)    If UBound(Strings) >= 1 Then oTopic.SetIncrement Strings(1)        'For this example, the initial value for a new topic is always 0    IRtdServer_ConnectData = oTopic.TopicValue        Debug.Print "ConnectData", TopicIDEnd FunctionPrivate Sub IRtdServer_DisconnectData(ByVal TopicID As Long)   '** DisconnectData is called whenever a specific topic is not longer needed      'Remove the topic from the collection   m_colTopics.Remove CStr(TopicID)      Debug.Print "DisconnectData", TopicIDEnd SubPrivate Function IRtdServer_Heartbeat() As Long    '** Called by Excel if the heartbeat interval has elapsed since the last time    '   Excel was called with UpdateNotify.    Debug.Print "HeartBeat"End FunctionPrivate Function IRtdServer_RefreshData(TopicCount As Long) As Variant()    '** Called when Excel is requesting a refresh on topics. RefreshData will be called    '   after an UpdateNotify has been issued by the server. This event should:    '   - supply a value for TopicCount (number of topics to update)    '   - return a two dimensional variant array containing the topic ids and the    '     new values of each.       Dim oTopic As Topic, n As Integer    ReDim aUpdates(0 To 1, 0 To m_colTopics.Count - 1) As Variant    For Each oTopic In m_colTopics        oTopic.Update        aUpdates(0, n) = oTopic.TopicID        aUpdates(1, n) = oTopic.TopicValue        n = n + 1    Next    TopicCount = m_colTopics.Count    IRtdServer_RefreshData = aUpdates      Debug.Print "RefreshData", TopicCount & " topics updated"End FunctionPrivate Function IRtdServer_ServerStart(ByVal CallbackObject As Excel.IRTDUpdateEvent) As Long    '** ServerStart is called when the first RTD topic is requested        Set oCallBack = CallbackObject    Set m_colTopics = New Collection    g_TimerID = SetTimer(0, 0, TIMER_INTERVAL, AddressOf TimerCallback)    If g_TimerID > 0 Then IRtdServer_ServerStart = 1       'Any value <1 indicates failure.        Debug.Print "ServerStart"End FunctionPrivate Sub IRtdServer_ServerTerminate()    '** ServerTerminate is called when no more topics are needed by Excel.        KillTimer 0, g_TimerID    '** Cleanup any remaining topics. This is done here since     '   IRtdServer_DisconnectData is only called if a topic is disconnected     '   while the book is open. Items left in the collection when we terminate    '   are those topics left running when the workbook was closed.    Dim oTopic As Topic    For Each oTopic In m_colTopics        m_colTopics.Remove CStr(oTopic.TopicID)        Set oTopic = Nothing    Next    Debug.Print "ServerTerminate"  End Sub					
  5. 프로젝트 메뉴에서 클래스 모듈 추가를 누릅니다. 클래스 모듈의 이름 속성을 Topic으로 변경하고 인스턴싱 속성을 전용으로 변경합니다. Topic 클래스 모듈에 다음 코드를 추가합니다.
    Option ExplicitPrivate m_TopicID As LongPrivate m_TopicString As StringPrivate m_Value As VariantPrivate m_IncrementVal As LongPrivate Sub Class_Initialize()    m_Value = 0    m_IncrementVal = 1End SubFriend Property Let TopicID(ID As Long)    m_TopicID = IDEnd PropertyFriend Property Get TopicID() As Long    TopicID = m_TopicIDEnd PropertyFriend Property Let TopicString(s As String)    s = UCase(s)    If s = "AAA" Or s = "BBB" Or s = "CCC" Then        m_TopicString = s    Else        m_Value = CVErr(xlErrValue) 'Return #VALUE if not one of the listed topics    End If End PropertyFriend Sub Update()    On Error Resume Next 'the next operation will fail if m_Value is an error (like #NUM or #VALUE)    m_Value = m_Value + m_IncrementValEnd SubFriend Sub SetIncrement(v As Variant)    On Error Resume Next    m_IncrementVal = CLng(v)    If Err <> 0 Then        m_Value = CVErr(xlErrNum) 'Return #NUM if Increment value is not numeric    End If End SubFriend Property Get TopicValue() As Variant    If Not (IsError(m_Value)) Then        TopicValue = m_TopicString & ": " & m_Value    Else        TopicValue = m_Value    End If End Property					
  6. 프로젝트 메뉴에서 모듈 추가를 선택합니다. 새 모듈에 다음 코드를 추가합니다.
    Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, _ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As LongPublic Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As LongPublic Const TIMER_INTERVAL = 5000Public oCallBack As Excel.IRTDUpdateEventPublic g_TimerID As LongPublic Sub TimerCallback(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)    oCallBack.UpdateNotifyEnd Sub					
  7. 파일 메뉴에서 ExcelRTD.dll 만들기를 눌러 구성 요소를 빌드합니다.

Excel에서 RTD 사용

  1. Microsoft Excel에서 새 통합 문서를 시작합니다.
  2. A1 셀에 다음 수식을 입력하고 Enter 키를 누릅니다.
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    초기 반환 값은 "AAA: 0"입니다. 이 값은 5초 후 "AAA: 10"으로 업데이트되고 10초 후 "AAA:15"로 업데이트되는 방식으로 업데이트됩니다.

  3. A2 셀에 다음 수식을 입력하고 Enter 키를 누릅니다.
    =RTD("ExcelRTD.RTDFunctions",,"BBB", 3)
    초기 반환 값은 "BBB: 0"입니다. 이 값은 5초마다 3씩 증가합니다.

  4. A3 셀에 다음 수식을 입력하고 Enter 키를 누릅니다.
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    A1에 사용된 것과 동일한 "항목"이므로 이 셀의 초기 반환 값은 A1 셀의 값과 같습니다.

  5. A4 셀에 다음 수식을 입력하고 Enter 키를 누릅니다.
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 10)
    초기 반환 값은 "AAA: 0"입니다. 다른 셀과 마찬가지로 이 값은 5초마다 증가합니다. 서버에 전달되는 매개 변수의 조합이 다르므로 이 셀의 반환 값은 A1 또는 A3 셀의 값과 다릅니다.
이 예제에서는 RTD 서버가 컴파일되었고 Excel에서 런타임 버전의 구성 요소를 사용했습니다. 그러나 디버깅을 위해 RTD 서버를 Visual Basic IDE에서 실행할 수도 있습니다.

디버그 모드에서 RTD 서버를 실행하려면 다음과 같이 하십시오.
  1. Microsoft Excel을 종료하고 Visual Basic의 프로젝트로 이동합니다.
  2. F5 키를 눌러 구성 요소를 시작합니다. 프로젝트 속성 대화 상자가 나타나면 확인을 눌러 구성 요소가 만들어질 때까지 대기의 기본 옵션을 선택하십시오.
  3. Visual Basic의 직접 실행 창이 표시되어 있는지 확인합니다. 셀에 수식을 입력할 때와 셀이 업데이트될 때 Visual Basic의 직접 실행 창에서 다양한 이벤트를 트리거하는 동작을 확인하십시오.
DisconnectData Event에 대한 참고 정보

Excel이 RTD 서버에 등록되어 있을 때 셀에서 RTD 수식을 삭제하거나 지운 경우와 같이 RTD 항목이 더 이상 필요 없으면 DisconnectData 이벤트가 트리거됩니다. 그러나 통합 문서가 닫히거나 Excel이 종료될 때 RTD 서버의 각 항목에 대해서는 DisconnectData가 호출되지 않고 대신 ServerTerminate만 호출됩니다. RTD 서버를 만들 때 ServerTerminate 이벤트가 발생하는 경우 항목 또는 기타 개체에 필요한 정리 작업을 코딩해야 합니다.

(c) Microsoft Corporation 2001, All Rights Reserved. Microsoft Corporation의 Lori B. Turner 제공

참조
자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
284883 RTD 서버에서 여러 Excel 인스턴스에 업데이트 알림을 보내지 않는다




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.
속성

문서 ID: 285339 - 마지막 검토: 09/01/2006 09:46:00 - 수정: 4.1

  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • kbhowto kbautomation KB285339
피드백