Excel VBA для отправки электронных писем разным людям в столбце

#excel #vba

#excel #vba

Вопрос:

У меня есть отчет, который генерируется для меня ежедневно, который мне нужно отправить определенным администраторам. Проблема в том, что не каждый администратор упоминается всегда, а упомянутые администраторы часто появляются несколько раз. Плюс количество строк, которые у меня есть, всегда варьируется.

Обычно это выглядит следующим образом:

Пример столбца

Чего бы я хотел, так это чтобы каждому упомянутому администратору было сгенерировано электронное письмо. На данный момент у меня есть это (адреса электронной почты моей компании настроены как «first.last@email.email «):

 Sub Email_Test()

Columns("F:F").Select
Selection.Replace What:=" ", Replacement:=".", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)

On Error Resume Next
With OutMail
.Display
End With
    signature = OMail.body
With OutMail
    .To = Range("F2") amp; "@email.email" amp; "; " amp; Range("F3") amp; "@email.email" amp; "; " amp; Range("F4") amp; "@email.email" amp; "; " amp; Range("F5") amp; "@email.email" amp; "; " amp; Range("F6") amp; "@email.email"
    .CC = ""
    .BCC = ""
    .Subject = "Report"
    .HTMLBody = "See attached" amp; "<br>" amp; .HTMLBody
    .Attachments.Add ActiveWorkbook.FullName
    .DeferredDeliveryTime = ""
    .Display
End With
On Error GoTo 0

With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With

Set OutMail = Nothing
Set OutApp = Nothing

End Sub
  

Очевидно, что это не сработает, но, надеюсь, это иллюстрирует мою идею. Есть ли способ для меня выполнить поиск в столбце F для каждого уникального экземпляра имени, а затем добавить расширение электронной почты? Я уверен, что есть менее сложный способ, чем тот, который у меня есть в настоящее время.

Спасибо!

Комментарии:

1. Вы можете фильтровать данные по уникальным именам и отправлять почту администраторам, отображаемым в видимых строках. VBA объединит электронные письма из видимых ячеек для отображения в To строке

Ответ №1:

Итак, во-первых, действительно опасно угадывать адреса электронной почты из списка имен. (Вы уверены, что нет двух Paul Blarts? Если это так, отчет получает только один. Вы уверены, что нет двух пижам Тони? Если да, то правильный ли получает отчет?) В любом случае, я предполагаю, что вы все это учли, и вы сможете сохранить свою работу, если она попадет не в ту пижаму.

Я бы использовал scripting.dictionary для хранения электронных писем, используя имена или адреса электронной почты в качестве ключа. Тогда я мог бы проверить членство в dict перед добавлением другого:

Не тестировалось, но должно дать вам представление:

 Public Sub CreateEmails()
    Dim row As Long
    Dim email_address As String
    Dim email_dict As Object
    Set email_dict = CreateObject("Scripting.Dictionary")

    Set OutApp = CreateObject("Outlook.Application")
    Dim OutMail As Object

    row = 2
    Do While ThisWorkbook.Sheets("SheetWithNames").Cells(row, 6).Value <> ""
        email_address = email_address_from_name(.Cells(row, 6).Value) 'turns a name into an email
        If Not email_dict.exists(email_address) Then
            Set OutMail = OutApp.CreateItem(0)
            With OutMail
                .To = email_address
                .Subject = "Report"
                .HTMLBody = "See attached" amp; "<br>" amp; .HTMLBody
                .Attachments.Add ActiveWorkbook.FullName
                .Display
            End With
            email_dict.Add email_address, OutMail
        End If
        row = row   1
    Loop
End Sub