ic


DDE 클라이언트를 다시 만들어 보다 EXCEL/VBA

예전에 DDE를 이용하여 선물 틱데이터를 모으는 포스팅(간단한 DDE프로그래밍)을 한 적이 있었는데, 그때에는 DDE로 수집하는 데이터가 선물 하나라서 별 불편은 없었다. 그런데 이번에는 여러 가지 금융상품(선물과 옵션)의 틱데이터를 쌓는 걸 해보았다. API를 하려다가 귀찮아서 그냥 DDE를 해보는 것이다. 일단 HTS(DDE서버 역할을 한다)에서 DDE로 끌어다 쓸 금융상품과 항목을 선택하여 엑셀로 DDE클라이언트 워크북을 만든다.


DDE 항목중 시간이 변경될 때마다, 어느 상품의 시간항목이 변경되는 지 확인하여 해당 프로시저를 실행하도록 하는 것이다. 즉 각각의 항목마다 같은 일을 하는, 그러나 이름만 다른 프로시저를 걸어 두는 것이다. 프로시저는 해당 워크시트의 출력위치를 확인하고 DDE 업데이트 되는 항목을 복사-붙여넣는 것이다.
Sub Start_DDE()
Dim s As Worksheet
Dim aLinks
Dim i As Long

'// 선물과 옵션의 DDE 시간항목
Const ITEM_101N6000 As String = "EtkDS|eds!FUTURE.101N6000;시간"
Const ITEM_201N6305 As String = "EtkDS|eds!OPTION.201N6305;시간"
Const ITEM_201N6307 As String = "EtkDS|eds!OPTION.201N6307;시간"
Const ITEM_201N6310 As String = "EtkDS|eds!OPTION.201N6310;시간"
Const ITEM_201N6312 As String = "EtkDS|eds!OPTION.201N6312;시간"
Const ITEM_201N6315 As String = "EtkDS|eds!OPTION.201N6315;시간"
Const ITEM_201N6317 As String = "EtkDS|eds!OPTION.201N6317;시간"
Const ITEM_201N6320 As String = "EtkDS|eds!OPTION.201N6320;시간"
Const ITEM_201N6322 As String = "EtkDS|eds!OPTION.201N6322;시간"
Const ITEM_201N6325 As String = "EtkDS|eds!OPTION.201N6325;시간"
Const ITEM_201N6327 As String = "EtkDS|eds!OPTION.201N6327;시간"
Const ITEM_301N6305 As String = "EtkDS|eds!OPTION.301N6305;시간"
Const ITEM_301N6307 As String = "EtkDS|eds!OPTION.301N6307;시간"
Const ITEM_301N6310 As String = "EtkDS|eds!OPTION.301N6310;시간"
Const ITEM_301N6312 As String = "EtkDS|eds!OPTION.301N6312;시간"
Const ITEM_301N6315 As String = "EtkDS|eds!OPTION.301N6315;시간"
Const ITEM_301N6317 As String = "EtkDS|eds!OPTION.301N6317;시간"
Const ITEM_301N6320 As String = "EtkDS|eds!OPTION.301N6320;시간"
Const ITEM_301N6322 As String = "EtkDS|eds!OPTION.301N6322;시간"
Const ITEM_301N6325 As String = "EtkDS|eds!OPTION.301N6325;시간"
Const ITEM_301N6327 As String = "EtkDS|eds!OPTION.301N6327;시간"

Call ClearContents '// 예전 기록을 지운다

aLinks = ThisWorkbook.LinkSources(xlOLELinks)
If Not IsEmpty(aLinks) Then
For i = 1 To UBound(aLinks)
Select Case True
Case aLinks(i) = ITEM_101N6000: ThisWorkbook.SetLinkOnData aLinks(i), "'On101N6000'"
Case aLinks(i) = ITEM_201N6305: ThisWorkbook.SetLinkOnData aLinks(i), "'On201N6305'"
Case aLinks(i) = ITEM_201N6307: ThisWorkbook.SetLinkOnData aLinks(i), "'On201N6307'"
Case aLinks(i) = ITEM_201N6310: ThisWorkbook.SetLinkOnData aLinks(i), "'On201N6310'"
Case aLinks(i) = ITEM_201N6312: ThisWorkbook.SetLinkOnData aLinks(i), "'On201N6312'"
Case aLinks(i) = ITEM_201N6315: ThisWorkbook.SetLinkOnData aLinks(i), "'On201N6315'"
Case aLinks(i) = ITEM_201N6317: ThisWorkbook.SetLinkOnData aLinks(i), "'On201N6317'"
Case aLinks(i) = ITEM_201N6320: ThisWorkbook.SetLinkOnData aLinks(i), "'On201N6320'"
Case aLinks(i) = ITEM_201N6322: ThisWorkbook.SetLinkOnData aLinks(i), "'On201N6322'"
Case aLinks(i) = ITEM_201N6325: ThisWorkbook.SetLinkOnData aLinks(i), "'On201N6325'"
Case aLinks(i) = ITEM_201N6327: ThisWorkbook.SetLinkOnData aLinks(i), "'On201N6327'"
Case aLinks(i) = ITEM_301N6305: ThisWorkbook.SetLinkOnData aLinks(i), "'On301N6305'"
Case aLinks(i) = ITEM_301N6307: ThisWorkbook.SetLinkOnData aLinks(i), "'On301N6307'"
Case aLinks(i) = ITEM_301N6310: ThisWorkbook.SetLinkOnData aLinks(i), "'On301N6310'"
Case aLinks(i) = ITEM_301N6312: ThisWorkbook.SetLinkOnData aLinks(i), "'On301N6312'"
Case aLinks(i) = ITEM_301N6315: ThisWorkbook.SetLinkOnData aLinks(i), "'On301N6315'"
Case aLinks(i) = ITEM_301N6317: ThisWorkbook.SetLinkOnData aLinks(i), "'On301N6317'"
Case aLinks(i) = ITEM_301N6320: ThisWorkbook.SetLinkOnData aLinks(i), "'On301N6320'"
Case aLinks(i) = ITEM_301N6322: ThisWorkbook.SetLinkOnData aLinks(i), "'On301N6322'"
Case aLinks(i) = ITEM_301N6325: ThisWorkbook.SetLinkOnData aLinks(i), "'On301N6325'"
Case aLinks(i) = ITEM_301N6327: ThisWorkbook.SetLinkOnData aLinks(i), "'On301N6327'"
End Select
Next
End If
Debug.Print "Starting DDE Recording..."
End Sub

Sub CopyToSheet(Item As String)
'// 상품별로 워크시트(워크시트이름이 종목코드임)가 구성되어 있는데,
'// 종목코드를 입력받아 Main워크시트에서 복사하여 붙여넣는다.
'// 모든 항목이 공통된 작업을 하므로 다음과 같이 같이 사용하도록 한다
Dim r1 As Long, r2 As Long, s As Worksheet, rng As Range

Set s = ThisWorkbook.Worksheets(Item)
r1 = WorksheetFunction.Match(Item, Main.Range("B:B"), 0)
r2 = s.Range("B1048576").End(xlUp).Row + 1

With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
Main.Range(Main.Cells(r1, 2), Main.Cells(r1, 15)).Copy
s.Range(s.Cells(r2, 2), s.Cells(r2, 15)).PasteSpecial xlValues

.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.CutCopyMode = False
End With
End Sub

'// 아래와 같은 프로시저를 종목수만큼 둔다.
Sub On101N6000()
'// 선물 데이터를 복사하도록 한다
Call CopyToSheet("101N6000")
End Sub
(이하 생략)
그런데 문제가 좀 있다. DDE 하는 동안은 복사하기-붙여넣기가 안된다.

덧글

댓글 입력 영역