В таблице укажите имя в A, адрес в B, тему в C и текст в D. Безопасный вариант макроса открывает каждое письмо для проверки и ничего не отправляет автоматически.
Рабочий макрос
Option Explicit
Sub CreatePersonalEmails()
Const olMailItem As Long = 0
Dim ws As Worksheet, lastRow As Long, r As Long
Dim outlookApp As Object, mail As Object
Dim recipient As String
Set ws = ThisWorkbook.Worksheets("Рассылка")
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
Set outlookApp = CreateObject("Outlook.Application")
For r = 2 To lastRow
recipient = Trim$(CStr(ws.Cells(r, "B").Value))
If recipient <> "" And InStr(1, recipient, "@") > 1 Then
Set mail = outlookApp.CreateItem(olMailItem)
With mail
.To = recipient
.Subject = CStr(ws.Cells(r, "C").Value)
.Body = "Здравствуйте, " & CStr(ws.Cells(r, "A").Value) & "!" & vbCrLf & vbCrLf & _
CStr(ws.Cells(r, "D").Value)
.Display
End With
ws.Cells(r, "E").Value = "Создан черновик"
Else
ws.Cells(r, "E").Value = "Проверьте адрес"
End If
Next r
End Sub
Подготовить таблицу
Создайте лист Рассылка и заголовки: Имя, Email, Тема, Текст, Статус. Не смешивайте несколько адресов в одной ячейке. Сохраните файл как XLSM.
Почему используется Display
Метод .Display показывает письмо пользователю. Метод .Send отправляет его сразу и опасен при первой проверке. Сначала протестируйте одну строку на собственном адресе, проверьте подпись, переносы и вложения.
HTML-письмо
Для форматирования используют .HTMLBody, но любые значения из таблицы нужно экранировать, иначе символы <, > и & повредят разметку. Для простого уведомления обычный .Body надёжнее.
Вложения
Полный путь можно хранить в столбце F и перед добавлением проверять Dir$(path). Не отправляйте письмо, если обязательный файл отсутствует.
Ограничения и безопасность
Outlook может показывать предупреждения, а корпоративная политика — запрещать программную отправку. Соблюдайте согласия получателей и правила обработки персональных данных. Этот способ подходит для адресной рабочей переписки, а не для нежелательной массовой рассылки.
Когда нужен отдельный процесс
Если писем сотни, нужны очередь, ограничение скорости, журнал, повтор после ошибок и контроль дублей. Такой процесс лучше реализовать как управляемую автоматизацию, а не заменять .Display на .Send.