
Creating a Dynamic Email Generator with Templates in Excel
Email is one of the most powerful tools for communication. Automating email generation can save time and ensure consistency in communication. Excel VBA can create a dynamic email generator that allows you to automatically generate personalized emails from templates.
In this article, we’ll create a dynamic email generator with templates in Excel.
Prerequisites
- Microsoft Excel (2016 or newer).
- Basic understanding of Excel.
- Access to the VBA editor (Developer tab enabled).
Step 1: Setting Up Your Excel Workbook
Create the Data Sheet
- Add a new sheet named Data.
- Create columns for your recipient information:
- First Name
- Last Name
- Company
- Department
- Role
- Meeting Topic
- Action Item
- Sender Name

Create the Template Sheet
- Create another sheet named Template.
- Create the following columns:
- Template ID
- Template Name
- Subject Line
- Email Body
Step 2: Creating Email Templates
Create an email template that dynamically inserts values using placeholders such as {{FirstName}}, {{Company}}, {{Department}}, {{Role}}, etc.
Template 1:
Let’s create a template for automated onboarding emails.
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
This template is used for automated onboarding emails, where actual values replace the placeholders before sending, ensuring a personalized message for each recipient.
Explanation:
- {{FirstName}}: Placeholder for the employee’s first name.
- {{Company}}: Placeholder for the company’s name.
- {{Department}}: Placeholder for the department where the new employee is assigned.
- {{Role}}: Placeholder for the employee’s job role.
Template 2:
We created another template for post-meeting communications.
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}}

Step 3: Insert the VBA Code
To open the VBA editor:
- Go to the Developer tab >> select Visual Basic.
- Click Insert >> select Module.
- Copy and paste the following code:

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
Step 4: Run the Email Generator
- On the Developer tab >> click Macros.
- Select GenerateEmails >> click Run.

- In the Message Box >> enter the Template ID: 1.
- It will send all the mail following template 1.

- Again Run the code.
- In the Message Box >> enter Template ID: 2.

It will send all the mail following template 2.

- Review the generated emails before sending them.
- If review is not required, use .Send property instead of .Display to send all the emails.
Customization Tips
Adding New Placeholder Fields:
- Add a new column in the Data sheet.
- Update the ReplaceFields function in the VBA code to include the new field.
- Add the new placeholder to your email templates using the format {{FieldName}}.
HTML Formatting:
You can include HTML formatting in your email templates:
<p style="color: blue;">This text will be blue</p>
<strong>This text will be bold</strong>
Conclusion
This tutorial will help you set up dynamic email generation in Excel with predefined templates and VBA automation. You can use these templates for business communications, client follow-ups, and automated reminders. This email generator will work as a foundation, you can customize it based on your specific requirements. Just create the template, update the data sheet, and placeholder in the VBA code. Remember to test thoroughly before using it in production environments.
Get FREE Advanced Excel Exercises with Solutions!