python으로 못하는 것은 없다만,
업무 자동화 영역에서 엑셀은 여전히 강력한 도구다.
데이터 가공 및 시각화에는 엑셀이 가공과 수정이 쉬워 python보다 훨씬 공수가 적게 든다.
특히 버튼 하나만 누르면 데이터베이스에서 실시간으로 데이터를 조회해서 보고서가 갱신되는 구조는 생산성을 비약적으로 높여준다.
문제는 DB연동하여 기능을 구현하는게 은근히 번거롭다.
매 시트마다 Connection 객체를 만들고, 루프 돌려서 셀에 하나하나 출력하는 반복적인 작업이 필요했다.
DB연동을 활용한 시트가 많아지고 쿼리가 복잡해지다보니
중간에 DB 접속 주소, ID/PW가 바뀔 일이 있었는데 엑셀 시트마다 교체하려니까 환장하겠더라.
그래서 아예 한 줄로 끝나는 SQL 조회 함수를 만들었다.
한 번 만들어두니 이후로는 복붙만 하면 모든 시트에서 실시간 DB 조회가 가능해졌다.
사용방법
'한줄로 쿼리 실행
a = RunQuery(ws, "A1", sql, 1)
이제 VBA에서 “runQuery”만 호출하여 출력위치와 sql문만 넣어주면 바로 쿼리 뽑아줌.
2025.06.27 - [Trading & Coding] - [채권 1] K-Bond 메신저 장외호가 DB 쌓기
[채권 1] K-Bond 메신저 장외호가 DB 쌓기
채권시장은 21세기에도 여전히우수한 기술력을 자랑하는 플랫폼인'메신저'에 1200명이 한 방에 모여돗때기 시장판 마냥 조용한 고성이 오고간다. 실시간으로 호가가 뒤섞여 정신이 없다.오늘이
minstack.tistory.com
과거 K-Bond 메신저 채권 장외호가 DB적재 프로세스를 개발하였고,
이제는 VBA로 가공하여 실시간으로 잘 뽑아보고 있다.

조회 버튼에 엮인 코드는 아래와 같이 매우 간단하다.

sql = "SELECT * FROM kbond_message"
파트에 이제 쿼리만 잘 짜놓으면 바로 실전 자동화 활용 가능이다.
module 전체 VBA코드 공개
Public Function RunQuery(targetSheet As Worksheet, outputStartCell As String, sql As String, Optional outputOption As Integer = 1)
Dim conn As Object
Dim rs As Object
Dim dbPath As String
Dim startRow, startCol As Long
Dim i As Integer
On Error GoTo ErrorHandler:
Const adOpenStatic = 3
Const adLockReadOnly = 1
Set conn = CreateObject("ADODB.connection")
conn.Open "Driver={MySQL ODBC 8.0 Unicode Driver};Server=111.111.111.111;Port=3306;Database=mysqldb;User=admin;Password=1111;option=3;"
Set rs = CreateObject("ADODB.recordset")
rs.Open sql, conn, adOpenStatic, adLockReadOnly
startRow = targetSheet.Range(outputStartCell).Row
startCol = targetSheet.Range(outputStartCell).Column
If outputOption = 1 Then
For i = 0 To rs.Fields.Count - 1
targetSheet.Cells(startRow, startCol + i).Value = rs.Fields(i).Name
Next i
rs.movefirst
targetSheet.Cells(startRow + 1, startCol).CopyFromRecordset rs
ElseIf outputOption = 2 Then
RunQuery = rs.Fields(0).Value
Else
targetSheet.Cells(startRow, startCol).CopyFromRecordset rs
End If
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
Exit Function
ErrorHandler:
MsgBox "Error: " & Err.Description
If Not conn Is Nothing Then conn.Close
Set conn = Nothing
Set RunQuery = Nothing
End Function
입력변수 목록
| targetSheet | 쿼리 결과를 뿌려줄 시트 객체 |
| outputStartCell | 출력 시작 셀 (예: "A1") |
| sql | 실행할 SQL 문장 |
| outputOption | 출력 옵션 1: 컬럼명 + 데이터 2: 단일값 반환 그외: 컬럼명 없이 데이터만 |
모듈 주요 포인트
- On Error GoTo ErrorHandler: 쿼리 잘못짜서 에러 발생시 처리
→ 아직 단점은, 쿼리 상 오류내용을 상세하게 알려주진 못한다. 뭘 잘못했는지 일일이 찾아야 함 - adOpenStatic + adLockReadOnly: 데이터 스냅샷 + 읽기 전용 커서
→ 실수로 수정될 일 없고, 조회에만 최적화 - CopyFromRecordset: 수만 건 데이터도 루프 없이 빠르게 뿌려줌
→ 루프 대신 쓸 수 있는 초고속 함수 - outputOption: 출력칸에 컬럼명을 넣을 수도 있고 뺄 수도 있음
반복을 없애는 것이 자동화
이 모듈을 만든 이후로
더 이상 시트마다 매번 똑같은 커넥션 코드를 붙이고 루프 돌리는 일은 없다.
그냥 RunQuery 한 줄이면 된다. 그리고 그 위에 쿼리만 올려두면 된다.
그냥 쿼리만 짜면 된다. 그리고 시트랑 셀 주소만 넘겨주면 끝.
- 아침마다 민평 시가표 자동 업데이트
- 일일 포지션/손익 현황 자동화 및 과거자 자동 연계 조회
- 실시간 장외채권 시세 확인
이런 단순 노가다 작업에서 해방되었다.
모든 채권 관련 자동화 코드의 인프라로 활용하면서
올해 가장 생산성 향상에 기여한 VBA코드라고 감히 말할 수 있겠다.
다음 글부터는 이를 기반으로 자동화 진행한 구체적인 사례를 적어볼 계획.
'Trading & Coding' 카테고리의 다른 글
| [채권 5] 채권시장 데이터, 시작부터 꼬이는 구조적 난제 (9) | 2025.08.27 |
|---|---|
| [채권 4+ML 1] 머신러닝 Rulefit으로 국채금리 커브전략 패턴탐구 (4) | 2025.08.23 |
| [채권 3+초고급엑셀 2] 국채 Tenor별 상대가치분석 자동화 구현(Overview) (5) | 2025.08.19 |
| [엑셀 1] 함수 안먹힐 때, 쉼표 포함 숫자 1초 변환법(텍스트 나누기 활용) (7) | 2025.08.12 |
| [채권 2] K-Bond 호가분석 - 국고·통안 선별기 제작기 (2) | 2025.07.01 |