503. 엑셀 GPT 함수 활용
엑셀 GPT 함수 활용
- 엑셀 셀에서 OpenAI API를 호출하는 gpt() 사용자 정의 함수를 만든다.
- 감성 분류·10점 척도 프롬프트로 후기 수백 건을 일괄 분석한다.
- 같은 함수를 문의 분류·설문 요약 등 텍스트 처리에 재사용한다.
고객후기 정량화 gpt() 함수
커머스 · 마케팅학습 안내읽기 + 파일 열기. 제공된 샘플 데이터(.xlsx)를 열고, 아래 gpt() 함수를 직접 추가해 C·D열 수식을 따라 만들어 봅니다. 핵심은 VBA 코드가 아니라 "평가 기준을 프롬프트에 명시하면 누가 돌려도 같은 점수가 나온다"는 것 — Ch1의 형식 지정·퓨샷이 API 활용에서도 그대로 통한다는 점입니다.
비즈니스 상황 — 수백 건의 도서 후기 분류
커머스 마케팅 담당자가 도서 후기를 한 줄씩 읽고 긍정/부정을 분류합니다. 후기 한 건당 1~2분, 수백 건이면 하루가 갑니다. 분류 기준도 사람마다 달라 "좋지만 분량이 많다" 같은 혼합 후기는 담당자에 따라 결과가 갈립니다. 이 사례는 엑셀 VBA로 gpt() 사용자 정의 함수를 만들어, 셀 수식 드래그 한 번으로 전체 후기를 감성 분류(C열)하고 1~10점으로 정량화(D열)합니다.
실습 파일 — 도서 후기 샘플 데이터
A열 도서명·B열 후기가 담긴 샘플 데이터입니다. 아래에서 만든 gpt() 함수를 추가한 뒤 C·D열 수식을 채워 가며 실습합니다.
gpt() 함수 만들기 ① — AI에게 코드 요청하는 프롬프트
VBA를 몰라도 됩니다. Claude Code/Codex 같은 AI(또는 ChatGPT)에게 아래처럼 원하는 동작을 말로 설명하면 전체 코드를 만들어 줍니다. 어려운 VBA 명령어를 쓸 필요가 없습니다.
gpt() 함수 만들기 ② — 실제 사용된 VBA 코드
위 프롬프트로 받은 코드의 실제 예시입니다(샘플 파일에 들어 있는 코드 그대로). 엑셀에서 Alt+F11 → [삽입]▸[모듈]에 붙여넣고, 맨 위 API_KEY 자리에 본인 키만 넣으면 바로 동작합니다.
' ==========================================================
' ChatGPT GPT() 커스텀 함수 (Excel VBA)
' 사용법:
' =GPT("안녕") ' 단순 질문
' =GPT("B2를 영어로 번역", A2) ' 단일 셀 참조
' =GPT("이 데이터 읽고 인사이트 도출해줘", A1:C10) ' 범위 참조
' ==========================================================
Const API_KEY As String = "여기에 본인의 API KEY를 입력하세요"
Const MODEL_ID As String = "gpt-4.1" ' API 호출용 모델
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) ' Range 같은 개체면 .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
' 범위/배열/단일값을 탭(열) + 줄바꿈(행) 텍스트로 변환
' - Excel UDF 는 Range 를 보통 2D Variant 배열로 전달함
' - 혹시 Range 객체 그대로 들어와도 .Value2 로 변환
Private Function RangeToText(ByRef data As Variant) As String
On Error GoTo RangeErr
Dim arr As Variant
Dim result As String
' Range 객체면 값 2D 배열로 변환
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)
' 콜론 다음 공백/탭/줄바꿈 skip
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
셀에서 쓰는 모습 — 수식이 곧 프롬프트
GPT 함수 실행 결과
학습 안내산출. 직접 실행하려면 OpenAI API 키가 필요합니다(키가 없으면 파일 구조 확인과 프롬프트 분석까지만 진행). 완료 기준: C·D열이 채워지고, 점수 분포가 피벗테이블/COUNTIF로 집계되면 통과.
완성하면 시트가 아래 모습이 됩니다. (원본 사례의 100건 분포: 9점 18건 · 10점 25건 등)
| A 도서명 | B 후기 | C 감성(gpt) | D 점수(gpt) |
|---|---|---|---|
| 중학 수학 개념서 | 개념 설명이 친절해서 혼자 공부하기 좋아요. 강추! | 긍정 | 9 |
| 중학 수학 개념서 | 기본기용으로는 좋지만 상위권 문제는 부족해요. | 긍정 | 6 |
| 영어 독해 문제집 | 해설이 너무 빈약해서 후회합니다. 비추천. | 부정 | 2 |
실습 순서
- 위에서 받은 08_커머스_책 후기_샘플.xlsx를 연다.
- Alt+F11 → [삽입]▸[모듈]에 위의 gpt() VBA 코드를 붙여넣고, 맨 위
API_KEY자리에 본인 OpenAI 키를 입력한다. 파일은 .xlsm(매크로 사용 통합 문서)으로 저장한다. - C2·D2 수식을 실행해 1건이 동작하는지 확인한 뒤, 아래로 드래그해 전 행을 처리한다.
- D열 점수로 1~10점 분포 집계표(COUNTIF 또는 피벗)를 만든다.
- (응용) D열 프롬프트의 점수 기준을 본인 회사의 평가 기준으로 바꿔 다시 실행해 본다.