엑셀 VBA GPT 함수
=GPT("...") 한 줄로 엑셀에서 바로 ChatGPT 호출
엑셀에서 =GPT("안녕") 또는 =GPT("이 표 분석해줘", A1:C10) 처럼 커스텀 함수를 부를 수 있는 VBA 코드 전문입니다. 외부 애드인·라이브러리 설치 없이 Windows/Office 기본 기능만 사용하며, 복사 → 붙여넣기 → API 키 교체 → 저장 4단계면 됩니다. 기업 AI 교육 현장에서 수강생 300명 이상에게 배포·검증한 코드입니다.
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분이면 완료.
.xlsx이면 매크로가 저장되지 않습니다.API_KEY 상수의 플레이스홀더를 본인 OpenAI API 키로 교체. Ctrl + S로 저장.=GPT("안녕, 자기소개 해줘")를 입력하고 엔터. 1~3초 뒤 셀에 ChatGPT 응답이 채워지면 성공.sk-proj-...로 시작하는 키를 복사. 발급 직후 단 한 번만 표시되므로 반드시 바로 저장해두세요.
VBA 코드 전문
아래 코드 블록 우상단 복사 버튼을 누른 뒤 VBA 모듈에 붙여넣으세요. 상단 API_KEY 값만 본인 키로 교체하면 됩니다.
' ==========================================================
' 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
.xlsm 파일은 외부 공유 금지. 공유 시 키가 노출되어 타인이 본인 계정으로 API를 호출할 수 있습니다. 필요하면 붙여넣기 → 테스트 → 파일 저장 전에 키 삭제 방식으로 쓰거나, 본인 전용 PC에서만 사용하세요.
통합 실습 — 번역·분류·점수화 + 범위 인사이트
직군/업무가 달라도 모두가 따라할 수 있는 "짧은 문장 데이터" 10행을 준비했습니다. 아래 복사 블록을 엑셀 A1 셀에 붙여넣으면 11행 × 4열 표가 만들어집니다. B2 / C2 / D2에 각각 =GPT() 수식을 넣고 아래로 자동 채움(드래그)해서 한 번에 수십 개 셀을 AI로 채우는 경험을 해보세요. 마지막으로 F2에 범위 인자 수식을 넣으면 표 전체를 읽은 종합 인사이트가 나옵니다.
A1에 붙여넣으면 아래와 같이 표가 만들어집니다. B2/C2/D2에 수식 넣고 11행까지 드래그:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 원본 데이터 | 번역(영문) | 카테고리 분류 | 점수화(0~10) |
| 2 | 상사가 회의에서 제 의견을 자주 무시해서… | =GPT(...) | =GPT(...) | =GPT(...) |
| 3 | 출장비 정산 시스템이 너무 복잡해… | |||
| 4 | 법인카드 사용 내역 승인이 1주일 이상… | |||
| 5 | 신규 사업 아이템으로 동남아 중고차… | |||
| 6 | 예산 대비 집행률이 120%를 넘은… | |||
| 7 | 신입사원 온보딩 프로세스가 부서별로… | |||
| 8 | 해외 거래처 A사의 대금 결제가 30일… | |||
| 9 | 이번 분기 재고자산 회전율이 전년 동기… | |||
| 10 | 재택근무 도입 후 팀 내 비공식… | |||
| 11 | 신규 ERP 시스템 도입 일정이 세 번째로… |
실전 팁 & 트러블슈팅
=GPT()를 걸면 OpenAI 요청 제한(rate limit)에 걸릴 수 있습니다. 먼저 10~20행만 채워 동작을 확인한 뒤, 나머지를 배치로 돌리세요. 처리량이 중요하면 MODEL_ID를 "gpt-4.1-mini"로 바꾸면 속도·비용 모두 개선됩니다.
#VALUE! 대신 Error[range]: ... 같은 단계별 메시지가 셀에 표시됩니다. stage=range면 입력 범위 처리 문제(셀 에러값/이상 타입), stage=http면 네트워크/API 키 문제, stage=parse면 응답 파싱 문제입니다.
.xlsx로 저장하면 VBA 코드가 제거된 채 저장되며, 다시 열었을 때 =GPT 수식이 모두 #NAME? 오류로 바뀝니다.
관련 자료
이 함수의 실전 활용법을 더 깊이 보고 싶다면 네이버 프리미엄 콘텐츠의 관련 글을 참고하세요. 댓글 답글 자동화, 해외 거래처 메시지 번역, 설문 응답 분류 등 10분 안에 따라할 수 있는 실전 사례가 정리되어 있습니다.