Две задачи здесь раздельные, поэтому я бы написал их так.Вот мой подход.Разделите ваш саб на две логические процедуры.
- Определение диапазона тела
- Отправка электронного письма с диапазоном
Определение диапазона тела
Ссылка на кнопкук этому макросу.Макрос возьмет входные данные и преобразует его в один диапазон столбцов (Column B
).Затем мы пройдемся по выбранному диапазону и посмотрим на Column A
, чтобы определить, есть ли x
или нет.Если присутствует x
, мы изменим диапазон до его первоначального размера и добавим его в коллекцию ячеек (Final
).
Когда цикл завершится, макрос выполнит одно из следующих действий:
- Если диапазон пуст, появится окно с сообщением и конец подпрограммы (адрес электронной почты).макрос никогда не запускается)
- Если диапазон не пустой, мы назовем ваш макрос
EMAIL
и передадим ему диапазон.
Sub EmailRange()
Dim Initial As Range, Final As Range, nCell As Range
On Error Resume Next
Set Initial = Sheets("TEST").Application.InputBox("Range", xTitleId, "B1:K20", Type:=8)
On Error GoTo 0
For Each nCell In Initial.Resize(Initial.Rows.Count, 1)
If nCell.Offset(, -1) = "X" Then
If Not Final Is Nothing Then
Set Final = Union(Final, nCell.Resize(1, Initial.Columns.Count))
Else
Set Final = nCell.Resize(1, Initial.Columns.Count)
End If
End If
Next nCell
If Not Final Is Nothing Then
MAIL Final
Else
MsgBox "ATTENZIONE!!!" & vbNewLine & "Seleziona un range di celle valido.", vbOKOnly
End If
End Sub
Отправьте электронное письмо с диапазоном
Обратите внимание, что макрос теперь имеет ввод (в первой строке).Если вызывается подпрограмма, вам больше не нужно ничего проверять, поскольку все это было сделано в исходном подпрограмме!
Sub MAIL(Final as Range)
Dim OutApp As Object, OutMail As Object
Dim StrBodyIn As String, StrBodyEnd As String
StrBodyIn = "Bonjour," & "<br>" & " " & "<br>" & "Buongiorno," & "<br>"
StrBodyEnd = " " & "<br>" & "Cordialement" & "<br>" & " " & "<br>" & Range("M2") & "<br>"
Application.EnableEvents = False
Application.ScreenUpdating = False
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
.To = "email@gmail.com"
.CC = ""
.BCC = ""
.Subject = "SITUATION"
.HTMLBody = "<p style='font-family:calibri;font-size:16'>" & StrBodyIn & RangetoHTML(Final) & "<p style='font-family:calibri;font-size:16'>" & StrBodyEnd
.Display 'or use .Send
End With
On Error GoTo 0
Set OutMail = Nothing
Set OutApp = Nothing
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub