Excel용 RealTimeData 서버를 만드는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 285339 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

요약

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 Explicit
    
    Implements IRtdServer  'Interface allows Excel to contact this RealTimeData server
    
    Private 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", TopicID
    End Function
    
    Private 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", TopicID
    End Sub
    
    Private 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 Function
    
    Private 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 Function
    
    Private 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 Function
    
    Private 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 Explicit
    
    Private m_TopicID As Long
    Private m_TopicString As String
    Private m_Value As Variant
    Private m_IncrementVal As Long
    
    Private Sub Class_Initialize()
        m_Value = 0
        m_IncrementVal = 1
    End Sub
    
    Friend Property Let TopicID(ID As Long)
        m_TopicID = ID
    End Property
    
    Friend Property Get TopicID() As Long
        TopicID = m_TopicID
    End Property
    
    Friend 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 Property
    
    Friend 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_IncrementVal
    End Sub
    
    Friend 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 Sub
    
    Friend 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 Long
    
    Public Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
    
    Public Const TIMER_INTERVAL = 5000
    Public oCallBack As Excel.IRTDUpdateEvent
    Public g_TimerID As Long
    
    Public Sub TimerCallback(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
        oCallBack.UpdateNotify
    End 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 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 285339 - 마지막 검토: 2006년 9월 1일 금요일 - 수정: 4.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
키워드:?
kbhowto kbautomation KB285339

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com