
이메일은 가장 강력한 업무 소통 도구 중 하나입니다. 이메일 작성 과정을 자동화하면 시간을 크게 절약할 수 있고, 모든 메일에서 일관된 톤과 형식을 유지할 수 있습니다. 엑셀 VBA를 활용하면 미리 만들어 둔 템플릿에 받는 사람 정보를 자동으로 채워 넣는 동적 이메일 생성기를 손쉽게 구축할 수 있습니다.
이 글에서는 엑셀에서 템플릿 기반의 동적 이메일 생성기를 만드는 전체 과정을 단계별로 살펴보겠습니다.
시작 전 준비 사항
- Microsoft Excel (2016 이상 버전)
- 엑셀에 대한 기본적인 이해
- VBA 편집기 사용 가능 환경 (개발 도구 탭 활성화 필요)
1단계: 엑셀 통합 문서 설정하기
데이터 시트(Data) 만들기
- 새 시트를 추가하고 이름을 Data로 지정합니다.
- 받는 사람 정보를 입력할 열을 아래와 같이 구성합니다:
- First Name (이름)
- Last Name (성)
- Email (이메일 주소)
- Company (회사명)
- Department (부서)
- Role (직책)
- Meeting Topic (회의 주제)
- Action Item (후속 조치 사항)
- Sender Name (보내는 사람 이름)

템플릿 시트(Template) 만들기
- 또 다른 시트를 만들고 이름을 Template으로 지정합니다.
- 다음 열을 생성합니다:
- Template ID (템플릿 번호)
- Template Name (템플릿 이름)
- Subject Line (메일 제목)
- Email Body (메일 본문)
2단계: 이메일 템플릿 작성하기
템플릿에는 {{FirstName}}, {{Company}}, {{Department}}, {{Role}} 같은 플레이스홀더(placeholder)를 사용합니다. 메일 발송 시점에 이 자리가 실제 데이터로 자동 교체되는 방식입니다.
템플릿 1: 신규 입사자 온보딩 메일
Dear {{FirstName}},
Welcome to {{Company}}! We're excited to have you on board.
Your account has been set up with the following details:
Department: {{Department}}
Role: {{Role}}
Best regards,
HR Team
이 템플릿은 신규 입사자에게 자동으로 발송되는 온보딩 메일용입니다. 발송 전에 플레이스홀더가 각 수신자의 실제 정보로 대체되므로, 모든 직원에게 개인화된 인사 메일을 보낼 수 있습니다.
플레이스홀더 설명:
- {{FirstName}}: 입사자의 이름
- {{Company}}: 회사명
- {{Department}}: 배치될 부서
- {{Role}}: 담당할 직무
템플릿 2: 회의 후 후속 메일
Hi {{FirstName}},
Thank you for your time during our discussion about {{Meeting Topic}}. As discussed, I'm following up on {{Action Item}}.
Let me know if you have any questions.
Best regards,
{{Sender Name}}

3단계: VBA 코드 삽입하기
VBA 편집기를 여는 방법은 다음과 같습니다:
- 개발 도구(Developer) 탭 >> Visual Basic 선택
- Insert(삽입) 클릭 >> Module(모듈) 선택
- 아래 코드를 복사하여 붙여넣습니다.

Option Explicit
Public Sub GenerateEmails()
Dim ws As Worksheet
Dim templateWs As Worksheet
Dim lastRow As Long
Dim i As Long
Dim emailBody As String
Dim subjectLine As String
Dim templateID As Long
' Set references to worksheets
Set ws = ThisWorkbook.Sheets("Data")
Set templateWs = ThisWorkbook.Sheets("Templates")
' Find last row with data
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' Get template ID from user
templateID = InputBox("Enter the Template ID number:", "Select Template")
' Get template text
subjectLine = GetTemplate("Subject_Line", templateID)
emailBody = GetTemplate("Email_Body", templateID)
' Convert special characters to proper line breaks
emailBody = Replace(emailBody, "\n", vbNewLine)
' Create Outlook items
Dim outlookApp As Object
Dim emailItem As Object
Set outlookApp = CreateObject("Outlook.Application")
' Loop through each row of data
For i = 2 To lastRow
' Create new email
Set emailItem = outlookApp.CreateItem(0)
With emailItem
' Replace placeholders with actual data
.Subject = ReplaceFields(subjectLine, i, ws)
.Body = ReplaceFields(emailBody, i, ws) ' Changed from .HTMLBody to .Body
.To = ws.Cells(i, 3).Value ' Email address in column C
.Display ' Display email (change to .Send to send automatically)
End With
Next i
Set outlookApp = Nothing
End Sub
Private Function GetTemplate(field As String, templateID As Long) As String
Dim templateWs As Worksheet
Dim templateRow As Range
Set templateWs = ThisWorkbook.Sheets("Templates")
' Find the template row
Set templateRow = templateWs.Columns(1).Find(What:=templateID, LookIn:=xlValues, LookAt:=xlWhole)
If Not templateRow Is Nothing Then
Select Case field
Case "Subject_Line"
GetTemplate = templateWs.Cells(templateRow.Row, 3).Value
Case "Email_Body"
GetTemplate = templateWs.Cells(templateRow.Row, 4).Value
End Select
End If
End Function
Private Function ReplaceFields(text As String, rowNum As Long, ws As Worksheet) As String
Dim result As String
result = text
' Replace all field placeholders with actual data
result = Replace(result, "{{FirstName}}", ws.Cells(rowNum, 1).Value)
result = Replace(result, "{{LastName}}", ws.Cells(rowNum, 2).Value)
result = Replace(result, "{{Company}}", ws.Cells(rowNum, 4).Value)
result = Replace(result, "{{Department}}", ws.Cells(rowNum, 5).Value)
result = Replace(result, "{{Role}}", ws.Cells(rowNum, 6).Value)
result = Replace(result, "{{Meeting Topic}}", ws.Cells(rowNum, 7).Value)
result = Replace(result, "{{Action Item}}", ws.Cells(rowNum, 8).Value)
result = Replace(result, "{{Sender Name}}", ws.Cells(rowNum, 9).Value)
ReplaceFields = result
End Function
4단계: 이메일 생성기 실행하기
- 개발 도구(Developer) 탭에서 매크로(Macros)를 클릭합니다.
- GenerateEmails를 선택한 후 실행(Run) 버튼을 누릅니다.

- 메시지 박스가 나타나면 Template ID에 1을 입력합니다.
- 그러면 템플릿 1 형식에 맞춰 모든 메일이 생성됩니다.

- 매크로를 다시 실행(Run)합니다.
- 이번에는 메시지 박스에 Template ID: 2를 입력합니다.

이번에는 템플릿 2 형식에 따라 모든 메일이 생성됩니다.

- 발송 전에 생성된 메일 내용을 반드시 검토하세요.
- 검토 없이 즉시 일괄 발송하려면 코드의 .Display를 .Send로 변경하면 됩니다.
커스터마이징 팁
새로운 플레이스홀더 필드 추가하기
- Data 시트에 새 열을 추가합니다.
- VBA 코드의 ReplaceFields 함수에 해당 필드를 포함하도록 수정합니다.
- 이메일 템플릿에 {{FieldName}} 형식으로 새 플레이스홀더를 추가합니다.
HTML 서식 활용하기
이메일 템플릿에 HTML 서식을 적용할 수도 있습니다:
<p style="color: blue;">This text will be blue</p>
<strong>This text will be bold</strong>
마무리
이 튜토리얼을 통해 미리 정의된 템플릿과 VBA 자동화를 활용해 엑셀에서 동적 이메일 생성 환경을 구축하는 방법을 익혔습니다. 이러한 템플릿은 비즈니스 커뮤니케이션, 고객 후속 연락, 자동 알림 발송 등 다양한 용도로 활용할 수 있습니다. 이 이메일 생성기는 기본 골격 역할을 하며, 여러분의 필요에 맞게 얼마든지 확장할 수 있습니다. 템플릿을 만들고, 데이터 시트를 업데이트하고, VBA 코드의 플레이스홀더만 조정하면 됩니다. 실무 환경에 적용하기 전에는 반드시 충분한 테스트를 거치시기 바랍니다.