Как прекратить отправку электронных писем многократно при открытии файла

#excel #vba

#excel #vba

Вопрос:

Мне нужна помощь с кодом для отправки электронных писем только один раз в день.

При открытии файла код настроен на автоматическую отправку электронных писем и основан на дате выполнения. Однако этот файл может быть открыт несколько раз в течение дня. Мне нужно отправлять электронное письмо только один раз в день (при первом открытии файла), но я не могу понять, как правильно его закодировать.

     For i = 2 To lRow

    If Cells(i, 8).Value <> "Completed" Then 
        If Cells(i, 2) <> "" Then
            toDate = Replace(Cells(i, 5), ".", "/")
             If Left(Cells(i, 18), 5) <> "Mail" And toDate - Date <= 7 Then
                Set OutApp = CreateObject("Outlook.Application")
                Set OutMail = OutApp.CreateItem(0)
                toList = Cells(i, 7)
                eSubject = "ACTION ITEM - " amp; Cells(i, 3) amp; " is due on " amp; Cells(i, 5)
                eBody = "NOTICE for " amp; Cells(i, 6) amp; vbCrLf amp; vbCrLf amp; "This is a reminder that you have task(s) that are due or ones that are past due. Please complete your tasks as soon as possible, then notify the Quality Administrator when the task is complete."
                On Error Resume Next
                With OutMail
                    .To = toList
                    .CC = ""
                    .BCC = ""
                    .Subject = eSubject
                    .Body = eBody
                    .bodyformat = 1
                    '.Display
                    .Send
                End With
                On Error GoTo 0
                Set OutMail = Nothing
                Set OutApp = Nothing
                Cells(i, 9) = "Mail Sent " amp; Date   Time
    End If
        End If
           End If 
    Next i
  

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

1. Что, если у вас где-то есть ячейка (скажем Sheets("notesSheet").Range("A1") в этой книге, и при открытии файла проверьте, есть ли в этой ячейке значение (скажем, «отправлено»). Если нет, отправьте электронное письмо, а затем добавьте «отправлено» в эту ячейку?

2. @BruceWayne лучше просто записать сегодняшнюю дату, и если сегодня> значение ячейки, то обновить значение ячейки, сохранить, а затем отправить по электронной почте, иначе нет. ‘отправлено’ не будет работать на второй день: P Вы получите электронные письма на первый день; но после этого ничего! или вы могли бы просто проверить дату последнего сохранения файлов и, если сегодня> сохраненная дата, сохранить файл и отправить.

3. @xQbert — Отличная мысль!

4. Если сохранение переменной не входит в число возможностей, вы также можете выполнить поиск по отправленным элементам с помощью VBA, чтобы проверить, относится ли какой-либо из отправленных элементов в тот день к вашей теме.

5. @BruceWayne: Я не знаю, как правильно настроить код для чего-то подобного. После отправки электронного письма в ячейку помещаются дата и время. Могу ли я каким-либо образом использовать эту ячейку. [ Ячейки (i, 9) = «Отправлено письмо» amp; Дата время ] возможно, добавив в цикл оператор IF, который if (i, 9) содержит сегодняшнюю дату — не отправлять другое электронное письмо?

Ответ №1:

Вот так:

 For i = 2 To lRow
    If Cells(i, 8).Value <> "Completed" And _
       Cells(i, 2) <> "" And _
       Cells(i, 9) <> Date Then

            'send the mail
            Cells(i, 9) = Date '<<< store the date sent

    End If
Next i
  

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

1. код работает, но он помещает сегодняшнюю дату в ячейки тех, кто просрочен (и получил электронное письмо), а также тех, кто не просрочен (и не получает электронное письмо). Что я хочу сделать, так это отправлять электронные письма 1 раз в день. Если ячейка <сегодня’

2. Дата заполняется только в ячейках (i, 9), если электронное письмо отправлено (по крайней мере, так я его написал), при условии, что вам нужно будет внести некоторые коррективы — я только пытался показать базовый шаблон.

3. @ Tim Williams — извините, мой комментарий был прерван. Спасибо за ваш код и ввод. Я попробую поработать с ним еще немного и посмотрю, смогу ли я заставить его работать на меня.