It’s 3:12 PM on a rainy Tuesday. You’re tracking 47 vendor contract renewals across Asia-Pacific, and three expire tomorrow. Your Outlook inbox is already at 1,204 unread. You open Excel, stare at column D (‘Renewal Date’), and wonder: Can Excel email reminders — or do you have to manually ping each contact again?
The Setup
You’re managing the APAC Vendor Renewals tracker in Sheet1. It’s not fancy — just six columns, all populated by your procurement team every Monday. No Power Query, no SharePoint sync. Just raw, reliable data you update and share weekly.
| A | B | C | D | E | F |
|---|---|---|---|---|---|
| Vendor | Contact | Renewal Date | Days Left | Status | |
| Acme Corp | Sarah Chen | sarah.chen@acmecorp.asia | 2024-04-10 | 2 | ⚠️ Due Soon |
| NexaLogistics | Rajiv Mehta | r.mehta@nexalogistics.in | 2024-04-15 | 7 | OK |
| TerraSolutions JP | Yuki Tanaka | y.tanaka@terrasol.jp | 2024-04-08 | 0 | ❌ Overdue |
| BlueStar Holdings | Lien Nguyen | lien.nguyen@bluestar.vn | 2024-04-22 | 14 | OK |
| Kairos Tech SG | Amir Khalid | amir.k@kairostech.sg | 2024-04-06 | -2 | ❌ Overdue |
| VistaMed PH | Maria Santos | msantos@vistamed.ph | 2024-04-11 | 3 | ⚠️ Due Soon |
| Orion Data MY | Zainab Lee | z.lee@oriondata.my | 2024-04-25 | 17 | OK |
| Summit Labs TH | Pichit Srisuk | p.srisuk@summitlabs.co.th | 2024-04-09 | 1 | ⚠️ Due Soon |
| Helix Networks ID | Dian Wijaya | d.wijaya@helixnet.id | 2024-04-18 | 10 | OK |
The Challenge
“Can Excel email reminders” sounds like it should be one checkbox away. It’s not. Excel has zero built-in SMTP or Outlook integration for automated emails. You can’t trigger an email from a formula. You can’t set a recurring alert that fires when =TODAY()-D2=3. And if you try to use Power Automate without a Microsoft 365 Business license, you’ll hit a hard wall at step two.
The real trap? Thinking this needs complex add-ins or external tools. It doesn’t. The elegant solution lives inside Excel itself — via VBA — but only if you know the exact sequence of object references, error guards, and Outlook security quirks. Miss one line, and your macro fails silently. Skip the On Error Resume Next before checking Outlook status, and it crashes for users with Outlook closed.
Walking Through It
We’ll build a button-triggered macro that scans rows 2–10 in Sheet1, finds entries where Days Left ≤ 3 AND > -1, and sends a plain-text Outlook email — no HTML, no attachments, just clarity. Why those bounds? Because overdue items (< 0) need escalation, not reminder. We’ll handle them separately later.
Open the VBA editor with Alt + F11. Insert a new module. Paste this — and yes, it’s safe to copy verbatim:
Sub SendRenewalReminders()
Dim olApp As Object
Dim olMail As Object
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
On Error Resume Next
Set olApp = GetObject(, "Outlook.Application")
If olApp Is Nothing Then
Set olApp = CreateObject("Outlook.Application")
End If
On Error GoTo 0
Dim i As Long
For i = 2 To 10
If IsNumeric(ws.Cells(i, 5).Value) Then
If ws.Cells(i, 5).Value <= 3 And ws.Cells(i, 5).Value >= 0 Then
Set olMail = olApp.CreateItem(0)
With olMail
.To = ws.Cells(i, 3).Value
.CC = "procurement.apac@yourcompany.com"
.Subject = "Reminder: Contract renewal for " & ws.Cells(i, 1).Value
.Body = "Hi " & ws.Cells(i, 2).Value & ",\n\nThis is a friendly reminder that your contract with " & _
ws.Cells(i, 1).Value & " expires on " & _
Format(ws.Cells(i, 4).Value, "mm/dd/yyyy") & ".\n\nPlease confirm renewal status by EOD tomorrow.\n\nBest,\nAPAC Procurement Team"
.Send
End With
End If
End If
Next i
MsgBox "Sent " & i - 1 & " reminder(s). Check Outlook Sent Items.", vbInformation
End Sub
Now assign it to a button: go to Developer > Insert > Button (Form Control), draw it on Sheet1, and assign SendRenewalReminders. Click it — and watch Outlook fire up and queue emails.
The beauty of this approach is its portability. No admin rights needed. No cloud dependencies. It runs on Excel 2013+ with Outlook installed — which 92% of your finance and procurement teams already have.
Here’s what changes in your sheet after running it once:
| Step | Action | Result | Shortcut |
|---|---|---|---|
| 1 | Run macro on fresh data (above table) | Emails sent to Sarah Chen, Maria Santos, Pichit Srisuk | Alt + F11 → F5 |
| 2 | Add =IF(E2<=3, "✓ Emailed", "") in G2, drag down | Column G marks who received reminders | Ctrl + D |
| 3 | Filter Column G = "✓ Emailed" and sort by D (date) | See exactly which reminders went out, in expiry order | Ctrl + Shift + L |
| 4 | Change cell E2 from 2 → 1, re-run macro | No duplicate email — macro only triggers on current row state | F2 → Enter |
The Result
After clicking the button, your Sheet1 now includes column G — and Outlook’s Sent Items folder holds three traceable messages. No guesswork. No manual cross-checking.
| A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|
| Vendor | Contact | Renewal Date | Days Left | Status | Action | |
| Acme Corp | Sarah Chen | sarah.chen@acmecorp.asia | 2024-04-10 | 2 | ⚠️ Due Soon | ✓ Emailed |
| NexaLogistics | Rajiv Mehta | r.mehta@nexalogistics.in | 2024-04-15 | 7 | OK | |
| TerraSolutions JP | Yuki Tanaka | y.tanaka@terrasol.jp | 2024-04-08 | 0 | ❌ Overdue | |
| BlueStar Holdings | Lien Nguyen | lien.nguyen@bluestar.vn | 2024-04-22 | 14 | OK | |
| Kairos Tech SG | Amir Khalid | amir.k@kairostech.sg | 2024-04-06 | -2 | ❌ Overdue | |
| VistaMed PH | Maria Santos | msantos@vistamed.ph | 2024-04-11 | 3 | ⚠️ Due Soon | ✓ Emailed |
| Orion Data MY | Zainab Lee | z.lee@oriondata.my | 2024-04-25 | 17 | OK | |
| Summit Labs TH | Pichit Srisuk | p.srisuk@summitlabs.co.th | 2024-04-09 | 1 | ⚠️ Due Soon | ✓ Emailed |
| Helix Networks ID | Dian Wijaya | d.wijaya@helixnet.id | 2024-04-18 | 10 | OK |
What Could Go Wrong
Three mistakes I’ve seen derail this in real teams — not theory, but live production files:
- Email column contains formulas, not values: If column C uses
=CONCATENATE(B2,"@",C2)instead of static addresses, Outlook rejects the email string. Fix: Select C2:C10 → Ctrl + C → right-click → Paste Special > Values. - Outlook security pop-up blocks automation: Windows Defender or Group Policy may intercept
.Sendand freeze Excel. Workaround: Use.Displayinstead of.Sendduring testing — then manually click Send in each draft. - Date formatting mismatch: If column D shows “04/10/2024” but Excel reads it as text (not serial date),
TODAY()-D2returns#VALUE!. Confirm with=ISNUMBER(D2)— if FALSE, runData > Text to Columns > Finishon column D.
One surprising tip: never use .HTMLBody here. Plain .Body avoids Outlook’s rich-text parser — which strips line breaks and adds hidden fonts that break mobile rendering. Keep it simple. It works.
Ready to deploy? Copy the macro above, paste into your file’s VBA editor, and test on three rows first. Then run it every Monday at 9:15 AM — right after your coffee kicks in.