엑셀 in AI – 제미나이 API 채팅 시스템 만들기 – 1편

이전 포스팅에서 구글 제미나이 API를 발급 받는 방법을 알아보았는데요. 무료로 이용할 수 있는 제미나이 API는 다양한 기능을 구현할 수 있습니다. 오늘은 제미나이 2.0 Flash 모델을 이용하여 엑셀에서 구동시킬 수 있는 채팅 시스템을 구축하는 방법을 알아보겠습니다. 이번시간에는 엑셀의 사용자폼을 이용하여 채팅 시스템의 틀을 작성하고 이벤트를 처리하는 코드를 작성하는 방법을 알아보겠습니다.

1. 제미나이 API 채팅 시스템 주요 기능

  • 사용자폼 실행시 초기화(채팅 히스토리, 입력창, 전송 버튼) 설정 및 저장된 API 키 로드
  • 전송 버튼 클릭 시 사용자 메시지 전송, Gemini API 호출하고 응답 메시지를 채팅 히스토리에 추가
  • 채팅 히스토리에 메시지를 추가할 때 타임스탬프 적용 및 자동 스크롤 기능 구현
  • Enter만 누르면 메시지 전송, Shift+Enter 누르면 줄바꿈 처리 이벤트 구현
  • API 키 저장 버튼 클릭 시 API 키 저장
  • Save 버튼 클릭 시 현재 대화 내역을 텍스트 파일로 저장
  • Load 버튼을 누르면 저장된 이전 대화 내역을 불러와 채팅 히스토리에 표시
  • Reset 버튼 클릭 시 대화 세션 초기화 및 채팅 히스토리 클리어
엑셀-제미나이-API-채팅-시스템

2. 엑셀 사용자폼(Userform)으로 채팅창 만들기

엑셀에서 제미나이 API를 호출하는 채팅창을 사용자폼(Userform)을 이용하여 구성하겠습니다.

① ALT + F11키를 눌러 개발자 도구로 진입합니다.
② 해당 문서에 마우스 오른쪽을 클릭하고 “삽입” >> “사용자 정의 폼”을 선택합니다.
③ 사용자폼에서 “텍스트 상자”(TEXTBOX), “명령 단추”(COMMANDBUTTON)를 추가합니다. – 새로 생성한 사용자폼을 선택(더블클릭)한 후 “보기” >> “도구 상자”에서 도구를 선택하고 원하는 위치에 클릭 & 드래그합니다.

엑셀-제미나이-API-채팅-사용자폼

1) 텍스트 상자/ 명령 단추 설정하기

채팅창 구성을 위해 사용되는 텍스트 상자와 명령 단추를 설정합니다. 여기서 주의할 점은 사용자에게 표시되는 버튼의 이름은 “Caption”을 수정하면 되지만, 주요 구성에 사용되는 이름은 아래와 같이 지정해야 작성된 코드가 작동합니다.

  • ChatHistory (채팅 내역을 표시하는 다중행 텍스트 박스)
  • txtInput (사용자 입력 텍스트 박스)
  • txtAPIKey (API 키 입력란)
  • btnSend (메시지 전송 버튼)
  • btnReset (Reset 버튼)
  • btnLoad (Load 버튼)
  • btnSave (Save 버튼)
  • btnSaveAPIKey (API Key 저장버튼)
엑셀-제미나이-API-채팅-사용자폼-구성1
엑셀-제미나이-API-채팅-사용자폼-구성2

3. 사용자폼 코드 – VBA

사용자폼 선택 >> 마우스 오른쪽 클릭 >> 코드 보기 선택하면 사용자폼에 코드를 삽입할 수 있습니다. 코드를 삽입하면, 각 버튼을 클릭했을 때 동작과 이벤트를 설정할 수 있습니다. 전체 코드는 맨 아래에 텍스트 파일로 첨부하겠습니다. 동작에 관한 코드는 아래 설명을 참고하세요.

엑셀-제미나이-API-채팅-코드-작성-순서

1) 사용자폼 초기화 (UserForm_Initialize)

▼ 사용자폼이 열릴 때 각 컨트롤(채팅 히스토리, 입력창, 전송 버튼) 및 API 키 입력란을 초기화합니다. 또한 이미 저장된 API 키가 있으면 불러옵니다.

Private Sub UserForm_Initialize()  
    ' API 키 입력란 초기화 (저장된 API 키가 있으면 불러옴)
    txtAPIKey.text = GetSetting("GeminiChat", "Settings", "APIKey", "")
End Sub

(2) 메시지 전송 (btnSend_Click 이벤트)

사용자가 메시지를 입력하고 “Send” 버튼을 클릭하면, 해당 메시지를 API로 전송하고, 응답을 받아 화면에 표시합니다. 세부 동작은 코드와 설명을 참고하세요.

Dim userText As String
userText = Trim(txtInput.Text)
If userText = "" Then Exit Sub

▲ txtInput 텍스트박스에 입력된 값을 읽어와 공백을 제거합니다. 입력이 없다면 아무 작업도 하지 않고 종료합니다.

AddToChatHistory STR_USER & userText

▲ 사용자가 입력한 메시지 앞에 “User: “라는 접두어를 붙여서 ChatHistory에 추가합니다.

Dim response As String
response = CallGeminiAPI(userText, txtAPIKey.Text)

▲ CallGeminiAPI 함수를 호출하여 사용자가 입력한 메시지와 API 키를 전달하고, 서버의 응답을 받아옵니다.

AddToChatHistory STR_ASSISTANT & response

▲ 서버로부터 받은 응답 앞에 “Assistant: “라는 접두어를 붙여서 ChatHistory에 추가합니다.

txtInput.Text = ""
txtInput.SetFocus

▲ 메시지 전송 후 txtInput 박스를 비우고 포커스를 다시 설정하여 다음 입력을 받을 준비를 합니다.

(3) 대화 기록 추가 (AddToChatHistory 서브루틴)

전달된 메시지에 현재 시간 스탬프를 붙여 대화 기록에 추가하고, 최신 메시지가 보이도록 스크롤을 이동시킵니다.

Dim timeStamp As String
timeStamp = Format(Now, TIMESTAMP_FORMAT)

Dim formattedMessage As String
formattedMessage = "[" & timeStamp & "] " & message

▲ 현재 시간을 지정된 포맷(예: “2025-03-15 14:30:00”)으로 가져와 메시지 앞에 추가합니다.

ChatHistory.Text = ChatHistory.Text & formattedMessage & vbCrLf & vbCrLf

▲ 기존 대화 기록에 새 메시지를 추가하면서 줄바꿈을 포함시켜 가독성을 높입니다.

With ChatHistory
    .SetFocus
    .SelStart = Len(.Text)
    .SelLength = 0
End With

▲ ChatHistory 컨트롤에 포커스를 주고, 커서를 맨 마지막으로 이동시켜 최신 메시지가 보이도록 설정합니다.

txtInput.SetFocus

▲ 마지막으로 입력창에 포커스를 다시 설정하여 사용자가 바로 새 메시지를 입력할 수 있게 합니다.

(4) Enter 키 이벤트 처리 (txtInput_KeyDown 이벤트)

사용자 입력 텍스트박스에서 Enter 키를 누르면 메시지를 보내고, Shift + Enter 키를 누르면 줄바꿈이 되도록 키를 설정합니다.

If KeyCode = vbKeyReturn Then
    If Shift = 1 Then
        txtInput.Text = txtInput.Text & vbCrLf
        txtInput.SelStart = Len(txtInput.Text)
        KeyCode = 0
    ElseIf Shift = 0 Then
        btnSend_Click
        KeyCode = 0
    End If
End If
  • Enter + Shift 키가 눌리면 텍스트 박스에 줄바꿈을 추가합니다.
  • Shift 없이 Enter만 누르면 btnSend_Click 이벤트를 호출해 메시지를 전송합니다.
  • KeyCode 값을 0으로 설정해 기본 Enter 키 동작(폼 닫힘 등)을 방지합니다.

(5) API 키 저장 (btnSaveAPIKey_Click)

사용자가 입력한 API 키를 저장소(Settings)에 저장하고, 저장 완료 메시지를 출력합니다.

Private Sub btnSaveAPIKey_Click()
    SaveSetting "GeminiChat", "Settings", "APIKey", txtAPIKey.text
    MsgBox "API Key가 저장되었습니다.", vbInformation
End Sub

(6) 대화 내용 저장 (btnSave_Click)

현재 대화 내용을 텍스트 파일로 저장할 수 있도록 파일 저장 대화상자를 표시합니다. 또한 파일명에 날짜를 포함하며, 저장 후 사용자에게 저장 완료 메시지를 출력합니다.

Public Sub btnSave_Click()
    Dim filePath As String

    filePath = Application.GetSaveAsFilename( _
        InitialFileName:="ConversationHistory_" & Format(Now(), "yyyy-mm-dd") & ".txt", _
        FileFilter:="Text Files (*.txt), *.txt", _
        Title:="대화 내용 저장")

    If filePath <> "False" Then
        If LCase$(Right$(filePath, 4)) <> ".txt" Then
            filePath = filePath & ".txt"
        End If

        Call SaveConversationAsAPI(filePath)
        MsgBox "대화 내용이 저장되었습니다.", vbInformation
    End If
End Sub

(7) 대화 내용 불러오기 (btnLoad_Click)

저장된 텍스트 파일에서 대화 내역을 불러와 채팅 히스토리에 표시합니다. 불러오기 완료 후 사용자에게 완료 메시지를 출력합니다. 이 기능은 대화 맥락을 유지하기 위해 구현된 기능입니다.

Public Sub btnLoad_Click()
    Dim filePath As String

    filePath = Application.GetOpenFilename( _
        FileFilter:="Text Files (*.txt), *.txt", _
        Title:="대화 내용 불러오기")

    If filePath <> "False" Then
        Call LoadConversationFromAPI(filePath)
        ChatHistory.text = conversationHistory
        MsgBox "대화 내용이 불러와졌습니다.", vbInformation
    End If
End Sub

(8) 대화 세션 초기화 (btnReset_Click)

대화 세션을 완전히 초기화하여 채팅 히스토리를 지우고, 초기 상태로 되돌립니다.
초기화 완료 후 사용자에게 알림 메시지를 출력합니다.

Public Sub btnReset_Click()
    Call ResetSession
    ChatHistory.text = ""
    MsgBox "대화 세션이 초기화되었습니다.", vbInformation
End Sub

마치며

오늘은 엑셀에서 제미나이 API를 호출하여 대화를 주고받을 수 있는 채팅 인터페이스의 뼈대를 완성하는 방법에 대해 알아보았습니다. 각 구성 요소의 세부 모듈 코드는 다음 편에서 계속됩니다.

이번 시간에 작성했던 사용자 폼 전체 코드는 아래에 첨부되어 있으며, 모듈 코드가 추가되어 완전히 동작하는 채팅 시스템은 아래 링크에서 확인 및 다운로드할 수 있습니다.

Leave a Comment