#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 — извините, мой комментарий был прерван. Спасибо за ваш код и ввод. Я попробую поработать с ним еще немного и посмотрю, смогу ли я заставить его работать на меня.