AI 제대로 공부하기
코드 공유 · 복붙으로 바로 쓰기

엑셀 VBA GPT 함수

=GPT("...") 한 줄로 엑셀에서 바로 ChatGPT 호출

엑셀에서 =GPT("안녕") 또는 =GPT("이 표 분석해줘", A1:C10) 처럼 커스텀 함수를 부를 수 있는 VBA 코드 전문입니다. 외부 애드인·라이브러리 설치 없이 Windows/Office 기본 기능만 사용하며, 복사 → 붙여넣기 → API 키 교체 → 저장 4단계면 됩니다. 기업 AI 교육 현장에서 수강생 300명 이상에게 배포·검증한 코드입니다.

3분 컷 요약 .xlsm로 저장Alt+F11삽입 > 모듈 → 아래 코드 붙여넣고 상단 API_KEY를 본인 키로 교체 → Ctrl+S → 시트에서 =GPT("안녕")

이 함수로 뭘 할 수 있나

AI 업무 자동화의 가장 큰 병목은 "반복되는 짧은 판단 작업"입니다. 수백 줄의 고객 VOC를 카테고리별로 분류하거나, 해외 바이어 메시지를 한 줄씩 번역하거나, 설문 응답을 긍정/부정 점수로 환산하는 일은 사람이 하면 몇 시간씩 걸리지만 AI에게는 수식 하나로 끝낼 수 있는 작업입니다. 이 VBA 함수는 엑셀 셀에서 =GPT("프롬프트: " & A2) 처럼 쓰면 ChatGPT API를 호출해 그 결과를 돌려줍니다. 드래그로 수식을 아래로 끌어내리면 한 열 전체가 수 초 안에 채워집니다.

기존 방식(구글 스프레드시트 Apps Script 또는 GPT for Sheets 애드인)과 비교하면 엑셀 사용자가 더 많은 국내 기업 환경에서 유리합니다. Apps Script는 구글 계정과 브라우저가 필요하고, GPT for Sheets 애드인은 월 구독료가 발생합니다. 이 VBA 함수는 엑셀 파일 하나 안에 들어있어 오프라인 업무 흐름에도 자연스럽게 녹아들고, 회사 보안상 외부 애드인 설치가 금지된 환경에서도 쓸 수 있습니다. 한 번 설정해두면 그 엑셀 파일은 영구적으로 AI 보조 도구가 됩니다.

지원하는 호출 패턴 3가지

  • 단순 질문: =GPT("자기소개 해줘") — 바로 응답
  • 셀 참조: =GPT("영문으로 번역: " & A2) — A2 값을 프롬프트에 붙여서 호출
  • 범위 데이터: =GPT("이 표 분석해서 인사이트 3개 뽑아줘", A1:C10) — 범위 전체를 탭/줄바꿈 텍스트로 조립해 [DATA] 블록으로 자동 첨부

설치 4단계

외부 라이브러리 없이 엑셀 기본 기능만으로 끝납니다. 3분이면 완료.

1
.xlsm 형식으로 저장
Excel을 열어 새 통합문서 생성. 파일 → 다른 이름으로 저장 → 파일 형식 "Excel 매크로 사용 통합 문서(*.xlsm)". 확장자가 .xlsx이면 매크로가 저장되지 않습니다.
2
VBA 편집기 열기
Alt + F11 단축키로 VBA 편집기 실행. (개발도구 탭이 안 보이면 파일 → 옵션 → 리본 사용자 지정에서 "개발 도구" 체크)
3
모듈 추가 + 코드 붙여넣기 + 저장
편집기 메뉴 삽입 → 모듈 클릭. 빈 모듈 창이 열리면 아래 VBA 코드 전체를 복사해 붙여넣고, 상단 API_KEY 상수의 플레이스홀더를 본인 OpenAI API 키로 교체. Ctrl + S로 저장.
4
시트에서 테스트
엑셀 시트로 돌아가 아무 셀에 =GPT("안녕, 자기소개 해줘")를 입력하고 엔터. 1~3초 뒤 셀에 ChatGPT 응답이 채워지면 성공.
💡 API 키 발급. platform.openai.com/api-keys 로그인 → Create new secret key 클릭 → 이름 지정 후 발급된 sk-proj-...로 시작하는 키를 복사. 발급 직후 단 한 번만 표시되므로 반드시 바로 저장해두세요.

VBA 코드 전문

아래 코드 블록 우상단 복사 버튼을 누른 뒤 VBA 모듈에 붙여넣으세요. 상단 API_KEY 값만 본인 키로 교체하면 됩니다.

GPT() 함수 · 전문 Excel VBA
' ==========================================================
' ChatGPT GPT() 커스텀 함수 (Excel VBA)
' 사용법:
'   =GPT("안녕")                                ' 단순 질문
'   =GPT("B2를 영어로 번역", A2)                 ' 단일 셀 참조
'   =GPT("이 데이터 읽고 인사이트 도출해줘", A1:C10) ' 범위 참조
' ==========================================================

Const API_KEY As String = "여기에_본인_OPENAI_API_키_붙여넣기"
Const MODEL_ID As String = "gpt-4.1"
Const MAX_TOKENS As Long = 2000

Public Function GPT(ByVal prompt As String, Optional ByRef data As Variant) As String
    On Error GoTo ErrHandler
    Dim stage As String: stage = "init"

    If Len(Trim(prompt)) = 0 Then
        GPT = "Error: Please provide a valid prompt."
        Exit Function
    End If

    ' 범위/셀 인자가 넘어왔으면 [DATA] 블록으로 덧붙임
    stage = "range"
    Dim fullPrompt As String
    fullPrompt = prompt
    If Not IsMissing(data) Then
        fullPrompt = fullPrompt & vbLf & vbLf & "[DATA]" & vbLf & RangeToText(data)
    End If

    ' JSON Body 구성
    stage = "body"
    Dim bodyJson As String
    bodyJson = "{""model"":""" & MODEL_ID & """," & _
               """messages"":[" & _
                 "{""role"":""system"",""content"":""You are a helpful assistant.""}," & _
                 "{""role"":""user"",""content"":""" & JsonEscape(fullPrompt) & """}" & _
               "]," & _
               """max_tokens"":" & MAX_TOKENS & "}"

    ' HTTP 요청
    stage = "http"
    Dim http As Object
    Set http = CreateObject("MSXML2.XMLHTTP.6.0")
    http.Open "POST", "https://api.openai.com/v1/chat/completions", False
    http.setRequestHeader "Content-Type", "application/json"
    http.setRequestHeader "Authorization", "Bearer " & API_KEY
    http.send bodyJson

    stage = "parse"
    GPT = ExtractContent(http.responseText)
    Exit Function
ErrHandler:
    GPT = "Error[" & stage & "]: " & Err.Description
End Function

' 셀 하나의 값을 안전하게 문자열로 변환 (Error/Empty/Null/Object 모두 처리)
Private Function CellToText(ByRef v As Variant) As String
    On Error Resume Next
    Dim s As String
    If IsObject(v) Then
        s = CStr(v.Value2)
    ElseIf IsError(v) Then
        s = "#ERR"
    ElseIf IsNull(v) Or IsEmpty(v) Then
        s = ""
    Else
        s = CStr(v)
    End If
    If Err.Number <> 0 Then
        s = ""
        Err.Clear
    End If
    On Error GoTo 0
    CellToText = s
End Function

' 범위/배열/단일값을 탭(열) + 줄바꿈(행) 텍스트로 변환
Private Function RangeToText(ByRef data As Variant) As String
    On Error GoTo RangeErr
    Dim arr As Variant
    Dim result As String

    If IsObject(data) Then
        arr = data.Value2
    Else
        arr = data
    End If

    If IsArray(arr) Then
        Dim rLo As Long, rHi As Long, cLo As Long, cHi As Long
        Dim is2D As Boolean: is2D = False
        rLo = LBound(arr, 1): rHi = UBound(arr, 1)
        On Error Resume Next
        cLo = LBound(arr, 2)
        cHi = UBound(arr, 2)
        If Err.Number = 0 Then is2D = True
        Err.Clear
        On Error GoTo RangeErr

        Dim r As Long, c As Long
        If is2D Then
            For r = rLo To rHi
                If r > rLo Then result = result & vbLf
                For c = cLo To cHi
                    If c > cLo Then result = result & vbTab
                    result = result & CellToText(arr(r, c))
                Next c
            Next r
        Else
            For r = rLo To rHi
                If r > rLo Then result = result & vbLf
                result = result & CellToText(arr(r))
            Next r
        End If
    Else
        result = CellToText(arr)
    End If

    RangeToText = result
    Exit Function
RangeErr:
    RangeToText = "[Range 변환 실패: " & Err.Description & "]"
End Function

' JSON 문자열 이스케이프 (요청 본문용)
Private Function JsonEscape(ByVal s As String) As String
    s = Replace(s, "\", "\\")
    s = Replace(s, """", "\""")
    s = Replace(s, vbCrLf, "\n")
    s = Replace(s, vbLf, "\n")
    s = Replace(s, vbCr, "\n")
    s = Replace(s, vbTab, "\t")
    JsonEscape = s
End Function

' 응답 JSON에서 assistant의 content 값만 추출 (간이 파서)
' - 공백/줄바꿈이 섞인 pretty JSON 모두 대응
' - \uXXXX 유니코드 이스케이프도 처리
Private Function ExtractContent(ByVal json As String) As String
    Const KEY As String = """content"":"
    Dim i As Long
    i = InStr(1, json, KEY)
    If i = 0 Then
        ExtractContent = "Error: " & json
        Exit Function
    End If
    i = i + Len(KEY)

    Do While i <= Len(json)
        Dim c As String: c = Mid(json, i, 1)
        If c = " " Or c = vbTab Or c = vbLf Or c = vbCr Then
            i = i + 1
        Else
            Exit Do
        End If
    Loop

    If i > Len(json) Or Mid(json, i, 1) <> """" Then
        ExtractContent = "Error: cannot find content opening quote"
        Exit Function
    End If
    i = i + 1

    Dim ch As String, nxt As String, result As String, hex4 As String
    Do While i <= Len(json)
        ch = Mid(json, i, 1)
        If ch = "\" Then
            nxt = Mid(json, i + 1, 1)
            Select Case nxt
                Case """": result = result & """":       i = i + 2
                Case "\":  result = result & "\":        i = i + 2
                Case "/":  result = result & "/":        i = i + 2
                Case "n":  result = result & vbLf:       i = i + 2
                Case "r":  result = result & vbCr:       i = i + 2
                Case "t":  result = result & vbTab:      i = i + 2
                Case "b":  result = result & Chr(8):     i = i + 2
                Case "f":  result = result & Chr(12):    i = i + 2
                Case "u"
                    hex4 = Mid(json, i + 2, 4)
                    result = result & ChrW(CLng("&H" & hex4))
                    i = i + 6
                Case Else: result = result & nxt:        i = i + 2
            End Select
        ElseIf ch = """" Then
            Exit Do
        Else
            result = result & ch
            i = i + 1
        End If
    Loop
    ExtractContent = result
End Function
⚠ 보안. API 키를 하드코딩한 .xlsm 파일은 외부 공유 금지. 공유 시 키가 노출되어 타인이 본인 계정으로 API를 호출할 수 있습니다. 필요하면 붙여넣기 → 테스트 → 파일 저장 전에 키 삭제 방식으로 쓰거나, 본인 전용 PC에서만 사용하세요.

통합 실습 — 번역·분류·점수화 + 범위 인사이트

직군/업무가 달라도 모두가 따라할 수 있는 "짧은 문장 데이터" 10행을 준비했습니다. 아래 복사 블록을 엑셀 A1 셀에 붙여넣으면 11행 × 4열 표가 만들어집니다. B2 / C2 / D2에 각각 =GPT() 수식을 넣고 아래로 자동 채움(드래그)해서 한 번에 수십 개 셀을 AI로 채우는 경험을 해보세요. 마지막으로 F2에 범위 인자 수식을 넣으면 표 전체를 읽은 종합 인사이트가 나옵니다.

A1 붙여넣기
원본 데이터 번역(영문) 카테고리 분류 점수화(0~10) 상사가 회의에서 제 의견을 자주 무시해서 업무 몰입도가 떨어집니다. 출장비 정산 시스템이 너무 복잡해 정산에 이틀이 걸렸습니다. 법인카드 사용 내역 승인이 1주일 이상 지연되고 있습니다. 신규 사업 아이템으로 동남아 중고차 B2B 유통을 검토 중입니다. 예산 대비 집행률이 120%를 넘은 부서가 3곳 확인되었습니다. 신입사원 온보딩 프로세스가 부서별로 달라 혼선이 있습니다. 해외 거래처 A사의 대금 결제가 30일 이상 지연되고 있습니다. 이번 분기 재고자산 회전율이 전년 동기 대비 15% 개선되었습니다. 재택근무 도입 후 팀 내 비공식 커뮤니케이션이 눈에 띄게 줄었습니다. 신규 ERP 시스템 도입 일정이 세 번째로 연기되어 현업이 불만입니다.

A1에 붙여넣으면 아래와 같이 표가 만들어집니다. B2/C2/D2에 수식 넣고 11행까지 드래그:

ABCD
1원본 데이터번역(영문)카테고리 분류점수화(0~10)
2상사가 회의에서 제 의견을 자주 무시해서…=GPT(...)=GPT(...)=GPT(...)
3출장비 정산 시스템이 너무 복잡해…
4법인카드 사용 내역 승인이 1주일 이상…
5신규 사업 아이템으로 동남아 중고차…
6예산 대비 집행률이 120%를 넘은…
7신입사원 온보딩 프로세스가 부서별로…
8해외 거래처 A사의 대금 결제가 30일…
9이번 분기 재고자산 회전율이 전년 동기…
10재택근무 도입 후 팀 내 비공식…
11신규 ERP 시스템 도입 일정이 세 번째로…
B2
=GPT("다음 한국어 문장을 자연스러운 영문 한 문장으로 번역해줘. 번역 결과만 출력: "&A2)
C2
=GPT("다음 문장의 업무 카테고리를 [HR / 재무 / 회계 / 기획 / 고객·거래처 / IT·시스템] 중 하나로 분류해줘. 카테고리명만 한 단어로 출력: "&A2)
D2
=GPT("다음 문장이 업무에 미치는 영향을 부정 0 ~ 긍정 10 점 척도로 평가해줘. 숫자 한 개만 출력: "&A2)
📌 범위 인자. B/C/D 열을 다 채운 뒤 빈 셀 하나(예: F2)에 아래 수식을 넣으면, 표 전체를 읽고 우선순위 높은 2~3개 항목을 종합 인사이트로 뽑아줍니다. 이게 범위 인자의 진짜 가치.
F2
=GPT("아래 표는 실무자들의 업무 코멘트와 영문 번역/카테고리 분류/점수화 결과다. 표 전체를 읽고 실무(재무/기획/HR/총무 등) 관점에서 조치가 필요한 2~3개 항목을 우선순위와 함께 제시해줘.", A1:D11)

실전 팁 & 트러블슈팅

💡 값으로 고정. AI 응답이 만족스러우면 그 열을 복사한 뒤 선택하여 붙여넣기 → 값으로 수식을 풀어두세요. 시트가 다시 계산될 때마다 API가 재호출되는 것을 막고 비용도 절약됩니다.
💡 대량 처리 시 쿼터. 수백 개 셀에 동시에 =GPT()를 걸면 OpenAI 요청 제한(rate limit)에 걸릴 수 있습니다. 먼저 10~20행만 채워 동작을 확인한 뒤, 나머지를 배치로 돌리세요. 처리량이 중요하면 MODEL_ID"gpt-4.1-mini"로 바꾸면 속도·비용 모두 개선됩니다.
⚠ #VALUE! 대신 Error[stage]:. 이 코드는 함수 전체를 에러 핸들러로 감싸므로 일반 VBA UDF와 달리 #VALUE! 대신 Error[range]: ... 같은 단계별 메시지가 셀에 표시됩니다. stage=range면 입력 범위 처리 문제(셀 에러값/이상 타입), stage=http면 네트워크/API 키 문제, stage=parse면 응답 파싱 문제입니다.
⚠ .xlsx로 저장하면 날아갑니다. 반드시 Excel 매크로 사용 통합 문서(.xlsm)로 저장하세요. .xlsx로 저장하면 VBA 코드가 제거된 채 저장되며, 다시 열었을 때 =GPT 수식이 모두 #NAME? 오류로 바뀝니다.

관련 자료

이 함수의 실전 활용법을 더 깊이 보고 싶다면 네이버 프리미엄 콘텐츠의 관련 글을 참고하세요. 댓글 답글 자동화, 해외 거래처 메시지 번역, 설문 응답 분류 등 10분 안에 따라할 수 있는 실전 사례가 정리되어 있습니다.

네프콘 · 엑셀 GPT 함수 만들기 10분컷 →