목록으로
📊 AI와 비즈니스 - 엑셀

ChatGPT에게 엑셀 대시보드 만들기 배우기 - AI 데이터 시각화 실전

경영진을 위한 멋진 대시보드! AI가 여러 차트와 KPI를 한 화면에 정리하는 방법을 단계별로 알려드립니다.

AI와 엑셀 연동(플러그인)

지금까지는 ChatGPT 창과 엑셀 창을 번갈아가며 작업했죠. AI에게 물어보고, 답변을 복사해서, 엑셀에 붙여넣고... 번거로웠을 거예요.

이제 엑셀 안에서 직접 AI를 호출할 수 있습니다! 셀에 =GPT("이걸 번역해줘")라고 입력하면 바로 결과가 나와요. 수백, 수천 개의 데이터에 AI 분석을 일괄 적용하는 것도 가능합니다.

AI와 엑셀을 연동하면 작업 효율이 엄청나게 올라가요. 텍스트 요약, 감정 분석, 번역, 카테고리 분류... 이런 작업들을 엑셀 함수처럼 쓸 수 있게 됩니다.

이번 글에서는 AI와 엑셀을 연동하는 다양한 방법을 알아봅니다. Microsoft 365 Copilot부터 ChatGPT API 연동, 구글 시트까지, 실무에서 바로 활용할 수 있는 방법들을 단계별로 살펴볼게요.

1. Microsoft 365 Copilot

Copilot 기본 기능

Microsoft 365 구독자는 엑셀에 내장된 Copilot을 사용할 수 있습니다.

주요 기능:

1. 자연어로 데이터 분석
   "이번 달 매출 상위 5개 제품을 보여줘"

2. 수식 자동 생성
   "전월 대비 증감률을 계산해줘"

3. 차트 추천
   "이 데이터를 가장 잘 표현하는 차트는?"

4. 데이터 정리
   "중복된 행을 제거하고 날짜순으로 정렬해줘"

5. 인사이트 발견
   "이 데이터에서 특이한 패턴을 찾아줘"

Copilot 활용 예시

[Copilot 프롬프트]
"지난 12개월 매출 데이터를 분석해서
계절별 트렌드와 가장 잘 팔리는 제품을 알려줘"

[Copilot 응답]
분석 결과:
- 여름(6-8월)에 매출이 평균 25% 증가
- 제품A가 전체 매출의 35% 차지
- 12월에 특별히 높은 매출 (연말 특수)

차트와 피벗 테이블을 생성했습니다.

2. ChatGPT API 연동

OpenAI API 설정

AI 프롬프트:

"엑셀에서 ChatGPT API를 호출하는 VBA 함수를 만들어주세요.
API 키를 안전하게 저장하고, 응답을 셀에 반환하세요."

AI 생성 VBA:

' API 키는 VBA 프로젝트 속성에 저장
' 또는 별도 파일에 암호화하여 저장

Public Const OPENAI_API_KEY As String = "your-api-key-here"

' ChatGPT 호출 함수
Function AskGPT(prompt As String, Optional model As String = "gpt-4") As String
    On Error GoTo ErrorHandler

    Dim http As Object
    Dim url As String
    Dim requestBody As String
    Dim response As String

    Set http = CreateObject("MSXML2.XMLHTTP")

    url = "https://api.openai.com/v1/chat/completions"

    ' JSON 요청 본문
    requestBody = "{" & _
        """model"": """ & model & """," & _
        """messages"": [{""role"": ""user"", ""content"": """ & _
        Replace(prompt, """", "\""") & """}]," & _
        """max_tokens"": 1000," & _
        """temperature"": 0.7" & _
        "}"

    ' HTTP 요청
    With http
        .Open "POST", url, False
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Authorization", "Bearer " & OPENAI_API_KEY
        .send requestBody

        If .Status = 200 Then
            response = .responseText

            ' JSON 파싱 (간단한 방법)
            Dim startPos As Long, endPos As Long
            startPos = InStr(response, """content"": """) + 13
            endPos = InStr(startPos, response, """")

            AskGPT = Mid(response, startPos, endPos - startPos)

            ' 이스케이프 문자 처리
            AskGPT = Replace(AskGPT, "\n", vbCrLf)
            AskGPT = Replace(AskGPT, "\""", """")
        Else
            AskGPT = "Error: " & .Status & " - " & .statusText
        End If
    End With

    Set http = Nothing
    Exit Function

ErrorHandler:
    AskGPT = "Error: " & Err.Description
End Function

' 엑셀 워크시트 함수로 사용
Function GPT(prompt As String) As String
    GPT = AskGPT(prompt)
End Function

사용 예시

// 셀에서 직접 사용
=GPT("이 문장을 영어로 번역해줘: 안녕하세요")

// 데이터 분석
=GPT("다음 매출 데이터를 분석하고 인사이트를 제공해줘: "&A2:A100)

// 텍스트 요약
=GPT("다음 고객 리뷰를 한 문장으로 요약해줘: "&B2)

// 카테고리 분류
=GPT("다음 제품명을 가전/의류/식품 중 하나로 분류해줘: "&C2)

3. 고급 AI 함수 라이브러리

AI 프롬프트:

"다양한 AI 작업을 수행하는 사용자 정의 함수 라이브러리를 만들어주세요:
- 텍스트 요약
- 감정 분석
- 번역
- 카테고리 분류
- 키워드 추출"

AI 생성 VBA:

' AI 함수 라이브러리

' 텍스트 요약
Function AI_Summarize(text As String, Optional maxLength As Integer = 100) As String
    Dim prompt As String
    prompt = "다음 텍스트를 " & maxLength & "자 이내로 요약해줘:" & vbCrLf & text
    AI_Summarize = AskGPT(prompt)
End Function

' 감정 분석 (긍정/중립/부정)
Function AI_Sentiment(text As String) As String
    Dim prompt As String
    prompt = "다음 텍스트의 감정을 '긍정', '중립', '부정' 중 하나로만 답해줘:" & vbCrLf & text
    AI_Sentiment = AskGPT(prompt)
End Function

' 번역
Function AI_Translate(text As String, targetLang As String) As String
    Dim prompt As String
    prompt = "다음 텍스트를 " & targetLang & "로 번역해줘:" & vbCrLf & text
    AI_Translate = AskGPT(prompt)
End Function

' 카테고리 분류
Function AI_Categorize(text As String, categories As String) As String
    Dim prompt As String
    prompt = "다음 텍스트를 이 카테고리 중 하나로 분류해줘 (" & categories & "):" & vbCrLf & text
    AI_Categorize = AskGPT(prompt)
End Function

' 키워드 추출
Function AI_Keywords(text As String, Optional count As Integer = 5) As String
    Dim prompt As String
    prompt = "다음 텍스트에서 주요 키워드 " & count & "개를 쉼표로 구분해서 알려줘:" & vbCrLf & text
    AI_Keywords = AskGPT(prompt)
End Function

' 데이터 검증
Function AI_Validate(value As String, rules As String) As String
    Dim prompt As String
    prompt = "다음 값이 이 규칙을 만족하는지 '예' 또는 '아니오'로만 답해줘." & vbCrLf & _
             "규칙: " & rules & vbCrLf & _
             "값: " & value
    AI_Validate = AskGPT(prompt)
End Function

' 이메일 생성
Function AI_Email(situation As String, tone As String) As String
    Dim prompt As String
    prompt = "다음 상황에 대한 " & tone & " 톤의 이메일을 작성해줘:" & vbCrLf & situation
    AI_Email = AskGPT(prompt)
End Function

' 데이터 정제 (불필요한 문자 제거, 표준화)
Function AI_CleanData(text As String) As String
    Dim prompt As String
    prompt = "다음 데이터를 정제하고 표준화해서 깔끔한 형태로만 반환해줘:" & vbCrLf & text
    AI_CleanData = AskGPT(prompt)
End Function

일괄 처리 매크로

Sub AI일괄처리()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim taskType As String

    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' 작업 유형 선택
    taskType = InputBox( _
        "작업 유형을 선택하세요:" & vbCrLf & _
        "1: 요약" & vbCrLf & _
        "2: 감정분석" & vbCrLf & _
        "3: 번역(영어)" & vbCrLf & _
        "4: 키워드추출", _
        "AI 일괄처리", "1")

    Application.ScreenUpdating = False

    ' 진행률 표시
    Dim progressForm As Object

    For i = 2 To lastRow
        Dim inputText As String
        Dim result As String

        inputText = ws.Cells(i, 1).Value

        ' 작업 수행
        Select Case taskType
            Case "1"
                result = AI_Summarize(inputText)
            Case "2"
                result = AI_Sentiment(inputText)
            Case "3"
                result = AI_Translate(inputText, "영어")
            Case "4"
                result = AI_Keywords(inputText)
        End Select

        ws.Cells(i, 2).Value = result

        ' 진행률 업데이트
        Application.StatusBar = "처리 중... " & _
            Format((i - 1) / (lastRow - 1), "0%") & _
            " (" & i - 1 & "/" & lastRow - 1 & ")"

        ' API 제한 고려 (초당 요청 수)
        Application.Wait Now + TimeValue("00:00:01")
    Next i

    Application.StatusBar = False
    Application.ScreenUpdating = True

    MsgBox "AI 일괄 처리가 완료되었습니다.", vbInformation
End Sub

4. Google Sheets용 Apps Script

AI 프롬프트:

"Google Sheets에서 사용할 수 있는
ChatGPT API 연동 Apps Script를 만들어주세요."

AI 생성 Apps Script:

// Google Apps Script
// 도구 > 스크립트 편집기

const OPENAI_API_KEY = 'your-api-key-here';

/**
 * ChatGPT API 호출
 * @param {string} prompt 질문 또는 명령
 * @param {string} model 모델명 (기본: gpt-4)
 * @return {string} AI 응답
 * @customfunction
 */
function GPT(prompt, model = 'gpt-4') {
  if (!prompt) return '';

  const url = 'https://api.openai.com/v1/chat/completions';

  const payload = {
    model: model,
    messages: [{
      role: 'user',
      content: prompt
    }],
    max_tokens: 1000,
    temperature: 0.7
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      'Authorization': 'Bearer ' + OPENAI_API_KEY
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const json = JSON.parse(response.getContentText());

    if (json.choices && json.choices.length > 0) {
      return json.choices[0].message.content;
    } else {
      return 'Error: ' + JSON.stringify(json);
    }
  } catch (e) {
    return 'Error: ' + e.toString();
  }
}

/**
 * 텍스트 요약
 * @param {string} text 요약할 텍스트
 * @param {number} maxLength 최대 길이
 * @return {string} 요약된 텍스트
 * @customfunction
 */
function AI_SUMMARIZE(text, maxLength = 100) {
  const prompt = `다음 텍스트를 ${maxLength}자 이내로 요약해줘:\n${text}`;
  return GPT(prompt);
}

/**
 * 감정 분석
 * @param {string} text 분석할 텍스트
 * @return {string} 긍정/중립/부정
 * @customfunction
 */
function AI_SENTIMENT(text) {
  const prompt = `다음 텍스트의 감정을 '긍정', '중립', '부정' 중 하나로만 답해줘:\n${text}`;
  return GPT(prompt);
}

/**
 * 번역
 * @param {string} text 번역할 텍스트
 * @param {string} targetLang 목표 언어
 * @return {string} 번역된 텍스트
 * @customfunction
 */
function AI_TRANSLATE(text, targetLang = '영어') {
  const prompt = `다음 텍스트를 ${targetLang}로 번역해줘:\n${text}`;
  return GPT(prompt);
}

/**
 * 범위 내 모든 셀에 AI 함수 적용
 */
function AI_BATCH_PROCESS() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getActiveRange();
  const values = range.getValues();

  const taskType = Browser.inputBox(
    'AI 작업 선택',
    '1: 요약\\n2: 감정분석\\n3: 번역(영어)\\n4: 키워드추출',
    Browser.Buttons.OK_CANCEL
  );

  if (taskType === 'cancel') return;

  const results = values.map(row => {
    const text = row[0];
    let result = '';

    switch(taskType) {
      case '1':
        result = AI_SUMMARIZE(text);
        break;
      case '2':
        result = AI_SENTIMENT(text);
        break;
      case '3':
        result = AI_TRANSLATE(text, '영어');
        break;
      case '4':
        result = GPT(`다음 텍스트에서 주요 키워드 5개를 추출해줘:\n${text}`);
        break;
    }

    Utilities.sleep(1000); // API 제한 고려
    return [result];
  });

  // 결과를 다음 열에 출력
  const outputRange = sheet.getRange(
    range.getRow(),
    range.getColumn() + 1,
    range.getNumRows(),
    1
  );
  outputRange.setValues(results);

  Browser.msgBox('AI 처리가 완료되었습니다.');
}

/**
 * 메뉴 추가
 */
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('AI 도구')
    .addItem('일괄 처리', 'AI_BATCH_PROCESS')
    .addToUi();
}

5. Power Query에서 AI 활용

AI 프롬프트:

"Power Query에서 Python 스크립트를 실행하여
AI 분석을 수행하는 방법을 알려주세요."

AI 생성 가이드:

# Power Query > 데이터 변환 > Python 스크립트 실행

import pandas as pd
import openai

# OpenAI API 설정
openai.api_key = 'your-api-key'

def analyze_with_ai(text):
    """텍스트를 AI로 분석"""
    try:
        response = openai.ChatCompletion.create(
            model="gpt-4",
            messages=[
                {"role": "user", "content": f"다음 텍스트를 분석해줘: {text}"}
            ]
        )
        return response.choices[0].message.content
    except Exception as e:
        return f"Error: {str(e)}"

# dataset은 Power Query에서 전달되는 DataFrame
df = dataset.copy()

# AI 분석 적용
df['AI_Analysis'] = df['OriginalText'].apply(analyze_with_ai)

# 결과 반환
output = df

6. 실시간 AI 대시보드

AI 프롬프트:

"엑셀에서 실시간으로 데이터를 AI가 분석하고
대시보드를 업데이트하는 시스템을 만들어주세요."

AI 생성 VBA:

' ThisWorkbook 모듈에 추가

Dim RefreshTimer As Double

Sub 실시간AI대시보드시작()
    RefreshTimer = Now + TimeValue("00:05:00") ' 5분마다
    Application.OnTime RefreshTimer, "AI대시보드갱신"

    MsgBox "실시간 AI 대시보드가 시작되었습니다." & vbCrLf & _
           "5분마다 자동 갱신됩니다.", vbInformation
End Sub

Sub 실시간AI대시보드중지()
    On Error Resume Next
    Application.OnTime RefreshTimer, "AI대시보드갱신", , False
    MsgBox "실시간 AI 대시보드가 중지되었습니다.", vbInformation
End Sub

Sub AI대시보드갱신()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("대시보드")

    Application.ScreenUpdating = False

    ' 최신 데이터 가져오기
    Dim lastRow As Long
    Dim dataWs As Worksheet
    Set dataWs = ThisWorkbook.Sheets("원본데이터")
    lastRow = dataWs.Cells(dataWs.Rows.Count, "A").End(xlUp).Row

    ' AI 분석 1: 트렌드 분석
    Dim recentData As String
    recentData = Join(Application.Transpose( _
        dataWs.Range("B" & lastRow - 6 & ":B" & lastRow).Value), ", ")

    ws.Cells(2, 2).Value = AskGPT( _
        "다음 최근 7일 매출 데이터의 트렌드를 한 문장으로 설명해줘: " & recentData)

    ' AI 분석 2: 이상치 탐지
    ws.Cells(3, 2).Value = AskGPT( _
        "다음 데이터에서 이상치가 있다면 알려줘: " & recentData)

    ' AI 분석 3: 예측
    ws.Cells(4, 2).Value = AskGPT( _
        "다음 매출 추세를 기반으로 내일 매출을 예측해줘: " & recentData)

    ' AI 분석 4: 권장사항
    ws.Cells(5, 2).Value = AskGPT( _
        "이 매출 데이터를 보고 경영진에게 줄 조언을 한 문장으로 작성해줘: " & recentData)

    ' 갱신 시간 표시
    ws.Cells(1, 4).Value = "마지막 갱신: " & Format(Now, "yyyy-mm-dd hh:mm:ss")

    Application.ScreenUpdating = True

    ' 다음 갱신 예약
    RefreshTimer = Now + TimeValue("00:05:00")
    Application.OnTime RefreshTimer, "AI대시보드갱신"
End Sub

7. AI 함수 캐싱 (API 비용 절감)

AI 프롬프트:

"같은 질문을 반복하지 않도록
AI 응답을 캐싱하는 시스템을 만들어주세요."

AI 생성 VBA:

' 캐시용 Dictionary
Private AICache As Object

Sub InitializeCache()
    If AICache Is Nothing Then
        Set AICache = CreateObject("Scripting.Dictionary")
    End If
End Sub

Function GPT_Cached(prompt As String) As String
    Call InitializeCache

    ' 캐시 확인
    If AICache.Exists(prompt) Then
        GPT_Cached = AICache(prompt)
        Debug.Print "Cache Hit: " & Left(prompt, 50)
    Else
        ' API 호출
        GPT_Cached = AskGPT(prompt)
        AICache.Add prompt, GPT_Cached
        Debug.Print "Cache Miss: " & Left(prompt, 50)
    End If
End Function

Sub 캐시초기화()
    Set AICache = Nothing
    MsgBox "AI 캐시가 초기화되었습니다.", vbInformation
End Sub

Sub 캐시통계()
    Call InitializeCache
    MsgBox "캐시된 항목 수: " & AICache.Count, vbInformation
End Sub

8. 오류 처리 및 재시도 로직

Function AskGPT_Robust(prompt As String, Optional maxRetries As Integer = 3) As String
    Dim retryCount As Integer
    Dim result As String
    Dim lastError As String

    retryCount = 0

    Do While retryCount < maxRetries
        result = AskGPT(prompt)

        ' 성공 여부 확인
        If Not (Left(result, 6) = "Error:") Then
            AskGPT_Robust = result
            Exit Function
        End If

        lastError = result
        retryCount = retryCount + 1

        ' 재시도 전 대기
        If retryCount < maxRetries Then
            Application.Wait Now + TimeValue("00:00:02")
        End If
    Loop

    ' 모든 재시도 실패
    AskGPT_Robust = "모든 재시도 실패: " & lastError
End Function

9. 비용 모니터링

' 모듈 상단에 추가
Private APICallCount As Long
Private TotalTokens As Long

Sub API통계초기화()
    APICallCount = 0
    TotalTokens = 0
End Sub

Sub API통계표시()
    Dim estimatedCost As Double

    ' GPT-4 기준: $0.03/1K tokens (입력) + $0.06/1K tokens (출력)
    ' 평균 토큰 수로 추정
    estimatedCost = TotalTokens / 1000 * 0.045

    MsgBox "API 사용 통계:" & vbCrLf & _
           "호출 횟수: " & APICallCount & vbCrLf & _
           "예상 토큰: " & TotalTokens & vbCrLf & _
           "예상 비용: $" & Format(estimatedCost, "0.00"), _
           vbInformation
End Sub

Function AskGPT_Monitored(prompt As String) As String
    ' 호출 전 카운트
    APICallCount = APICallCount + 1

    ' 토큰 추정 (대략 4자 = 1토큰)
    TotalTokens = TotalTokens + Len(prompt) / 4 + 250 ' 응답 예상 토큰

    ' 실제 호출
    AskGPT_Monitored = AskGPT(prompt)
End Function

10. AI 플러그인 설정 대시보드

Sub AI플러그인설정()
    Dim settingForm As Object

    ' 사용자 폼 생성 (간단한 버전)
    Dim apiKey As String
    Dim model As String
    Dim maxTokens As String

    apiKey = InputBox("OpenAI API 키를 입력하세요:", "API 설정")
    If apiKey = "" Then Exit Sub

    model = InputBox( _
        "사용할 모델을 선택하세요:" & vbCrLf & _
        "1: gpt-4 (고성능)" & vbCrLf & _
        "2: gpt-3.5-turbo (저비용)", _
        "모델 선택", "1")

    maxTokens = InputBox("최대 토큰 수 (100-4000):", "토큰 설정", "1000")

    ' 설정 저장 (시트에 저장)
    Dim configWs As Worksheet
    On Error Resume Next
    Set configWs = Sheets("AI_Config")
    If configWs Is Nothing Then
        Set configWs = Sheets.Add
        configWs.Name = "AI_Config"
        configWs.Visible = xlSheetVeryHidden
    End If
    On Error GoTo 0

    With configWs
        .Cells(1, 1).Value = "API_KEY"
        .Cells(1, 2).Value = apiKey
        .Cells(2, 1).Value = "MODEL"
        .Cells(2, 2).Value = IIf(model = "1", "gpt-4", "gpt-3.5-turbo")
        .Cells(3, 1).Value = "MAX_TOKENS"
        .Cells(3, 2).Value = maxTokens
    End With

    MsgBox "AI 플러그인 설정이 저장되었습니다.", vbInformation
End Sub

마무리

AI와 엑셀 연동 방법:

  • ✅ Microsoft 365 Copilot 활용
  • ✅ ChatGPT API로 사용자 정의 함수
  • ✅ Google Sheets Apps Script 연동
  • ✅ 캐싱과 모니터링으로 비용 최적화

다음 글에서는 이 모든 기술을 종합한 사무용 자동화 워크플로를 설계합니다.