ChatGPT와 엑셀을 바로 연동해서 사용하는 법, A-Z 완벽 정리!
완성된 VBA 코드를 복사-붙여넣기만 하면, ChatGPT와 엑셀을 바로 연동해서 사용할 수 있습니다!👏 여러 실전 예제와 함께 ChatGPT의 강력한 기능을 확인해보세요!
이 강의에서는 OpenAI의 GPT API를 엑셀에서 직접 호출하는 xGPT·xGPT_List 사용자 정의 함수와 xGPT_Run 매크로 작성 방법을 다룹니다. API 키 발급부터 마스터 코드 등록, GoogleTranslate 함수를 활용한 실시간 번역, 보고서 자동 완성까지 실무 시나리오 다섯 가지를 단계별로 정리해 반복 업무를 자동화할 수 있도록 안내합니다.
실습자료를 준비했어요
수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇
주요 안내
본 강의는 2023년 2월에 업로드된 강의로, 영상에서 사용한 davinci 모델은 현재 서비스가 종료되었습니다.
(기술 발전 속도가 매우 빠른 것을 실감합니다.😅)
엑셀 × ChatGPT 연동은 최신 영상에서 소개해 드린 GPT-3.5 활용 방법을 참고해 주세요.
OpenAI ChatGPT 홈페이지 디자인이 개편되었습니다.
API 키 발급 페이지는 아래 링크를 통해 접속해 주세요.
자주묻는 질문
- =x 를 입력해도 =xGPT 함수가 목록에 표시되지 않습니다.
: 마스터 코드를 붙여넣은 위치를 먼저 확인합니다. 마스터 코드는 반드시 '모듈(Module)' 안에 붙여넣어야 합니다.
: 또는 파일 저장시 매크로 사용 통합문서로 저장했는지 확인합니다. - =xGPT 함수가 목록에 표시되지 않거나, 함수 입력 시 #NAME? 오류가 발생합니다.
: 또는 파일 저장시 매크로 사용 통합문서로 저장했는지 확인합니다.
- =xGPT 함수 또는 =xGPT_List 함수 사용 시 #VALUE! 오류가 반환되거나, objHTTP.send formText 에서 오류가 발생합니다.
: 해당 오류는 새로운 마스터 코드를 사용하면 해결됩니다! 🙌 (2022-02-19 업데이트)
: 새 마스터 코드를 사용해도 오류가 계속된다면, PC의 아래 두 가지 설정을 확인합니다.
① .NET Framework 3.5 설치 확인
Windows 검색 → [Windows 기능 켜기/끄기] 이동 → ".NET Framework 3.5 (.NET 2.0 및 3.0 포함)" 체크 → [확인] 클릭 후 PC 재시작

② TLS 보안 접속 사용 확인
제어판 이동 → 우측 상단 보기 기준을 [큰 아이콘]으로 변경 → 네트워크 및 공유 센터 → 좌측 하단 [인터넷 옵션] → [고급] 탭 → 스크롤을 내려 중간의 "TLS 1.2 사용" 체크 → [적용] 클릭 후 PC 재시작

: 위 두 가지를 모두 확인해도 #VALUE! 오류가 반환된다면, 파일이 매크로 사용 통합문서로 올바르게 저장되었는지 확인합니다. - GoogleTranslate 번역 결과가 한 줄로만 출력됩니다.
: 해당 오류는 새로운 마스터 코드를 사용하면 해결됩니다! 🙌 (2022-02-22 업데이트)
ChatGPT 엑셀 연동 마스터 코드
아래 코드를 전체 복사한 후, VBA 편집기의 '모듈(Module)' 안에 붙여넣기합니다.
주의: 코드를 일부만 복사하면 ① '컴파일 오류'가 발생하며, ② 모듈이 아닌 시트(Sheet1, Sheet2 등)나 통합문서 객체에 붙여넣을 경우 함수가 동작하지 않으므로 반드시 '모듈'에 붙여넣어야 합니다.
Const APIKey As String = "API키" '<- API 키를 입력합니다. Const APIUrl As String = "https://api.openai.com/v1/completions" '---------------------------- ▼▼ 사용할 명령문을 이 안에 작성하세요 ▼▼ ------------------------------- '■xGPT_Run 함수 'xGPT_Run "입력셀주소", "출력셀주소", [List출력여부(True/False)] '예) xGPT_Run "C6", "B8" Sub MyGPT_Keyword() xGPT_Run "C6", "B8", True End Sub Sub MyGPT_Report() xGPT_Run "C16", "B18", False End Sub '---------------------------- ▲▲ 사용할 명령문을 이 안에 작성하세요 ▲▲ ------------------------------- Function xGPT(sRequest, Optional Temperature As Double = 0, Optional Max_Tokens As Integer = 0) '■ GPT 모델 설명은 아래 링크를 참고하세요. 'https://platform.openai.com/docs/models/gpt-3 '■ 비용에 대한 설명은 아래 링크를 참고하세요. 'https://openai.com/api/pricing/ '■ 비용 요약 '1000토큰 = 한글 450~500자 or 영어 750단어 or A4용지 절반 분량 'davinci는 최대 4000토큰 지원 ≒ 약 A2장 분량 입/출력 가능 'davinci 모델(가장 좋은 성능) : 1000토큰 당 24원 (A4용지 한장 ≒ 50원) 'curie 모델(보편적 성능, 가성비 좋음) : 1000토큰당 2.4원 (A4용지 한장 ≒ 5원) Application.EnableEvents = False If sRequest = "" Then xGPT = "": Exit Function Dim GPTModel As String: GPTModel = "text-davinci-003" '"text-davinci-003" '또는 "text-curie-001" If Max_Tokens = 0 Then If GPTModel = "text-curie-001" Then Max_Tokens = 1024 If GPTModel = "text-davinci-003" Then Max_Tokens = 2000 End If Dim vHeader As Variant: ReDim vHeader(0 To 1) vHeader(0) = Array("Content-Type", "application/json") vHeader(1) = Array("Authorization", "Bearer " & APIKey) Dim bodyJSON As String Dim sResult As String sRequest = Replace(Replace(Replace(Replace(sRequest, Chr(10), "\n"), Chr(13), "\n"), Chr(9), "\t"), """", "\""") bodyJSON = "{" bodyJSON = bodyJSON & """model"" : """ & GPTModel & """, " bodyJSON = bodyJSON & """prompt"" : """ & sRequest & """, " bodyJSON = bodyJSON & """temperature"" : " & Temperature & ", " bodyJSON = bodyJSON & """max_tokens"" : " & Max_Tokens bodyJSON = bodyJSON & "}" sResult = GetHttp(APIUrl, bodyJSON, RequestHeader:=vHeader, RequestType:="POST").Body.innerHTML sResult = Replace(sResult, """: """, """:""") If InStr(1, sResult, """error"":") = 0 Then sResult = ExtractJsonValue(sResult, "text") 'sResult = Splitter(sResult, "[{""text"":""", """,""") Do While Left(sResult, 2) = "\n" sResult = Right(sResult, Len(sResult) - 2) Loop sResult = Replace(Replace(sResult, "\n", vbNewLine), "\""", """") xGPT = sResult Else sResult = ExtractJsonValue(sResult, "message") xGPT = "#Error! : " & sResult End If Application.EnableEvents = True End Function Sub xGPT_Run(sPromptRange As String, sPrintRange As String, Optional isList As Boolean = True, Optional Temparature As Double = 0, Optional Max_Tokens As Integer = 2500) Dim WS As Worksheet: Set WS = ActiveSheet Dim PromptRange As Range: Set PromptRange = WS.Range(sPromptRange) Dim PrintRange As Range: Set PrintRange = WS.Range(sPrintRange) Dim vArrray As Variant Dim ArrCount As Long If isList = True Then vArray = xGPT_List(PromptRange.Value, Temparature, Max_Tokens) If PrintRange.Value <> "" Then PrintRange.CurrentRegion.ClearContents PrintRange.Resize(UBound(vArray), 1) = vArray Else PrintRange.Value = xGPT(PromptRange.Value, Temparature, Max_Tokens) End If MsgBox "요청하신 작업이 완료되었습니다." End Sub Function xGPT_List(sRequest, Optional Temperature As Double = 0, Optional Max_Tokens As Integer = 2500) Dim sResult As String Dim vResult As Variant: Dim vReturn As Variant Dim i As Long sResult = xGPT(sRequest, Temperature) vResult = Split(sResult, vbNewLine) ReDim vReturn(1 To UBound(vResult) + 1, 1 To 1) For i = LBound(vResult) To UBound(vResult) vReturn(i + 1, 1) = Trim(vResult(i)) Next xGPT_List = vReturn End Function Function ExtractJsonValue(s, v) Dim jsonString As String Dim regex As Object Dim matches As Object Set regex = CreateObject("VBScript.RegExp") s = Replace(s, "\""", "|||") regex.Pattern = """" & v & """:""(.*?)""," regex.Global = True Set matches = regex.Execute(s) If matches.Count > 0 Then ExtractJsonValue = Replace(matches.Item(0).SubMatches.Item(0), "|||", "\""") End Function Function GetHttp(URL As String, Optional formText As String, _ Optional isWinHttp As Boolean = False, _ Optional RequestHeader As Variant, _ Optional includeMeta As Boolean = False, _ Optional RequestType As String = "GET") As Object '############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com) '▶ GetHttp 함수 '▶ 웹에서 데이터를 받아옵니다. '▶ 인수 설명 '_____________URL : 데이터를 스크랩할 웹 페이지 주소입니다. '_____________formText : Encoding 된 FormText 형식으로 보내야 할 경우, Send String에 쿼리문을 추가합니다. '_____________isWinHttp : WinHTTP 로 요청할지 여부입니다. Redirect가 필요할 경우 True로 입력하여 WinHttp 요청을 전송합니다. '_____________RequestHeader : RequestHeader를 배열로 입력합니다. 반드시 짝수(한 쌍씩 이루어진) 개수로 입력되어야 합니다. '_____________includeMeta : TRUE 일 경우 HTML 문서위로 ResponseText를 강제 입력합니다. Meta값이 포함되어 HTML이 작성되며 innerText를 사용할 수 없습니다. 기본값은 False 입니다. '_____________RequestType : 요청방식입니다. 기본값은 "GET"입니다. '▶ 사용 예제 'Dim HtmlResult As Object 'Set htmlResult = GetHttp("https://www.naver.com") 'msgbox htmlResult.body.innerHTML '############################################################### Dim oHTMLDoc As Object: Dim objHTTP As Object Dim HTMLDoc As Object Dim i As Long: Dim blnAgent As Boolean: blnAgent = False Dim sUserAgent As String: sUserAgent = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Mobile Safari/537.36" Application.DisplayAlerts = False If Left(URL, 4) <> "http" Then URL = "http://" & URL Set oHTMLDoc = CreateObject("HtmlFile") Set HTMLDoc = CreateObject("HtmlFile") ' 2023-02-22 | 수정 | 윈도우 인증 접속 문제 발생 시 (일부 버전) ServerXMLHTTP -> XMLHTTP 요청으로 변경 ' XMLHTTP 요청 시, TimeOut 세팅 불가 (기본값 설정) ' https://stackoverflow.com/questions/11605613/differences-between-xmlhttp-and-serverxmlhttp On Error GoTo SendError: '------------------------------ If isWinHttp = False Then Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") Else Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") End If objHTTP.setTimeouts 1200000, 1200000, 1200000, 1200000 '응답 대기시간 120초 ' 2023-02-22 | 수정 | 윈도우 인증 접속 문제 발생 시 (일부 버전) ServerXMLHTTP -> XMLHTTP 요청으로 변경 SendRestart: '------------------------------ objHTTP.Open RequestType, URL, False If Not IsMissing(RequestHeader) Then Dim vRequestHeader As Variant For Each vRequestHeader In RequestHeader Dim uHeader As Long: Dim Lheader As Long: Dim steps As Long uHeader = UBound(vRequestHeader): Lheader = LBound(vRequestHeader) If (uHeader - Lheader) Mod 2 = 0 Then GetHttp = CVErr(xlValue): Exit Function For i = Lheader To uHeader Step 2 If vRequestHeader(i) = "User-Agent" Then blnAgent = True objHTTP.setRequestHeader vRequestHeader(i), vRequestHeader(i + 1) Next Next End If If blnAgent = False Then objHTTP.setRequestHeader "User-Agent", sUserAgent objHTTP.send formText If includeMeta = False Then With oHTMLDoc .Open .Write objHTTP.responseText .Close End With Else oHTMLDoc.Body.innerHTML = objHTTP.responseText End If Set GetHttp = oHTMLDoc Set oHTMLDoc = Nothing Set objHTTP = Nothing Application.DisplayAlerts = True ' 2023-02-22 | 수정 | 윈도우 인증 접속 문제 발생 시 (일부 버전) ServerXMLHTTP -> XMLHTTP 요청으로 변경 Exit Function SendError: Set objHTTP = CreateObject("MSXML2.XMLHTTP") On Error GoTo 0 Resume SendRestart: '------------------------------ End Function Function Splitter(v As Variant, Cutter As String, Optional Trimmer As String) '############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com) '▶ Splitter 함수 '▶ Cutter ~ Timmer 사이의 문자를 추출합니다. (Timmer가 빈칸일 경우 Cutter 이후 문자열을 추출합니다.) '▶ 인수 설명 '_____________v : 문자열입니다. '_________Cutter : 문자열 절삭을 시작할 텍스트입니다. '_________Trimmer : 문자열 절삭을 종료할 텍스트입니다. (선택인수) '▶ 사용 예제 'Dim s As String 's = "{sa;b132@drama#weekend;aabbcc" 's = Splitter(s, "@", "#") 'msgbox s '--> "drama"를 반환합니다. '############################################################### Dim vaArr As Variant On Error GoTo EH: vaArr = Split(v, Cutter)(1) If Not IsMissing(Trimmer) Then vaArr = Split(vaArr, Trimmer)(0) Splitter = vaArr Exit Function EH: Splitter = "" End Function Function GoogleTranslate(OriginalText, _ Optional sFrom As String = "auto", _ Optional sTo As String = "") As String '■변수 선언 및 할당 Dim strURL As String: Dim objHTTP As Object Dim objHTML As Object: Dim objDivs As Object Dim objDiv As Variant: Dim strResult As String Dim vaRng As Variant: Dim Rng As Variant Application.EnableEvents = False If sTo = "" Then If Application.LanguageSettings.LanguageID(msoLanguageIDUI) = 1042 Then sTo = "ko" Else sTo = "en" End If If TypeName(OriginalText) = "Range" Then For Each vaRng In OriginalText For Each Rng In vaRng If Rng <> "" Then strtext = strtext & Rng & vbNewLine Else strtext = strtext & vbNewLine End If Next Next Else strtext = OriginalText End If '■ 구글 번역 API 요청 strtext = ENCODEURL(strtext) strURL = "https://translate.google.com/m?hl=" & sFrom & _ "&sl=" & sFrom & _ "&tl=" & sTo & _ "&ie=UTF-8&prev=_m&q=" & strtext On Error GoTo EH: Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") objHTTP.Open "GET", strURL, False objHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Mobile Safari/537.36" objHTTP.send "" strResult = objHTTP.responseText '# 수정 | 2023-02-22 | 2016 이전 버전에서 Element 개체 반환 시 줄바꿈 -> 띄어쓰기로 변환되는 문제 확인되어 코드 수정 '■ 번역 결과 확인 If InStr(1, strResult, "Error 413") > 0 Then GoogleTranslate = "#Request Too Large!": Exit Function strResult = Splitter(strResult, "<div class=""result-container"">", "</div><div class=""links-container"">") '■ 결과값 출력 GoogleTranslate = Convert_Html_Entities(strResult) Application.EnableEvents = True Set objHTML = Nothing: Set objHTTP = Nothing Exit Function EH: GoogleTranslate = "#TimeOut" Application.EnableEvents = True Set objHTML = Nothing: Set objHTTP = Nothing End Function Function Convert_Html_Entities(c) c = Replace(c, """, """") c = Replace(c, "&", "&") c = Replace(c, "'", "'") c = Replace(c, "<", "<") c = Replace(c, ">", ">") c = Replace(c, " ", vbNewLine) c = Replace(c, "¡", "¡") c = Replace(c, "¢", "¢") c = Replace(c, "£", "£") c = Replace(c, "¤", "¤") c = Replace(c, "¥", "¥") c = Replace(c, "¦", "|") c = Replace(c, "§", "§") c = Replace(c, "¨", "¨") c = Replace(c, "©", "ⓒ") c = Replace(c, "ª", "ª") c = Replace(c, "«", "≪") c = Replace(c, "¬", "¬") c = Replace(c, "®", "®") c = Replace(c, "°", "°") c = Replace(c, "±", "±") c = Replace(c, "²", "²") c = Replace(c, "³", "³") c = Replace(c, "´", "´") c = Replace(c, "µ", "μ") c = Replace(c, "¶", "¶") c = Replace(c, "·", "·") c = Replace(c, "¸", "¸") c = Replace(c, "¹", "¹") c = Replace(c, "º", "º") c = Replace(c, "»", "≫") c = Replace(c, "¼", "¼") c = Replace(c, "½", "½") c = Replace(c, "¾", "¾") c = Replace(c, "¿", "¿") c = Replace(c, "×", "×") c = Replace(c, "ß", "ß") c = Replace(c, "÷", "÷") c = Replace(c, "ÿ", "y") c = Replace(c, "ˆ", "^") c = Replace(c, "˜", "~") c = Replace(c, "—", "-") c = Replace(c, "‘", "'") c = Replace(c, "’", "'") c = Replace(c, "‚", "'") c = Replace(c, "“", """") c = Replace(c, "”", """") c = Replace(c, "„", """") c = Replace(c, "†", "†") c = Replace(c, "‡", "‡") c = Replace(c, "…", "…") c = Replace(c, "‰", "‰") c = Replace(c, "‹", "?") c = Replace(c, "›", "?") c = Replace(c, "€", "€") c = Replace(c, "™", "™") c = Replace(c, "’", "’") c = Replace(c, "«", "≪") c = Replace(c, "»", "≫") c = Replace(c, "¢", "¢") c = Replace(c, "©", "ⓒ") c = Replace(c, "µ", "μ") c = Replace(c, "£", "£") c = Replace(c, "¥", "¥") c = Replace(c, "ÿ", "y") c = Replace(c, "´", "´") Convert_Html_Entities = c End Function Function ENCODEURL(varText As Variant, Optional blnEncode = True) '############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com) '▶ EncodeURL 함수 '▶ 한글/영문, 특수기호가 포함된 문자열을 웹 URL 표준 주소로 변환합니다. '▶ 인수 설명 '_____________varTest : 표준 URL 주소로 변환할 문자열입니다. '_____________blnEncode : TRUE 일 경우 결과값을 출력합니다. '▶ 사용 예제 's = "http://www.google.com/search=사과" 's = ENCODEURL(s) 'MsgBox s '############################################################### Static objHtmlfile As Object If objHtmlfile Is Nothing Then Set objHtmlfile = CreateObject("htmlfile") With objHtmlfile.parentWindow .execScript "function encode(s) {return encodeURIComponent(s)}", "jscript" End With End If If blnEncode Then ENCODEURL = objHtmlfile.parentWindow.encode(varText) End If End Function
ChatGPT 회원가입 및 API키 발급받기
엑셀과 GPT를 결합한 자동화 세계에 입문하시는 여러분을 환영합니다.🎉 IT 뉴스나 영상에서 "GPT-2", "GPT-3"라는 용어를 한 번쯤 접해 보신 분이 많을 것입니다.
이번 강의에서 사용할 GPT API는 GPT-3 모델 기반의 문장 완성(Text Completion) 기능을 활용합니다. 2023년 2월 기준으로 ChatGPT는 OpenAI 홈페이지에서 테스트용으로만 제공되고 있으며, ChatGPT API가 정식 공개되는 시점에 맞춰 후속 강의를 준비해 드리겠습니다.
그렇다면 GPT-3 API가 ChatGPT보다 성능이 부족할까요? 결론부터 말씀드리면 그렇지 않습니다. 내부 기술적으로는 차이가 있지만, 사용자 입장에서 두 모델의 가장 큰 차이는 '대화형 질의응답이 가능한지' 여부입니다. GPT는 앞으로 일상과 업무에 폭넓게 자리 잡을 핵심 기술인 만큼, 미리 익혀 두면 본격적인 도입 시점에 한 발 앞서 나갈 수 있습니다. ChatGPT의 기술적 배경이 궁금하다면 유튜브와 구글에 정리된 전문가 자료를 참고해 주세요.😉
이제 엑셀과 ChatGPT 연동의 첫 단계로, API 키를 발급받는 방법부터 하나씩 살펴보겠습니다.

API 키란 무엇인가요?
API 키는 ChatGPT 서비스를 외부 프로그램에서 호출하기 위한 인증 키입니다. OpenAI에 처음 가입하면 3개월간 사용할 수 있는 $18 무료 크레딧이 제공됩니다.

무료 사용 기간이 지나거나 크레딧을 모두 소진한 경우, 결제 수단을 등록해야만 GPT API를 계속 사용할 수 있습니다. 비용 및 정산 방식에 대한 자세한 내용은 본문 하단의 "ChatGPT 결제수단 등록 및 비용 확인" 항목을 참고해 주세요.
OpenAI 홈페이지 회원가입 및 API키 발급받기
- ChatGPT 로그인하기 : 아래 링크를 클릭해 OpenAI의 ChatGPT 메인 페이지로 이동한 뒤, 우측 상단의 [API] 버튼을 클릭합니다.

- 기존 회원 계정이 있다면 [LOG IN] 버튼을 클릭해 로그인합니다. 계정이 없다면 [SIGN UP] 버튼을 클릭해 회원 가입 후 로그인합니다. 기존 구글 계정으로도 간편하게 로그인할 수 있습니다.
오빠두Tip : 기존 회원이면서 가입 후 3개월이 지났다면, $18 무료 크레딧 사용 기한이 만료되어 결제 수단 등록이 필요할 수 있습니다.
강의 진행 중 "#Error! : You exceeded your current quota, please check your plan and billing details." 메시지가 표시된다면, 본문 마지막에 안내한 결제 수단을 등록한 뒤 강의를 이어가시면 됩니다. - ChatGPT API키 발급하기 : 로그인 후 우측 상단의 프로필 아이콘을 클릭하여 [View API Keys] 메뉴로 이동합니다.

- 새 페이지로 이동한 뒤, 중앙의 [+ Create new secret key] 버튼을 클릭하면 API 키가 발급됩니다. 발급된 키는 즉시 복사하여 메모장에 붙여넣은 뒤 안전한 위치에 보관합니다.
오빠두Tip : API 키는 서비스 사용을 위한 회원증·비밀번호와 같은 인증 수단입니다. 따라서 외부로 유출되지 않도록 안전하게 관리해야 합니다. 키를 분실한 경우, 기존 키를 삭제한 후 새 API 키를 다시 발급받아 사용하면 됩니다. - 이제 엑셀과 ChatGPT를 연동하기 위한 모든 준비가 끝났습니다. 예제파일을 실행한 뒤, 본격적인 엑셀 - ChatGPT 연동 실습을 진행해 보겠습니다.

엑셀 - ChatGPT 연동 마스터 코드 추가하기
- ChatGPT 마스터코드 추가하기 : 예제파일을 실행한 뒤, [개발도구] 탭의 [Visual Basic] 버튼을 클릭합니다. [개발도구] 탭이 표시되지 않는 경우, 리본 메뉴를 우클릭 → [리본 메뉴 사용자 지정] → 개발도구 항목을 체크한 후 [확인]을 눌러 활성화할 수 있습니다.
오빠두Tip : 실무에 꼭 필요한 VBA 핵심 기능만 빠르게 익히고 싶다면, 위캔두 멤버십 회원에게 제공되는 '4회 완성! VBA 특강'을 확인해 보세요.
- 매크로 편집기가 실행되면, [삽입] 탭 → [모듈]을 클릭하여 새 모듈을 추가합니다.

- 추가된 모듈 안에, 홈페이지에 올려 둔 엑셀-ChatGPT 연동 마스터 코드를 복사하여 붙여넣기합니다.

- 코드에 API키 입력하기 : 붙여넣은 코드의 최상단으로 이동하면, API 키를 입력하는 위치가 있습니다. 이곳에 앞 단계에서 발급받은 API 키를 붙여넣기하면 엑셀-ChatGPT 연동을 위한 모든 준비가 완료됩니다. 이제 본격적인 실습을 진행해 보겠습니다.👏

xGPT, xGPT_List 함수로 ChatGPT 결과 출력하기
- xGPT 함수 사용하기 : 예제파일의 첫 번째 시트인 [간단 질문] 시트로 이동합니다. '질문을 작성하세요!' 라벨 우측의 C5셀에 아래 예시와 같은 간단한 질문을 입력합니다.
① 안녕! 오늘 하루는 어때? (일상 질문)
② 연인에게 보낼 김치찌개와 관련된 사랑의 시를 50자 정도로 작성해주세요. (시짓기)
③ 엑셀에서 A1:D100 범위에 입력된 데이터 중, A열을 참조하여 C열에 입력된 값을 검색하는 함수를 작성해주세요. (엑셀 수식 작성)
④ 헬스장 계약을 취소할 때, 업체에서 남은 잔여금을 환불해주지 않을 경우 대응 방법에 대해 법률 자문을 해주세요. (법률 자문 구하기) - GPT 결과를 출력할 B8셀을 선택한 후 =x 를 입력하면, 아래 그림처럼 =xGPT 함수가 자동완성 목록에 표시됩니다. 함수를 선택한 뒤 TAB 키를 누르거나, 함수명을 직접 입력해도 됩니다.

- 이어서 아래와 같이 xGPT 함수를 작성합니다.
=xGPT( GPT명령어, [무작위성], [최대토큰수] )
=xGPT( C5, C6 )' 무작위성 : 0~1 사이의 숫자입니다. 기본값은 0입니다.
- 0에 가까울수록 정확한 답변(정해진 단어)를 사용하고, 1에 가까울수록 다양한 답변을 얻을 수 있습니다.
- 정확한 답변을 얻어야 하는 경우(법률 자문, 수식 작성, 코드 작성 등)에는 0에 가깝게 사용하고 다양한 답변을 얻는 경우(시 짓기, 주제 정하기)에는 1에 가깝게 사용합니다.
' 최대 토큰수 : 각 GPT 모델에 따라 설정되는 최대 토큰수입니다. 기본값은 최대 토큰수의 절반입니다.
- 토큰수는 입력토큰+출력토큰의 합계입니다. 만약 사용하는 GPT모델의 최대토큰이 2048이고, 입력값으로 2000토큰을 사용했다면 출력값으로는 48토큰에 해당하는 값만 출력할 수 있습니다.
- 토큰당 비용은 사용하는 GPT모델에 따라 다르게 계산됩니다.
- 함수를 입력한 뒤 잠시 기다리면 ChatGPT 응답을 받을 수 있습니다. 응답을 확인했다면, 작성한 함수를 삭제한 후 다음 시트로 이동합니다.
오빠두Tip : GPT 응답 시간은 ① 사용 언어(한글/영어), ② 출력 글자수, ③ 서버 부하에 따라 15초~60초가량 소요될 수 있습니다. - xGPT_List 함수 사용하기 : xGPT 함수는 결과값을 하나의 셀에 문장 형태로 출력합니다. 반면 xGPT_List 함수를 사용하면 여러 항목을 여러 셀에 나누어 출력할 수 있어, 목록 형태의 결과를 받을 때 유용합니다.
=xGPT_List( GPT명령어, [무작위성], [최대토큰수] )
' 여러 줄로 반환된 GPT 답변을 범위로 출력합니다.
' 엑셀 2019 이전 버전에서는 넓은 범위를 선택한 상태에서 함수 작성 후, Ctrl + Shift + Enter로 입력합니다.오빠두Tip : xGPT_List 함수는 배열 수식이므로 엑셀 2019 이전 버전에서는 충분히 넓은 범위를 미리 선택한 상태에서 =xGPT_List 함수를 작성 후 반드시 Ctrl + Shift + Enterr로 입력해야 합니다. 엑셀 2021/M365에서는 일반 함수와 동일하게 입력하면 됩니다. - 예제파일의 두 번째 시트인 [아이디어 얻기] 시트로 이동한 뒤, 아이디어를 얻을 주제와 개수, 항목 구분자로 '줄바꿈'을 선택합니다. 모든 항목을 선택하면 C10셀에 GPT 명령어가 자동으로 생성되도록 함수를 미리 작성해 두었습니다.

- GPT 결과를 출력할 B13셀을 선택한 후, 아래와 같이 xGPT_List 함수를 작성합니다. 잠시 기다리면 입력한 주제에 대한 아이디어가 셀 범위로 반환됩니다.
=xGPT_List(C10,C11)
오빠두Tip : 엑셀 2019 이전 버전 사용자는 B13:B30 범위를 먼저 선택한 상태에서 xGPT_List 함수를 작성한 뒤 Ctrl + Shift + Enter로 입력합니다. - xGPT_List 결과를 확인했다면, 작성한 함수를 모두 삭제한 후 다음 시트로 이동합니다.

xGPT 함수 사용시 주의사항
엑셀 시트에 작성된 함수는 시트의 값이 변경되거나 파일이 다시 열릴 때마다 자동으로 재계산됩니다. 따라서 API를 호출하는 xGPT·xGPT_List 함수는 일회성 사용에는 편리하지만, 시트에 함수를 그대로 남겨 두면 함수가 반복 실행되면서 ① 파일이 느려지고, ② 불필요한 API 호출로 비용이 누적되는 문제가 발생합니다.

따라서 엑셀-GPT 기능을 반복적으로 사용해야 한다면, VBA 코드 한 줄만 작성하여 버튼 클릭만으로 GPT 기능을 호출하도록 구성하는 방법을 권장합니다.
버튼 클릭으로 엑셀에서 ChatGPT 실행하기
- GPT 실행 명령문 작성하기 : 예제파일의 세 번째 시트인 [키워드 분석] 시트로 이동합니다. 이번에는 GPT를 호출하는 매크로를 직접 작성한 뒤, 버튼 클릭만으로 엑셀-ChatGPT를 연동하는 방법을 살펴보겠습니다. (VBA 코드 한 줄이면 충분합니다.👍) 시트에 미리 준비된 이력서 예시 중 하나를 복사한 뒤, C4셀을 더블클릭하여 편집 모드로 진입한 상태에서 값 형식으로 붙여넣기합니다.

- [개발도구] 탭 → [Visual Basic] 버튼 또는 단축키 Alt + F11을 눌러 매크로 편집기를 실행합니다. 좌측 프로젝트 창에서 앞 단계에서 추가한 모듈을 더블클릭하면, 붙여넣은 코드를 확인할 수 있습니다. 코드 중간에 미리 작성된 MyGPT_Test1 명령문을 MyGPT_xxxxx 형태로 원하는 이름으로 변경합니다. 명령문이 추가로 필요한 경우, 아래에 제공된 코드를 복사·붙여넣기하거나 원하는 이름으로 새로 작성하면 됩니다. 본 강의에서는 명령문 이름을 MyGPT_Keyword로 변경하여 진행하겠습니다.

- 이제 명령문의 Sub ~ End Sub 사이에 매크로 코드 한 줄만 추가하면 됩니다. 미리 준비해 둔 코드는 바로 xGPT_Run 함수입니다.
xGPT_Run "입력셀주소", "출력셀주소", [목록출력여부]
' 입력셀주소 : GPT 명령어가 작성된 셀 주소를 작성합니다.
' 출력셀주소 : GPT 결과를 출력할 셀 주소를 작성합니다.
' 목록출력여부 : True일 경우 출력셀주소의 시작셀을 기준으로, GPT 결과가 범위로 반환됩니다. - [키워드 분석] 시트의 경우, GPT 명령어 입력 셀은 "C6", 출력 셀은 "B8", 목록 출력 여부는 True이므로 아래와 같이 코드 한 줄만 작성하면 됩니다.
xGPT_Run "C6", "B8", True

- 버튼 클릭으로 GPT 실행하기 : 코드 작성을 마쳤다면, 매크로 편집기를 종료한 뒤 [키워드 분석] 시트로 돌아옵니다. 시트의 [GPT 실행] 버튼을 우클릭 → [매크로 지정]을 선택하면, 방금 작성한 "MyGPT_Keyword" 명령문이 목록에 표시됩니다. 명령문을 선택한 후 [확인] 버튼을 클릭하면 매크로가 버튼에 등록됩니다.

- 이제 버튼을 클릭해 보세요. 이력서의 핵심 키워드가 GPT 결과로 출력됩니다.

지금 실무에 바로 적용가능한 엑셀 - ChatGPT 사용 예제
지금까지 살펴본 xGPT 함수, xGPT_List 함수, xGPT_Run 매크로를 활용하면 상황에 맞게 엑셀과 ChatGPT를 자유롭게 연동할 수 있습니다. ChatGPT와 엑셀의 결합은 실무에서 다양한 방식으로 활용할 수 있으며, 본 강의에서는 대표적인 두 가지 예제를 살펴보겠습니다.
- 재무제표 분석하기 : ChatGPT는 인터넷 공개 자료를 기반으로 학습된 모델이며, 전체 학습량 중 한국어 비중은 2%에 미치지 못한다고 알려져 있습니다. 따라서 수학적 사실이나 언어와 무관한 일반 논제는 한국어보다 영어로 질의할 때 더 빠르고 정확한 답변을 얻을 수 있습니다. 예제파일의 네 번째 시트인 [재무제표 분석] 시트로 이동한 뒤, 우측에 준비된 삼성전자 링크를 클릭해 야후 증권의 삼성전자 재무제표 페이지로 이동합니다. 페이지의 재무제표 영역을 드래그하여 복사합니다.

- 다시 [재무제표 분석] 시트로 돌아와, 복사한 재무제표 데이터를 C4셀에 값 형식으로 붙여넣기합니다.

- 앞서 [키워드 분석] 시트에서 작성한 매크로는 입력 셀이 "C6", 출력 셀이 "B8"이었습니다. [재무제표 분석] 시트도 동일한 셀 구성이므로, 앞서 작성한 매크로를 그대로 재사용할 수 있습니다. [GPT 실행] 버튼을 우클릭 → [매크로 지정]을 선택한 후, 앞서 작성한 "MyGPT_Keyword" 명령문을 등록합니다.

- 버튼을 클릭한 뒤 잠시 기다리면, 붙여넣은 재무제표에 대한 분석 결과가 GPT 응답으로 출력됩니다.

- GoogleTranslate함수로 실시간 번역하기 : 이제 GoogleTranslate 함수를 사용해 영어로 출력된 GPT 결과를 한국어로 번역해 보겠습니다.
=GoogleTranslate("번역할문장","출발어","도착어")
' 출발어의 기본값은 자동입니다. 도착어의 기본값은 한국어입니다.
' 한국어 문장을 영어로 번역할 경우, =GoogleTranslate("안녕하세요.","ko","en") 으로 작성합니다.
' 함수에서 제공하는 언어 목록은 구글 공식 홈페이지를 참고하세요.
https://cloud.google.com/translate/docs/languages?hl=ko오빠두Tip : GoogleTranslate 함수는 엑셀-ChatGPT 연동 마스터 코드에 미리 포함된 VBA 사용자 정의 함수입니다. (엑셀이 기본으로 제공하는 함수가 아닌 점에 주의해 주세요.) - 예제파일의 B16셀에 아래와 같이 GoogleTranslate 함수를 작성한 후, 수식을 아래 방향으로 자동 채우기하면 한국어로 번역된 결과가 출력됩니다.

- 키워드로 보고서/포스팅 자동 완성 : 엑셀과 ChatGPT를 연동하면, 주제(키워드)만 입력해도 A4 용지 1~2장 분량의 보고서를 자동으로 완성할 수 있습니다. 예제파일의 마지막 시트인 [보고서 자동완성] 시트로 이동한 뒤, 문서 종류를 선택하고 작성할 주제를 1~5개까지 자유롭게 입력합니다.

- 문서 종류와 주제가 입력되면, GoogleTranslate 함수가 영어로 번역한 결과를 받아 해당 문장을 GPT 명령어로 자동 구성하도록 C16셀에 함수가 미리 작성되어 있습니다.

- 앞서와 동일한 방식으로 매크로 편집기에서 입력 셀 C16, 출력 셀 B18로 GPT를 실행하도록 xGPT_Run 함수를 아래 그림과 같이 작성한 후, [GPT 실행] 버튼에 매크로를 등록합니다.
오빠두Tip : 이번 예제는 GPT 결과를 범위가 아닌 단일 셀 안에 문장 형태로 출력해야 하므로, xGPT_Run 함수의 마지막 인수를 false로 지정합니다. - 이제 [GPT 실행] 버튼을 클릭하고 잠시 기다리면, 입력한 키워드·주제에 대한 보고서가 자동으로 작성됩니다.

완성한 파일을 매크로 사용 통합문서로 저장하기
- 작성한 엑셀 파일에는 매크로가 포함되어 있으므로, 파일 저장 시 반드시 '매크로 사용 통합문서'로 저장해야 합니다. 단축키 F12 또는 [파일] 탭 → [다른 이름으로 저장]을 선택하면 [다른 이름으로 저장] 대화상자가 표시됩니다.
- 파일 형식에서 "Excel 매크로 사용 통합 문서(*.xlsm)"를 선택한 뒤 [저장] 버튼을 클릭하면 매크로 사용 통합문서로 저장됩니다.
오빠두Tip : 저장한 매크로 통합문서를 다른 PC에서 실행할 경우, 엑셀 상단의 [콘텐츠 사용] 버튼을 클릭해야 매크로가 활성화됩니다. M365 최신 버전에서는 파일을 우클릭 → [속성] → [차단 해제] 항목을 체크한 뒤에야 매크로 사용이 가능합니다.
ChatGPT 결제수단 등록 및 비용 확인
GPT API의 토큰 단위와 비용 계산 방법
GPT API는 '토큰(Token)' 단위로 비용이 산정됩니다. GPT 언어 모델별 비용에 대한 자세한 안내는 아래 OpenAI 공식 페이지를 참고해 주세요.
https://openai.com/api/pricing/
- Davinci (최고 성능, $0.02(26원)/1,000 토큰, 최대 4,000 토큰 지원)
창의적 문제 해결, 논제 답변, 원인·결과 분석, 문장 이해 및 자동 완성, 감정 분석 등 폭넓은 작업을 처리할 수 있습니다. 성능이 가장 우수한 대신, 다른 모델에 비해 응답 속도가 다소 느릴 수 있습니다. - Curie (범용 성능, 빠른 속도, $0.002(2.6원)/1,000 토큰, 최대 2,048 토큰 지원)
OpenAI가 제공하는 모델 중 가장 가성비가 좋은 모델입니다. Babbage가 수행하는 작업에 더해 감정 분석, 문서 요약·정리, 대화형(챗봇) 응답, 질의응답까지 처리할 수 있습니다. - Babbage (Ada 대비 향상된 성능, $0.0005(0.65원)/1,000 토큰, 최대 2,048 토큰 지원)
Ada보다 한 단계 향상된 문장 교정·추출 성능을 제공하는 GPT 모델입니다. - Ada (최고 속도, $0.0004(0.52원)/1,000 토큰, 최대 2,048 토큰 지원)
단어 추출, 문장 교정 등 가장 단순한 작업에 최적화된 모델입니다. 명령어(prompt)를 명확하게 작성할수록 더 나은 결과를 얻을 수 있습니다.
1,000 토큰으로 어느정도 길이의 문장을 만들 수 있나요?
한글 기준 400~450자, 영문 기준 약 750단어를 작성할 수 있으며, 1,000 토큰당 A4 용지 0.5~1장 분량에 해당합니다. (한글은 영문 대비 약 4배의 토큰을 사용하므로, 동일 비용 내에서 더 많은 결과를 얻으려면 영어 사용이 유리합니다.)
따라서 Davinci 모델로 A4 1장 분량의 보고서를 작성할 경우 약 30~50원, Curie 모델의 경우 약 3~5원의 비용이 발생합니다. 보고서 형식이나 명령어의 정확한 토큰 수가 궁금하다면, 아래 OpenAI Tokenizer를 통해 직접 계산할 수 있습니다.
https://platform.openai.com/tokenizer
최대 토큰은 무엇인가요?
GPT 질문(명령어, prompt)으로 사용된 입력 토큰과, 결과로 반환되는 출력 토큰의 합을 의미합니다. 예를 들어 Curie 모델은 최대 2,048 토큰을 지원하므로, 질문에 500 토큰을 사용했다면 출력에는 최대 1,548 토큰까지만 활용할 수 있습니다.
GPT API 결제 수단 등록 방법
- 결제수단 등록하기 : OpenAI 계정 설정 페이지로 이동한 뒤, 좌측 메뉴의 [Billing] 탭 → [Set up paid account] 버튼을 클릭하여 결제 수단을 등록합니다.

- 이후 [Usage] 탭에서 OpenAI API 사용량을 실시간으로 조회할 수 있습니다. (약 1분 단위로 거의 실시간 조회가 가능합니다.)

- 사용한도 설정하기 : 사용 한도를 설정하려면 [Billing] 탭 → [Usage Limits]에서 한도를 지정할 수 있습니다. Soft Limit를 초과하면 관리자 계정으로 알림 이메일이 발송되며, Hard Limit를 초과할 경우 API 사용이 자동으로 제한됩니다.

#Error! : You exceeded your current quota, please check your plan and billing details.
OpenAI에서 무료로 제공하는 크레딧 사용기한(3개월)이 지났거나 크레딧을 모두 사용하셔서 그렇습니다.
크레딧은 사용기한이 있기 때문에, 가입 후 사용하지 않을 경우 자동소멸되며 크레딧이 없을 경우 지불방식을 등록하신 후 사용하면 됩니다.
영상 강의 24분 33초에 안내해드린 방법으로 지불방식 등록 후 사용해보세요.
엑셀은 API 호출을 위한 도구로만 사용되며, 크레딧과는 무관합니다.
크레딧은 API를 사용한 만큼 비용이 발생됩니다.
감사합니다.
GPT응답 최대 대기시간을 120초로 설정하였습니다.
간혹 한글로 답변받을 시, 최대 대기시간을 초과할 때가 있습니다.
그럴 때 #VALUE! 오류가 반환될 수 있습니다.
또는 인터넷 연결이 고르지 않아, 중간에 연결이 끊겼을 경우에도 #VALUE! 오류가 반환됩니다.
간단한 질문 중 hello 라고 입력해도 그렇습니다
원인을 모르겠네요 ㅜㅜ
xGPT 함수를 사용한게 맞으실까요?
아마도 xGPT_List 함수를 사용하셔서 그런 것 같습니다.
강의에서 안내해 드린 것 처럼, xGPT_List 함수는 배열함수이므로 2019 이전버전에서는 범위를 넓게 선택한 상태에서 xGPT_List 함수를 작성 후 반드시'Ctrl+Shift+Enter'(배열수식)으로 입력해야 합니다
한번 확인해보세요 :)
xGPT 함수 명령문 중,
코드 밑에
를 추가하셔서 sResult로 GPT 결과가 올바르게 반환되는지 우선 확인해보시겠어요?
결과는 똑같네요 #VALUE!...
윈도우 검색창에 'Windows 기능 켜기/끄기'를 실행한 후,
"Net Framework 3.5(.Net2.0 및 3.0 포함)을 체크하고 확인 버튼을 눌러 설치해보세요.
.Net Framework가 누락되는 이유는, 윈도우와 사용하고 계신 엑셀의 운영체제(x84, x64)가 달라서 그렇습니다.
.Net Framework를 설치하면 바로 해결되실거에요 ^^
만약 xGPT_Run 사용시 문제가 있을 경우, 중간에 안내창이 나오며 노란색으로 디버깅이 표시될겁니다. 디버깅으로 표시된 부분, 오류메시지를 올려주시면 확인 도와드리겠습니다.
xGPT_List 함수는 Ctrl + Shift + Enter 로 입력하셔야 합니다!
다시 한번 확인해보세요. :)
xlsx 확장자로 저장하시면 매크로가 실행이 안되서 #VALUE! 값이 나옵니다.
저도 동일한 문제가 발생했는데요. xlsm 확장자로 저장하니 잘 됩니다.
영문 윈도우에서 한글이 깨질 경우, 윈도우의 로켈 설정을 추가하면 됩니다.
https://www.oppadu.com/question/?mod=document&uid=18143
위 링크를 참고하셔서 로켈 설정을 변경한 후 다시 시도해보시겠어요? :-)
- 해당 내용과 같이 언어 설정이 되어 있음에도 불구하고 한글이 깨져 보입니다.
- API 코드를 복사 붙여넣기 하였는데 코드가 제공되지 않았다는 내용이 보입니다.
제 사용환경은 회사에서 제공한 델 노트북/ WiN10입니다.Excel 버전은 365입니다.
조언 부탁드립니다.
감사합니다.
참고로, 저는 VBA 오늘 처음 써봅니다.
영상 강의에서 안내해드린 순서대로
매크로 편집기에 마스터 코드를 붙여넣기 후 사용해보세요.^^