Я начинающий в VBA. Сильно не пинайте. Есть файл, с данными по сотрудникам. Есть 2 макроса, которые по отдельности работают как надо. Первый - формирует письма на получателей (если почта получателя встречается 10 раз, будет сформированы 10 писем), с указанием сотрудников, у кого срок меньше, либо равен, 9. Второй макрос - формирует письма, без повторений получателя (т.е. если в получателях находится 10 строк для отправки, он собирает эти 10 строк в 1 письмо, а не 10 писем). И я хочу объединить эти 2 макроса, чтобы он формировал 1 письмо со всеми сотрудниками (на 1 получателя), у кого срок меньше либо равен 9. Пример документа и сами макросы ниже
[vba]
Код
Public Sub SendMailDueDate() Dim xRgDate As Range Dim xRgSend As Range Dim xRgText As Range Dim xRgDone As Range Dim xOutApp As Object Dim xMailItem As Object Dim xLastRow As Long Dim vbCrLf As String Dim xMailBody As String Dim xRgDateVal As String Dim xRgSendVal As String Dim xMailSubject As String Dim y As Long On Error Resume Next Set xRgDate = Range("F2:F7") 'Дата окончания If xRgDate Is Nothing Then Exit Sub Set xRgSend = Range("E2:E7") 'Почта If xRgSend Is Nothing Then Exit Sub Set xRgText = Range("B2:B7") 'ФИО If xRgText Is Nothing Then Exit Sub xLastRow = xRgDate.Rows.Count Set xRgDate = xRgDate(1) Set xRgSend = xRgSend(1) Set xRgText = xRgText(1) Set xOutApp = CreateObject("Outlook.Application") For y = 1 To xLastRow xRgDateVal = "" xRgDateVal = xRgDate.Offset(y - 1).Value If xRgDateVal <> "" Then If CDate(xRgDateVal) - Date <= 10 And CDate(xRgDateVal) - Date > 0 Then xRgSendVal = xRgSend.Offset(y - 1).Value xMailSubject = "Окончание сертификата" vbCrLf = "" xMailBody = "Добрый день! сертификат кончается у " & xRgText.Offset(y - 1).Value & vbCrLf Set xMailItem = xOutApp.CreateItem(0) With xMailItem .Subject = xMailSubject .To = xRgSendVal .CC = "" .BCC = "" .HTMLBody = xMailBody .Display '.Send End With Set xMailItem = Nothing End If End If Next Set xOutApp = Nothing End Sub
[/vba]
[vba]
Код
Sub SendMail()
Const olMailItem% = 0 Const FirstRow% = 2 Dim i&, j&, LastRow&, T$, vX, OutlookApp As Object, Dic As Object, Dic2 As Object Set OutlookApp = CreateObject("Outlook.Application") With ActiveSheet: LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row: End With Set Dic = CreateObject("Scripting.Dictionary"): Dic.CompareMode = 1 Set Dic2 = CreateObject("Scripting.Dictionary"): Dic2.CompareMode = 1 For i = FirstRow To LastRow T = Cells(i, 2) vX = Cells(i, 5) Dic.Item(vX) = Dic.Item(vX) & T & vbCrLf If Not IsEmpty(Cells(i, 5)) Then Dic2.Item(vX) = Cells(i, 5) Next i For Each vX In Dic.Keys If Len(Dic2.Item(vX)) Then With OutlookApp.CreateItem(olMailItem) .to = Dic2.Item(vX) .Subject = "Окончание сертификата" .Body = "Сертификат кончается: " & vbCrLf & Dic.Item(vX) .display End With End If Next vX Set OutlookApp = Nothing Set Dic = Nothing
End Sub
[/vba]
Я начинающий в VBA. Сильно не пинайте. Есть файл, с данными по сотрудникам. Есть 2 макроса, которые по отдельности работают как надо. Первый - формирует письма на получателей (если почта получателя встречается 10 раз, будет сформированы 10 писем), с указанием сотрудников, у кого срок меньше, либо равен, 9. Второй макрос - формирует письма, без повторений получателя (т.е. если в получателях находится 10 строк для отправки, он собирает эти 10 строк в 1 письмо, а не 10 писем). И я хочу объединить эти 2 макроса, чтобы он формировал 1 письмо со всеми сотрудниками (на 1 получателя), у кого срок меньше либо равен 9. Пример документа и сами макросы ниже
[vba]
Код
Public Sub SendMailDueDate() Dim xRgDate As Range Dim xRgSend As Range Dim xRgText As Range Dim xRgDone As Range Dim xOutApp As Object Dim xMailItem As Object Dim xLastRow As Long Dim vbCrLf As String Dim xMailBody As String Dim xRgDateVal As String Dim xRgSendVal As String Dim xMailSubject As String Dim y As Long On Error Resume Next Set xRgDate = Range("F2:F7") 'Дата окончания If xRgDate Is Nothing Then Exit Sub Set xRgSend = Range("E2:E7") 'Почта If xRgSend Is Nothing Then Exit Sub Set xRgText = Range("B2:B7") 'ФИО If xRgText Is Nothing Then Exit Sub xLastRow = xRgDate.Rows.Count Set xRgDate = xRgDate(1) Set xRgSend = xRgSend(1) Set xRgText = xRgText(1) Set xOutApp = CreateObject("Outlook.Application") For y = 1 To xLastRow xRgDateVal = "" xRgDateVal = xRgDate.Offset(y - 1).Value If xRgDateVal <> "" Then If CDate(xRgDateVal) - Date <= 10 And CDate(xRgDateVal) - Date > 0 Then xRgSendVal = xRgSend.Offset(y - 1).Value xMailSubject = "Окончание сертификата" vbCrLf = "" xMailBody = "Добрый день! сертификат кончается у " & xRgText.Offset(y - 1).Value & vbCrLf Set xMailItem = xOutApp.CreateItem(0) With xMailItem .Subject = xMailSubject .To = xRgSendVal .CC = "" .BCC = "" .HTMLBody = xMailBody .Display '.Send End With Set xMailItem = Nothing End If End If Next Set xOutApp = Nothing End Sub
[/vba]
[vba]
Код
Sub SendMail()
Const olMailItem% = 0 Const FirstRow% = 2 Dim i&, j&, LastRow&, T$, vX, OutlookApp As Object, Dic As Object, Dic2 As Object Set OutlookApp = CreateObject("Outlook.Application") With ActiveSheet: LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row: End With Set Dic = CreateObject("Scripting.Dictionary"): Dic.CompareMode = 1 Set Dic2 = CreateObject("Scripting.Dictionary"): Dic2.CompareMode = 1 For i = FirstRow To LastRow T = Cells(i, 2) vX = Cells(i, 5) Dic.Item(vX) = Dic.Item(vX) & T & vbCrLf If Not IsEmpty(Cells(i, 5)) Then Dic2.Item(vX) = Cells(i, 5) Next i For Each vX In Dic.Keys If Len(Dic2.Item(vX)) Then With OutlookApp.CreateItem(olMailItem) .to = Dic2.Item(vX) .Subject = "Окончание сертификата" .Body = "Сертификат кончается: " & vbCrLf & Dic.Item(vX) .display End With End If Next vX Set OutlookApp = Nothing Set Dic = Nothing
Если правильно понял, надо во второй макрос добавить условие про 9 дней (или про 10, как указано в коде <= 10). Ниже я добавил 4 строки с комментарием "ДОБАВЛЕНО ..." в Ваш код и название процедуры чуть изменил (_v2 = версия 2), чтобы не конфликтовало: [vba]
Код
Sub SendMail_v2()
Dim xRgDateVal As String 'ДОБАВЛЕНО ----- 1 Const olMailItem% = 0 Const FirstRow% = 2 Dim i&, j&, LastRow&, T$, vX, OutlookApp As Object, Dic As Object, Dic2 As Object Set OutlookApp = CreateObject("Outlook.Application") With ActiveSheet: LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row: End With Set Dic = CreateObject("Scripting.Dictionary"): Dic.CompareMode = 1 Set Dic2 = CreateObject("Scripting.Dictionary"): Dic2.CompareMode = 1 For i = FirstRow To LastRow xRgDateVal = Cells(i, 6) 'ДОБАВЛЕНО ----- 2 If CDate(xRgDateVal) - Date <= 10 And CDate(xRgDateVal) - Date > 0 Then 'ДОБАВЛЕНО ----- 3 T = Cells(i, 2) vX = Cells(i, 5) Dic.Item(vX) = Dic.Item(vX) & T & vbCrLf If Not IsEmpty(Cells(i, 5)) Then Dic2.Item(vX) = Cells(i, 5) End If 'ДОБАВЛЕНО ----- 4 Next i For Each vX In Dic.Keys If Len(Dic2.Item(vX)) Then With OutlookApp.CreateItem(olMailItem) .to = Dic2.Item(vX) .Subject = "Окончание сертификата" .Body = "Сертификат кончается: " & vbCrLf & Dic.Item(vX) .display End With MsgBox "Сертификат кончается: " & vbCrLf & Dic.Item(vX) End If Next vX Set OutlookApp = Nothing Set Dic = Nothing
End Sub
[/vba] Проверьте, так ли, как хотели, получается? Оно?
Если правильно понял, надо во второй макрос добавить условие про 9 дней (или про 10, как указано в коде <= 10). Ниже я добавил 4 строки с комментарием "ДОБАВЛЕНО ..." в Ваш код и название процедуры чуть изменил (_v2 = версия 2), чтобы не конфликтовало: [vba]
Код
Sub SendMail_v2()
Dim xRgDateVal As String 'ДОБАВЛЕНО ----- 1 Const olMailItem% = 0 Const FirstRow% = 2 Dim i&, j&, LastRow&, T$, vX, OutlookApp As Object, Dic As Object, Dic2 As Object Set OutlookApp = CreateObject("Outlook.Application") With ActiveSheet: LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row: End With Set Dic = CreateObject("Scripting.Dictionary"): Dic.CompareMode = 1 Set Dic2 = CreateObject("Scripting.Dictionary"): Dic2.CompareMode = 1 For i = FirstRow To LastRow xRgDateVal = Cells(i, 6) 'ДОБАВЛЕНО ----- 2 If CDate(xRgDateVal) - Date <= 10 And CDate(xRgDateVal) - Date > 0 Then 'ДОБАВЛЕНО ----- 3 T = Cells(i, 2) vX = Cells(i, 5) Dic.Item(vX) = Dic.Item(vX) & T & vbCrLf If Not IsEmpty(Cells(i, 5)) Then Dic2.Item(vX) = Cells(i, 5) End If 'ДОБАВЛЕНО ----- 4 Next i For Each vX In Dic.Keys If Len(Dic2.Item(vX)) Then With OutlookApp.CreateItem(olMailItem) .to = Dic2.Item(vX) .Subject = "Окончание сертификата" .Body = "Сертификат кончается: " & vbCrLf & Dic.Item(vX) .display End With MsgBox "Сертификат кончается: " & vbCrLf & Dic.Item(vX) End If Next vX Set OutlookApp = Nothing Set Dic = Nothing
End Sub
[/vba] Проверьте, так ли, как хотели, получается? Оно?Gustav