# 챗GPT 구독료도 아끼고, 엑셀에서 프롬프트 바로 이용하는 TIP [코파일럿 아님]

## 들어가며

알파벳처럼 AI 활용을 누구나 쉽게 다룰 수 있게 돕는 상상력집단입니다.

### ※ 지난번 글을 읽고 오시면 이해가 더 쉽습니다

[AI 최신 정보/노하우 공유 - ALPHABET-AI](https://slashpage.com/alphabet-ai/943zqpmq5j99emwnvy87?draft=36nj8v2w46yr3m5ykq9z&editPost=1&post=qpv5x427gpx312kyn3dw&v=qm42yw)

지난번 포스팅에서는, 

내가 원하는 지식을 어떻게 다운로드받고 발표자료에 공유하는지를 말씀드렸습니다.

직접 교육/지식관리 업무에 적용하다보니, 

**엑셀 데이터는 그럼 또 따로 모아야 하는거네? 생각보다 그건 좀 귀찮은데?**

**매번 새로운 자료를 매번 일일이 챗GPT에 들어가서 똑같이 입력해야 한다면?**

어떻게 해야 할지에 대한 의문이 들기 시작했습니다.

완전히 고정적인 일을 완전히 고정적인 방식으로 하기엔 생각보다 제법 무리가 있는 방식이기도 하죠.

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/165116_pO9e7KPhhX8C7gVQV4?q=80&s=1280x180&t=outside&f=webp)

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/165138_MGHuLp72aeHxGnbo9v?q=80&s=1280x180&t=outside&f=webp)

> 2025년 3월 20일 기준으로, Chat GPT 4.5 모델 & 자동작업의 베타 기능이 오픈됐습니다.
> 나의 루틴한 업무를 GPT 채팅창 안에서 해결해도 이상 없으실 분들께는 유용하게 쓰일 것입니다.

PPT에 이어 엑셀에도 직접 챗GPT를 이식하는 작업을 시도해보겠습니다.

> 이러한 방식은 우리가 늘 우려하던 **민감한 자료 유출의 가능성이 없는 방식**으로 수행되고,
**원 클릭 & 원 태스크 방식**으로 간단하게 구현할 것이기 때문에

꾸준히 해야 할 일은 있지만 **'바빠서' '몸이 너무 힘들어서' '생각할 겨를조차 안나서'** 
와 같은 이슈들도 깔끔하게 해소해줄 것입니다.

이러한 방식은 우리가 늘 우려하던 민감한 자료 유출에 대한 걱정 없는 수준으로 시도되기 때문에,

꾸준히 해야 할 일은 있지만 **'바빠서' '몸이 너무 힘들어서' '생각할 겨를조차 안나서'** 와 같은 이슈들도

깔끔하게 해결해줄 것입니다.

## 시작조차 엄두를 못내게 하는 어려운 요소

비개발자 입장에서 

**'오픈AI API를 활용한다는게 뭐지?' **

**'생각보다 어려운거 아닌가?' **

**라고 느끼게 만드는 요인들은 아래와 같을 겁니다.**

1. **원치 않는 데이터 형식, 텍스트 깨짐**

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/153942_oIPqXOktH7LkwABL4z?q=80&s=1280x180&t=outside&f=webp)

어느정도 기초적인 작업은 수행한다고 쳐도, 글자가 깨지는 경우를 상당히 많이 경험합니다.

답변의 퀄리티가 아쉬운 걸 떠나서, 정보 검색을 위한 web 접속도 불확실하고 최소한 단순한 한글 답변이라도 기대했던 제에게는 많은 회의감을 느끼게 했던 부분입니다. 

1. **남이 만들어준 기능도 작동하지 않을 때의 좌절감**

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/170024_lZMZ67lJr5smA6cVd1?q=80&s=1280x180&t=outside&f=webp)

AI를 본격적으로 활용하기 이전의 저는 바로 이런 케이스에 속하는데요, 

분명히 기존의 완성품을 있는 그대로 써봤는데도 

제가 원하는 부분에 대해서는 답을 주지 않아서 많이 힘들었던 기억이 있습니다.

 

분명히 누군가는 이걸로 엄청난 변화를 느꼈다고 하는데, 

왜 나는 그 첫 단계마저 제대로 실행이 안되는걸까?

업무를 준비하면서 막혀있던 어려움을 뚫어보는 시간,

지난 회고를 반영해 더 간략하게 준비해보았습니다.

수많은 회고를 통해 각자에게 맞는 방식을 발견하고 있는 상상력집단의 해결책을

글보다도 더 즉각적으로 접하시길 원하는 분들은 아래 내용을 확인해주시면 더더욱 감사드리겠습니다.

# ☎️[기업/관공서를 위한 AI교육 문의(클릭)](https://slashpage.com/alphabet-ai/1q3vdn2pj6krk2xy49pr)

 

## 순서

1. **VBA를 수행하기 위한 기본 흐름, 과정 파악 with GPT**

2. **기본적인 VBA 코드 개발 with Claude**

3. **API 활용 결과물과 GPT Plus의 결과물 퀄리티 비교**

## 1. VBA 작업 준비를 위한 과정 질문

지난 회고를 통해 분명해진 것을 말씀드리겠습니다.

최신 버전인 GPT 4.5조차 치열한 논쟁(?) 끝에 제게 솔직하게 털어놓은 부분인데요

웨비나에서도 말씀드렸듯 chatGPT는 뛰어난 범용성을 가지고 있습니다.

대신, 모든 부분에 만능 수준으로 기대하기에는 어려운 부분도 있다는 것을 감안해두고 가야 합니다.

> **(모든 업무 단계를 GPT에만 맡겼다가 제가 오히려 시간낭비를 했다고 느낀 적도 있기 때문에, 경험상 드리는 답변입니다. **

> **따라서 여러 생성형 AI 서비스들의 효용가치는 마찬가지로 직접 써보시면서 결정한다면 더 훌륭한 결과물이 나올 것입니다.)**

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/180923_rNQ69qkMwSiTaRxYtz?q=80&s=1280x180&t=outside&f=webp)

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/181454_VO1XGe0PDLLhLQupVS?q=80&s=1280x180&t=outside&f=webp)

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/181728_f4QURBuoEPs1jSSPc4?q=80&s=1280x180&t=outside&f=webp)

이런 흐름들을 놓고 봤을 때, 

**GPT와 일을 하기 위해 논리적인 대화를 먼저 수행한 뒤, **

**세부적인 실무를 위해서는 경우에 따라 다른 수단을 찾아나가고 있습니다.**

GPT도 인정한 본인의 강점을 살려서, 

챗GPT의 답변을 엑셀에서 그대로 활용하기 좋은 방식은 무엇이며,

오류없이 답변할 수 있는 내용은 무엇이 있는지 먼저 파악하겠습니다.

크게 두가지 유형으로 분류를 해볼건데요.

기존에 가지고 있는 데이터를 엑셀로 조금 더 쉽게 처리하는 방안에 대한 답변,

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/190622_wcwQgPCJnV2zxbdvfK?q=80&s=1280x180&t=outside&f=webp)

**그리고 정보가 완전히 없는 상태에서 새로운 지식을 구축해나가는 방안에 대한 답변입니다.**

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/190657_NQYoUBGKl4h2bdJa9j?q=80&s=1280x180&t=outside&f=webp)

저는 후자의 경우를 훨씬 많이 쓰기 때문에 후자 위주로 진행하겠습니다.

공통적으로 요구하는 것은 

- [ ] 오픈AI api key 발급 

- [ ] VBA 코드 작성 + 엑셀에서 실행할 chatgpt 함수 생성 

- [ ] 엑셀 표 구조에 최적화된 GPT 프롬프트 생성

입니다. 같이 체크해보시면서 궁금한 것들을 해결해나가면 되겠습니다.

먼저 API key 발급입니다.

여러 llm들이 그러하듯 프로젝트 단위로 API key 발급현황, 토큰 및 데이터 소진, 결제금액 등을 관리하게 만드는데요

GPT도 마찬가지로 별개의 관리자 페이지를 만들어두고 있습니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/195130_HO0pedP2HX2Se9DfJK?q=80&s=1280x180&t=outside&f=webp)

나의 사용량 조회를 위한 프로젝트 페이지를 위와 같은 그림으로 만들어놓습니다.

> **[API 사용량 확인하기](https://platform.openai.com/settings/organization/billing/overview)**[
https://platform.openai.com/settings/organization/billing/overview](https://platform.openai.com/settings/organization/billing/overview) 

[https://platform.openai.com/settings/organization/billing/overview](https://platform.openai.com/settings/organization/billing/overview)

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/195817_f9d8CQvLSXcM3H9Mvc?q=80&s=1280x180&t=outside&f=webp)

이후, API key를 생성합니다. 

화면에 보시다시피, 보안성 문제를 이유로 최초 생성한 다음에는 

암호화폐 지갑 코드처럼 완벽하게 해시됩니다. 

**최초 생성된 key는 무조건 바로 복사하시고 개인보관하시기 바랍니다.**

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/191104_OOgkV5TjQqY7gBzseM?q=80&s=1280x180&t=outside&f=webp)

마지막으로, 결제정보 입력으로 넘어가서 카드 넘버를 입력하면 마무리됩니다.

챗GPT 플러스는 웹,모바일앱,크롬확장 등을 통해서 검색과 각종 응용기능을 제공하는 개념이고

오픈AI의 API key 발급은 챗GPT 플랫폼 이외에서의 활용을 허락하는 대신 별도의 이용료를 받겠다는 구조입니다.

하지만 상대적으로 아주 저렴합니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/192300_vRpL12ZcrTFKPkscI8?q=80&s=1280x180&t=outside&f=webp)

특히 GPTs , 리서치, Sora까지 포괄적으로 포함하면서 구독료 인상의 명분을 만들어가는 와중에

**내 입장에서 실전적으로 쓸 수 있는 기능은 챗봇으로 모두 할 수 있다고 생각하시는 분들께는**

**월 1달러 내외 수준의 비용으로 필수적인 업무는 모두 처리할 수 있어 더더욱 와닿는 접근이 되겠습니다.**

작년까지는 대체로 openai 가입만으로도 3개월동안 api를 무료 이용하게 해주었습니다만,

이후부터는 꾸준히 유료 플랜을 고수하고 있습니다.

[https://platform.openai.com/settings/organization/billing/payment-methods](https://platform.openai.com/settings/organization/billing/payment-methods) 

[https://platform.openai.com/settings/organization/billing/payment-methods](https://platform.openai.com/settings/organization/billing/payment-methods)

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/193216_jYeAvZlINMiP186fE1?q=80&s=1280x180&t=outside&f=webp)

해당 페이지에서 결제정보를 추가한 뒤 - 최초 충전금액 최소 5달러 + 이후 주기적인 사용에 따라 추가결제됨 - 나의 실제 이용량 대시보드를 조회하다보면 내가 정말 챗gpt를 이용하길 원했고 실제로 쓰는 분야가 무엇인지 조금 더 명확히 알아나갈 수 있습니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/200550_NDpkY2RPesgurm7DHA?q=80&s=1280x180&t=outside&f=webp)

[https://platform.openai.com/settings/organization/usage](https://platform.openai.com/settings/organization/usage) 

[https://platform.openai.com/settings/organization/usage](https://platform.openai.com/settings/organization/usage)

API 활용을 어디까지 하고 있는가를 살펴보면 저도 계속 채팅에 국한되고 있는 상황이고,

고도화 수준에 따라 변화는 있겠습니다.

## 2. 업무자동화 VBA 코드 개발

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/200910_SRozPIZk99baNWu3Xe?q=80&s=1280x180&t=outside&f=webp)

챗GPT를 이용해 만든 엑셀 VBA 코드가 정작 엑셀에서 작동하지 않는 것을 확인한 뒤,

모든 과정을 굳이 GPT에게 맡기는 것은 오히려 시간 비효율적임을 확실하게 파악하여

claude.ai를 이용해 후속 점검을 요청했습니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/200849_QwIzR1LLNYZ5GFLf9r?q=80&s=1280x180&t=outside&f=webp)

저는 테이블 형태로 최신 뉴스 전달, 트렌드 분석, 컨텐츠 주제에 대해 브레인스토밍을 하고 싶어서

코드가 제대로 작동하지 않은 원인을 분석한 다음 비교적 정확한 수정본을 전달해주고 있습니다.

**※ Claude.ai가 만든, 테이블 형태의 정보 호출을 위한 VBA 매크로 코드**

```javascript
' 방법 1: 매크로 방식 - 가장 권장되는 방법
Sub ChatGPTTableMacro()
    ' 사용자로부터 질문 입력 받기
    Dim prompt As String
    prompt = InputBox("ChatGPT에게 물어볼 질문을 입력하세요:", "ChatGPT 표 생성")
    
    If prompt = "" Then Exit Sub  ' 취소 버튼 누른 경우
    
    ' 현재 선택된 셀
    Dim targetCell As Range
    Set targetCell = Selection.Cells(1, 1)
    
    ' 상태 표시
    Application.StatusBar = "ChatGPT에 요청 중..."
    Application.Cursor = xlWait
    
    ' API 호출
    Dim response As String
    response = GetChatGPTResponse(prompt)
    
    ' 표 형식으로 응답 처리하여 Excel에 삽입
    ProcessTableResponse response, targetCell
    
    ' 상태 복원
    Application.StatusBar = False
    Application.Cursor = xlDefault
    
    MsgBox "테이블이 생성되었습니다.", vbInformation
End Sub

Function GetChatGPTResponse(prompt As String) As String
    Dim objHTTP As Object
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    
    Dim URL As String, API_KEY As String
    URL = "https://api.openai.com/v1/chat/completions"
    API_KEY = "주의할점 : 여기서는 직접 발급받으신 api key를 넣어주세요" 
    
    ' 에러 처리 추가
    On Error Resume Next
    objHTTP.Open "POST", URL, False
    
    If Err.Number <> 0 Then
        GetChatGPTResponse = "연결 오류: " & Err.Description
        Err.Clear
        Exit Function
    End If
    
    On Error GoTo 0
    
    objHTTP.setRequestHeader "Content-Type", "application/json; charset=utf-8"
    objHTTP.setRequestHeader "Authorization", "Bearer " & API_KEY
    
    ' 시스템 메시지로 표 형식 응답 요청
    Dim tableRequest As String
    tableRequest = prompt & " 응답은 Excel에 바로 붙여넣을 수 있도록 CSV 형식이나 탭 구분 형식으로 제공해주세요. 마크다운이나 다른 서식 없이 순수 데이터만 제공해주세요."
    
    Dim json As String
    json = "{""model"": ""gpt-3.5-turbo-0125"", ""messages"": [{""role"": ""system"", ""content"": ""당신은 Excel 셀에 직접 붙여넣을 수 있는 표 형식(CSV/TSV)으로 응답하는 도우미입니다. 헤더 행을 포함해주세요. 마크다운 기호나 설명 없이 순수 데이터만 표 형식으로 제공하세요.""}, {""role"": ""user"", ""content"": """ & tableRequest & """}]}"
    
    ' 타임아웃 설정 증가
    objHTTP.setTimeouts 30000, 30000, 30000, 30000
    
    On Error Resume Next
    objHTTP.send json
    
    If Err.Number <> 0 Then
        GetChatGPTResponse = "API 요청 오류: " & Err.Description
        Set objHTTP = Nothing
        Exit Function
    End If
    
    On Error GoTo 0
    
    If objHTTP.Status = 200 Then
        Dim responseText As String
        responseText = objHTTP.responseText
        
        ' JSON 응답에서 content 부분 추출
        Dim contentStart As Long, contentEnd As Long
        contentStart = InStr(responseText, """content"": """) 
        
        ' content 필드가 없을 경우 처리
        If contentStart = 0 Then
            GetChatGPTResponse = "응답 형식 오류. 원본 응답: " & Left(responseText, 300)
            Set objHTTP = Nothing
            Exit Function
        End If
        
        contentStart = contentStart + 12  ' """content"": """ 다음 위치
        
        contentEnd = contentStart
        Dim i As Long
        
        For i = contentStart To Len(responseText)
            Dim char As String
            char = Mid(responseText, i, 1)
            
            If char = """" Then
                If Mid(responseText, i - 1, 1) <> "\" Then
                    contentEnd = i - 1
                    Exit For
                End If
            End If
        Next i
        
        If contentEnd > contentStart Then
            Dim content As String
            content = Mid(responseText, contentStart, contentEnd - contentStart + 1)
            
            ' 이스케이프된 문자 처리
            content = Replace(content, "\""", """")
            content = Replace(content, "\\", "\")
            content = Replace(content, "\n", vbNewLine)
            
            GetChatGPTResponse = content
        Else
            GetChatGPTResponse = "내용 파싱 오류: " & Left(responseText, 100)
        End If
    Else
        ' 오류 응답에서 더 많은 정보 추출
        Dim errorMsg As String
        errorMsg = "HTTP Error: " & objHTTP.Status & " - " & objHTTP.statusText & vbNewLine
        
        ' 모델 오류인 경우 추가 정보 제공
        If InStr(objHTTP.responseText, "model") > 0 And objHTTP.Status = 404 Then
            errorMsg = errorMsg & vbNewLine & "모델을 찾을 수 없습니다. gpt-3.5-turbo로 시도합니다."
            
            ' gpt-3.5-turbo로 재시도
            Set objHTTP = Nothing
            Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0")
            objHTTP.Open "POST", URL, False
            objHTTP.setRequestHeader "Content-Type", "application/json; charset=utf-8"
            objHTTP.setRequestHeader "Authorization", "Bearer " & API_KEY
            
            json = "{""model"": ""gpt-3.5-turbo"", ""messages"": [{""role"": ""system"", ""content"": ""당신은 Excel 셀에 직접 붙여넣을 수 있는 표 형식(CSV/TSV)으로 응답하는 도우미입니다. 헤더 행을 포함해주세요. 마크다운 기호나 설명 없이 순수 데이터만 표 형식으로 제공하세요.""}, {""role"": ""user"", ""content"": """ & tableRequest & """}]}"
            
            objHTTP.send json
            
            If objHTTP.Status = 200 Then
                responseText = objHTTP.responseText
                contentStart = InStr(responseText, """content"": """) + 12
                
                contentEnd = contentStart
                For i = contentStart To Len(responseText)
                    char = Mid(responseText, i, 1)
                    If char = """" Then
                        If Mid(responseText, i - 1, 1) <> "\" Then
                            contentEnd = i - 1
                            Exit For
                        End If
                    End If
                Next i
                
                If contentEnd > contentStart Then
                    content = Mid(responseText, contentStart, contentEnd - contentStart + 1)
                    content = Replace(content, "\""", """")
                    content = Replace(content, "\\", "\")
                    content = Replace(content, "\n", vbNewLine)
                    
                    GetChatGPTResponse = content
                    Set objHTTP = Nothing
                    Exit Function
                End If
            End If
        End If
        
        ' 원래 오류 메시지 반환
        GetChatGPTResponse = errorMsg & vbNewLine & "응답 내용: " & objHTTP.responseText
    End If
    
    Set objHTTP = Nothing
End Function

Sub ProcessTableResponse(response As String, targetCell As Range)
    Dim lines() As String
    lines = Split(response, vbNewLine)
    
    ' 마크다운 테이블 또는 일반 텍스트 파싱
    Dim dataLines As New Collection
    Dim inTable As Boolean: inTable = False
    Dim i As Long
    
    ' 응답에서 실제 테이블 데이터 추출
    For i = 0 To UBound(lines)
        Dim line As String
        line = Trim(lines(i))
        
        ' 빈 줄 건너뛰기
        If line = "" Then GoTo ContinueForLoop
        
        ' 마크다운 표 구분선 제거 (|---|---|)
        If InStr(line, "|-") > 0 And InStr(line, "|") > 0 Then
            GoTo ContinueForLoop
        End If
        
        ' 마크다운 표시 제거
        If Left(line, 1) = "|" Then
            line = Mid(line, 2, Len(line) - 2)  ' 첫번째와 마지막 | 제거
            line = Replace(line, " | ", vbTab)   ' 구분자를 탭으로 변환
        End If
        
        ' 코드 블록 표시 제거
        If Left(line, 3) = "```" Then
            GoTo ContinueForLoop
        End If
        
        ' 실제 데이터 행 추가
        dataLines.Add line
        
ContinueForLoop:
    Next i
    
    ' 데이터가 없으면 종료
    If dataLines.Count = 0 Then
        targetCell.Value = "테이블 데이터를 찾을 수 없습니다."
        Exit Sub
    End If
    
    ' 데이터 행 수와 열 수 계산
    Dim maxCols As Long: maxCols = 0
    Dim separators As Variant
    separators = Array(vbTab, ",")  ' 탭이나 쉼표로 구분된 데이터 지원
    
    ' 구분자 결정 (첫 번째 행 기준)
    Dim separator As String
    separator = vbTab  ' 기본값: 탭
    
    ' 첫 번째 행에서 가장 많이 사용된 구분자 찾기
    Dim firstLine As String
    firstLine = dataLines(1)
    
    If InStr(firstLine, ",") > 0 And InStr(firstLine, vbTab) = 0 Then
        separator = ","
    End If
    
    ' 최대 열 수 계산
    For i = 1 To dataLines.Count
        Dim cols As Long
        cols = UBound(Split(dataLines(i), separator)) + 1
        If cols > maxCols Then maxCols = cols
    Next i
    
    ' 테이블 데이터를 Excel 셀에 채우기
    Dim rowIndex As Long: rowIndex = 0
    
    For i = 1 To dataLines.Count
        Dim cellValues() As String
        cellValues = Split(dataLines(i), separator)
        
        Dim colIndex As Long
        For colIndex = 0 To UBound(cellValues)
            ' 데이터 셀에 값 입력
            targetCell.Offset(rowIndex, colIndex).Value = Trim(cellValues(colIndex))
        Next colIndex
        
        rowIndex = rowIndex + 1
    Next i
    
    ' 테이블 서식 적용
    With targetCell.Resize(rowIndex, maxCols)
        ' 헤더 행 서식
        With .Rows(1)
            .Font.Bold = True
            .Interior.Color = RGB(240, 240, 240)
        End With
        
        ' 테두리
        .Borders.LineStyle = xlContinuous
        .Borders.Weight = xlThin
        
        ' 자동 필터 적용
        .AutoFilter
        
        ' 열 너비 자동 조정
        .Columns.AutoFit
    End With
End Sub

' 방법 2: 사용자정의 버튼 생성 (리본 메뉴 또는 빠른 실행 도구 모음에 추가 가능)
Sub AddChatGPTButton()
    ' VBA에서 버튼 추가
    Dim myBar As CommandBar
    Set myBar = Application.CommandBars("Worksheet Menu Bar")
    
    ' 기존 버튼 제거 (중복 방지)
    On Error Resume Next
    Application.CommandBars("Worksheet Menu Bar").Controls("ChatGPT 테이블").Delete
    On Error GoTo 0
    
    ' 새 버튼 추가
    Dim newButton As CommandBarButton
    Set newButton = myBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
    With newButton
        .Caption = "ChatGPT 테이블"
        .OnAction = "ChatGPTTableMacro"
        .Style = msoButtonCaption
    End With
    
    MsgBox "ChatGPT 테이블 버튼이 추가되었습니다.", vbInformation
End Sub

' GPT 모델 선택 함수 추가
Function SelectGPTModel() As String
    Dim modelChoice As Integer
    
    modelChoice = MsgBox("고성능 GPT-4 모델을 사용하시겠습니까?" & vbNewLine & _
                         "(예=GPT-4 사용, 아니오=GPT-3.5-turbo 사용)", _
                         vbYesNo + vbQuestion, "GPT 모델 선택")
    
    If modelChoice = vbYes Then
        SelectGPTModel = "gpt-4o-mini" ' 또는 고성능 모델 중 사용 가능한 다른 모델
    Else
        SelectGPTModel = "gpt-3.5-turbo-0125"
    End If
End Function

' 모델 선택 기능이 포함된 향상된 매크로
Sub ChatGPTTableMacroWithModelSelection()
    ' 모델 선택
    Dim selectedModel As String
    selectedModel = SelectGPTModel()
    
    ' 사용자로부터 질문 입력 받기
    Dim prompt As String
    prompt = InputBox("ChatGPT에게 물어볼 질문을 입력하세요:", "ChatGPT 표 생성 (" & selectedModel & ")")
    
    If prompt = "" Then Exit Sub  ' 취소 버튼 누른 경우
    
    ' 현재 선택된 셀
    Dim targetCell As Range
    Set targetCell = Selection.Cells(1, 1)
    
    ' 상태 표시
    Application.StatusBar = selectedModel & "에 요청 중..."
    Application.Cursor = xlWait
    
    ' API 호출 (모델 선택 전달)
    Dim response As String
    response = GetGPTResponseWithModel(prompt, selectedModel)
    
    ' 표 형식으로 응답 처리하여 Excel에 삽입
    ProcessTableResponse response, targetCell
    
    ' 상태 복원
    Application.StatusBar = False
    Application.Cursor = xlDefault
    
    MsgBox "테이블이 생성되었습니다. (사용 모델: " & selectedModel & ")", vbInformation
End Sub

' 모델 선택이 가능한 함수
Function GetGPTResponseWithModel(prompt As String, model As String) As String
    Dim objHTTP As Object
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    
    Dim URL As String, API_KEY As String
    URL = "https://api.openai.com/v1/chat/completions"
    API_KEY = "sk-proj-wP710cdmTi31fqUA9bEpT3BlbkFJrXE9efYJQVOKjh2w14ya"
    
    ' 에러 처리 추가
    On Error Resume Next
    objHTTP.Open "POST", URL, False
    
    If Err.Number <> 0 Then
        GetGPTResponseWithModel = "연결 오류: " & Err.Description
        Err.Clear
        Exit Function
    End If
    
    On Error GoTo 0
    
    ' 요청 헤더 설정
    objHTTP.setRequestHeader "Content-Type", "application/json; charset=utf-8"
    objHTTP.setRequestHeader "Authorization", "Bearer " & API_KEY
    
    ' 시스템 메시지로 표 형식 응답 요청
    Dim tableRequest As String
    tableRequest = prompt & " 응답은 Excel에 바로 붙여넣을 수 있도록 CSV 형식이나 탭 구분 형식으로 제공해주세요. 마크다운이나 다른 서식 없이 순수 데이터만 제공해주세요."
    
    Dim json As String
    json = "{""model"": """ & model & """, ""messages"": [{""role"": ""system"", ""content"": ""당신은 Excel 셀에 직접 붙여넣을 수 있는 표 형식(CSV/TSV)으로 응답하는 도우미입니다. 헤더 행을 포함해주세요. 마크다운 기호나 설명 없이 순수 데이터만 표 형식으로 제공하세요.""}, {""role"": ""user"", ""content"": """ & tableRequest & """}]}"
    
    ' 타임아웃 설정 증가
    objHTTP.setTimeouts 30000, 30000, 30000, 30000
    
    On Error Resume Next
    objHTTP.send json
    
    If Err.Number <> 0 Then
        GetGPTResponseWithModel = "API 요청 오류: " & Err.Description
        Set objHTTP = Nothing
        Exit Function
    End If
    
    On Error GoTo 0
    
    If objHTTP.Status = 200 Then
        Dim responseText As String
        responseText = objHTTP.responseText
        
        ' JSON 응답에서 content 부분 추출
        Dim contentStart As Long, contentEnd As Long
        contentStart = InStr(responseText, """content"": """)
        
        ' content 필드가 없을 경우 처리
        If contentStart = 0 Then
            GetGPTResponseWithModel = "응답 형식 오류. 원본 응답: " & Left(responseText, 300)
            Set objHTTP = Nothing
            Exit Function
        End If
        
        contentStart = contentStart + 12  ' """content"": """ 다음 위치
        
        contentEnd = contentStart
        Dim i As Long
        
        For i = contentStart To Len(responseText)
            Dim char As String
            char = Mid(responseText, i, 1)
            
            If char = """" Then
                If Mid(responseText, i - 1, 1) <> "\" Then
                    contentEnd = i - 1
                    Exit For
                End If
            End If
        Next i
        
        If contentEnd > contentStart Then
            Dim content As String
            content = Mid(responseText, contentStart, contentEnd - contentStart + 1)
            
            ' 이스케이프된 문자 처리
            content = Replace(content, "\""", """")
            content = Replace(content, "\\", "\")
            content = Replace(content, "\n", vbNewLine)
            
            GetGPTResponseWithModel = content
        Else
            GetGPTResponseWithModel = "내용 파싱 오류: " & Left(responseText, 100)
        End If
    Else
        ' 오류 응답에서 더 많은 정보 추출
        Dim errorMsg As String
        errorMsg = "HTTP Error: " & objHTTP.Status & " - " & objHTTP.statusText & vbNewLine
        
        ' 모델 오류인 경우 fallback 정보 제공
        If InStr(objHTTP.responseText, "model") > 0 And objHTTP.Status = 404 Then
            errorMsg = errorMsg & vbNewLine & "선택한 모델(" & model & ")을 사용할 수 없습니다. gpt-3.5-turbo로 시도해보세요."
        End If
        
        GetGPTResponseWithModel = errorMsg & vbNewLine & "응답 내용: " & objHTTP.responseText
    End If
    
    Set objHTTP = Nothing
End Function

' 리본 메뉴에 향상된 버튼 추가
Sub AddEnhancedButtons()
    ' VBA에서 버튼 추가
    Dim myBar As CommandBar
    Set myBar = Application.CommandBars("Worksheet Menu Bar")
    
    ' 기존 버튼 제거 (중복 방지)
    On Error Resume Next
    Application.CommandBars("Worksheet Menu Bar").Controls("ChatGPT 테이블").Delete
    Application.CommandBars("Worksheet Menu Bar").Controls("GPT 모델 선택").Delete
    On Error GoTo 0
    
    ' 새 버튼 추가
    Dim newButton As CommandBarButton
    Set newButton = myBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
    With newButton
        .Caption = "ChatGPT 테이블"
        .OnAction = "ChatGPTTableMacro"
        .Style = msoButtonCaption
    End With
    
    ' 모델 선택 버튼 추가
    Dim modelButton As CommandBarButton
    Set modelButton = myBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
    With modelButton
        .Caption = "GPT 모델 선택"
        .OnAction = "ChatGPTTableMacroWithModelSelection"
        .Style = msoButtonCaption
    End With
    
    MsgBox "ChatGPT 테이블과 GPT 모델 선택 버튼이 추가되었습니다.", vbInformation
End Sub

' 뉴스 클리핑 매크로 추가
Sub ChatGPTNewsClipping()
    ' 사용자로부터 주제 입력 받기
    Dim prompt As String
    prompt = InputBox("뉴스 클리핑할 주제를 입력하세요:", "AI 뉴스 클리핑")
    
    If prompt = "" Then Exit Sub  ' 취소 버튼 누른 경우
    
    ' 현재 선택된 셀
    Dim targetCell As Range
    Set targetCell = Selection.Cells(1, 1)
    
    ' 상태 표시
    Application.StatusBar = "뉴스 클리핑 요청 중..."
    Application.Cursor = xlWait
    
    ' API 호출 (뉴스 클리핑용 프롬프트)
    Dim newsPrompt As String
    newsPrompt = "다음 주제에 대한 최신 뉴스 요약을 제공해주세요: " & prompt & _
                 " 날짜, 제목, 내용 요약, 출처, URL을 포함한 표 형식으로 정리해 주세요."
    
    Dim response As String
    response = GetChatGPTResponse(newsPrompt)
    
    ' 표 형식으로 응답 처리하여 Excel에 삽입
    ProcessNewsClippingResponse response, targetCell
    
    ' 상태 복원
    Application.StatusBar = False
    Application.Cursor = xlDefault
    
    MsgBox "뉴스 클리핑이 완료되었습니다.", vbInformation
End Sub

Sub ProcessNewsClippingResponse(response As String, targetCell As Range)
    ' 기본 테이블 처리 함수와 유사하지만 URL 열에 하이퍼링크 추가
    
    Dim lines() As String
    lines = Split(response, vbNewLine)
    
    ' 마크다운 테이블 또는 일반 텍스트 파싱
    Dim dataLines As New Collection
    Dim i As Long
    
    ' 응답에서 실제 테이블 데이터 추출
    For i = 0 To UBound(lines)
        Dim line As String
        line = Trim(lines(i))
        
        ' 빈 줄 건너뛰기
        If line = "" Then GoTo ContinueForLoop
        
        ' 마크다운 표 구분선 제거 (|---|---|)
        If InStr(line, "|-") > 0 And InStr(line, "|") > 0 Then
            GoTo ContinueForLoop
        End If
        
        ' 마크다운 표시 제거
        If Left(line, 1) = "|" Then
            line = Mid(line, 2, Len(line) - 2)  ' 첫번째와 마지막 | 제거
            line = Replace(line, " | ", vbTab)   ' 구분자를 탭으로 변환
        End If
        
        ' 코드 블록 표시 제거
        If Left(line, 3) = "```" Then
            GoTo ContinueForLoop
        End If
        
        ' 실제 데이터 행 추가
        dataLines.Add line
        
ContinueForLoop:
    Next i
    
    ' 데이터가 없으면 종료
    If dataLines.Count = 0 Then
        targetCell.Value = "테이블 데이터를 찾을 수 없습니다."
        Exit Sub
    End If
    
    ' 데이터 행 수와 열 수 계산
    Dim maxCols As Long: maxCols = 0
    Dim separator As String
    separator = vbTab  ' 기본값: 탭
    
    ' 첫 번째 행에서 구분자 확인
    Dim firstLine As String
    firstLine = dataLines(1)
    
    If InStr(firstLine, ",") > 0 And InStr(firstLine, vbTab) = 0 Then
        separator = ","
    End If
    
    ' 최대 열 수 계산
    For i = 1 To dataLines.Count
        Dim cols As Long
        cols = UBound(Split(dataLines(i), separator)) + 1
        If cols > maxCols Then maxCols = cols
    Next i
    
    ' 테이블 데이터를 Excel 셀에 채우기
    Dim rowIndex As Long: rowIndex = 0
    
    For i = 1 To dataLines.Count
        Dim cellValues() As String
        cellValues = Split(dataLines(i), separator)
        
        Dim colIndex As Long
        For colIndex = 0 To UBound(cellValues)
            ' URL 칼럼 처리 - 마지막 칼럼으로 가정
            If colIndex = UBound(cellValues) And InStr(cellValues(colIndex), "http") > 0 Then
                ' 하이퍼링크 설정
                targetCell.Offset(rowIndex, colIndex).Value = cellValues(colIndex)
                
                On Error Resume Next
                targetCell.Offset(rowIndex, colIndex).Hyperlinks.Delete  ' 기존 하이퍼링크 제거
                targetCell.Worksheet.Hyperlinks.Add _
                    Anchor:=targetCell.Offset(rowIndex, colIndex), _
                    Address:=cellValues(colIndex), _
                    TextToDisplay:=cellValues(colIndex)
                On Error GoTo 0
            Else
                ' 일반 셀 처리
                targetCell.Offset(rowIndex, colIndex).Value = Trim(cellValues(colIndex))
            End If
        Next colIndex
        
        rowIndex = rowIndex + 1
    Next i
    
    ' 테이블 서식 적용
    With targetCell.Resize(rowIndex, maxCols)
        ' 헤더 행 서식
        With .Rows(1)
            .Font.Bold = True
            .Interior.Color = RGB(240, 240, 240)
        End With
        
        ' 테두리
        .Borders.LineStyle = xlContinuous
        .Borders.Weight = xlThin
        
        ' 자동 필터 적용
        .AutoFilter
        
        ' 열 너비 자동 조정
        .Columns.AutoFit
        
        ' URL 열은 더 넓게 (마지막 열로 가정)
        If maxCols >= 5 Then
            .Columns(maxCols).ColumnWidth = .Columns(maxCols).ColumnWidth * 1.5
        End If
        
        ' 내용 열은 더 넓게 (3번째 열로 가정)
        If maxCols >= 3 Then
            .Columns(3).ColumnWidth = 60
        End If
```

> **<동일한 프롬프트로 코딩 작업을 요청했을 때의 결과물 작업시간 비교>

ChatGPT가 최소한 엑셀에서 오류를 일으키지 않는, 그러나 데이터 포맷이 불완전한 결과물을 주는데 걸린 시간 : 6시간 

Claude.ai가 오류없이 나의 원하는 의도를 반영한 코드를 만드는데 걸린시간 : 1시간 30분 ** 

ppt 템플릿 자동화와 마찬가지로, 엑셀에서도 다시 한번 매크로에 대한 허용 설정을 준비하고 가이드대로 실행해보겠습니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/202057_Qb6wwxNg7r6QunFWA3?q=80&s=1280x180&t=outside&f=webp)

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/202656_8rdK5dVb53fvAzHGMr?q=80&s=1280x180&t=outside&f=webp)

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/202824_S3HUzAlKKRZ0yrSCYl?q=80&s=1280x180&t=outside&f=webp)

위 사용방법을 확인한 다음, 엑셀에서 어떤 UI와 흐름으로 작동하는지 살펴보겠습니다.

## 3. API+VBA 활용 결과물 vs GPT 4.5 결과물 비교

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/203851_McDe7obFHDIZUpUomL?q=80&s=1280x180&t=outside&f=webp)

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/204552_UmvSbOrnXCfvdn3em7?q=80&s=1280x180&t=outside&f=webp)

예시로 궁금한 프롬프트를 넣어봅니다.

```javascript
ChatGPT를 활용하는 사용자들이 분야별로 어떤 기능을 가장 많이 쓰는지,  
그 기능의 사용 비중(%)과 실제 사례, 그리고 수익화 가능성 여부를  
아래와 같은 형식의 표로 정리해줘.

열: 분야 | 주요 기능 | 사용 비중(%) | 활용 사례 | 수익화 가능 여부
형식: Markdown 또는 CSV 테이블

```

위와 같은 결과, 과연 GPT 4.5랑 비교해봤을 때 어땠을까요?

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/204708_EE52jifXDGHn4xpwJS?q=80&s=1280x180&t=outside&f=webp)

![Image](https://upload.cafenono.com/image/slashpagePost/20250322/204722_sR4QKLGgyH5NSR5adf?q=80&s=1280x180&t=outside&f=webp)

위에서 얻은 답변은 저의 프롬프트에 대한 리뷰 요청이었고,

밑에 있는 엑셀 칸은 제가 VBA를 통해 직접 얻어낸 답변입니다.

마크다운 형식이 아니지만 큰 틀에서는 거의 동일한 답변을 얻어내는 것을 보실 수가 있죠?

따라서, 저는 MS office를 챗GPT에 업무자동화를 적용한다면 다음과 같은 방식을 시도할 수 있습니다.

- [ ] 엑셀로 업무지식 다운로드

- [ ] 템플릿이 정해진 PPT 파일에 관련내용 대량삽입

- [ ] 구체적인 내용이 정해진 워드파일에는 구체화된 정보성 컨텐츠 생성

현실적인 업무자동화는 여러분의 니즈를 따라 구현해나가겠습니다.

지금의 우리에게 도움이 될 수 있는 각종 TIP들을 구현하는 알파벳 AI가 되겠습니다 :)

# ☎️[기업/관공서를 위한 AI교육 문의(클릭)](https://slashpage.com/alphabet-ai/1q3vdn2pj6krk2xy49pr)

For the site tree, see the [root Markdown](https://slashpage.com/alphabet-ai.md).
