Trading & Coding

[초고급엑셀 3] RunQuery 한 줄이면 끝! 엑셀로 실시간 SQL 쿼리 실행하기

minstack 2025. 8. 26. 19:00

 

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쿼리내용을 실행하여 결과값을 불러오는 모습

 

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

sql 구문관련 줄만 길지 활용시 실제코드는 한줄.

 

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코드라고 감히 말할 수 있겠다.

 

다음 글부터는 이를 기반으로 자동화 진행한 구체적인 사례를 적어볼 계획.