vadim801,
Не знаю, насколько это решение будет "изящно", но оно работает и суть следующая:
Есть список мейлов клиентов в столбике "А". В стобике "В" есть "черный список" доменов, на мейлы которых отправлять запрещено.
На примере строчки 2 из прикрепленного файла через формулу
Код |
---|
=ЕСЛИ(ЕОШИБКА(ЕСЛИ(ВПР(ПРАВСИМВ(A2;ДЛСТР(A2)-НАЙТИ("@";A2;НАЙТИ("@";A2)));B:B;1;0)=ПРАВСИМВ(A2;ДЛСТР(A2)-НАЙТИ("@";A2;НАЙТИ("@";A2)));"";A2))=ИСТИНА;A2;"") |
оно в столбике "С" "проверяет мейл на валидность" с "черным списком" доменов из столбика "В" и если оно проходит проверку - добавляет мейл в ячейку столбика "С". Если оно находит домен выбранного мейла в "черном списке" из столбика "В", то вместо мейла оно просто оставляет ячейку пустой (полностью пустой, даже без пробела).
На этом можно закончить, но(!) если нужно сделать рассылку на все "валидные" адреса, которые прошли проверку на домен, то действуем дальше:
1) вставляем макрос
Код |
---|
Function СцепитьЕсли(ByRef Диапазон As Range, ByVal Критерий As String, ByRef Диапазон_сцепления As Range, Optional Разделитель As String = " ", Optional БезПовторов As Boolean = False) As String
Dim li As Long, sStr As String, avItem, avDateArr(), avRezArr(), lUBnd As Long
If Диапазон.Count > 1 Then
avDateArr = Intersect(Диапазон, Диапазон.Parent.UsedRange).Value
avRezArr = Intersect(Диапазон_сцепления, Диапазон_сцепления.Parent.UsedRange).Value
If Диапазон.Rows.Count = 1 Then
avDateArr = Application.Transpose(avDateArr)
avRezArr = Application.Transpose(avRezArr)
End If
Else
ReDim avDateArr(1, 1): ReDim avRezArr(1, 1)
avDateArr(1, 1) = Диапазон.Value
avRezArr(1, 1) = Диапазон_сцепления.Value
End If
lUBnd = UBound(avDateArr, 1)
'Определяем вхождение операторов сравнения в Критерий
Dim objRegExp As Object, objMatches As Object
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Global = False: objRegExp.Pattern = "=|<>|=>|>=|<=|=<|>|<"
Set objMatches = objRegExp.Execute(Критерий)
'Если есть вхождения
If objMatches.Count > 0 Then
Dim sStrMatch As String
sStrMatch = objMatches.Item(0)
Критерий = Replace(Replace(Критерий, sStrMatch, "", 1, 1), Chr(34), "", 1, 2)
Select Case sStrMatch
Case "="
For li = 1 To lUBnd
If avDateArr(li, 1) = Критерий Then
If Trim(avRezArr(li, 1)) <> "" Then _
sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
End If
Next li
Case "<>"
For li = 1 To lUBnd
If avDateArr(li, 1) <> Критерий Then
If Trim(avRezArr(li, 1)) <> "" Then _
sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
End If
Next li
Case ">=", "=>"
For li = 1 To lUBnd
If avDateArr(li, 1) >= Критерий Then
If Trim(avRezArr(li, 1)) <> "" Then _
sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
End If
Next li
Case "<=", "=<"
For li = 1 To lUBnd
If avDateArr(li, 1) <= Критерий Then
If Trim(avRezArr(li, 1)) <> "" Then _
sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
End If
Next li
Case ">"
For li = 1 To lUBnd
If avDateArr(li, 1) > Критерий Then
If Trim(avRezArr(li, 1)) <> "" Then _
sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
End If
Next li
Case "<"
For li = 1 To lUBnd
If avDateArr(li, 1) < Критерий Then
If Trim(avRezArr(li, 1)) <> "" Then _
sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
End If
Next li
End Select
Else 'Если нет вхождения
For li = 1 To lUBnd
If avDateArr(li, 1) Like Критерий Then
If Trim(avRezArr(li, 1)) <> "" Then _
sStr = sStr & IIf(sStr <> "", Разделитель, "") & avRezArr(li, 1)
End If
Next li
End If
If БезПовторов Then
Dim oDict As Object, sTmpStr
Set oDict = CreateObject("Scripting.Dictionary")
sTmpStr = Split(sStr, Разделитель)
On Error Resume Next
For li = LBound(sTmpStr) To UBound(sTmpStr)
oDict.Add sTmpStr(li), sTmpStr(li)
Next li
sStr = ""
sTmpStr = oDict.keys
For li = LBound(sTmpStr) To UBound(sTmpStr)
sStr = sStr & IIf(sStr <> "", Разделитель, "") & sTmpStr(li)
Next li
End If
СцепитьЕсли = sStr
End Function |
2) Для рассылки нам нужна одна строчка со всеми собранными адресами из столбика "С" через запятую без учета пустых ячеек.
Для этого (на примере файла из прикрепленных) в ячейке "D1" пишем формулу (работает только при вышеуказанном макросе):
Код |
---|
=СцепитьЕсли(C$2:C$1048576;"<>0";C$2:C$1048576;", ";1) |
Где
- первые C$2:C$1048576 - диапазон для поиска условия без ячейки с заглавием столбика;
- "<>0" - условие "непустых" ячеек;
- вторые C$2:C$1048576 - диапазон, для выборки значений для сцепки без ячейки с заглавием столбика;
- ", " - разделитель между сцепленными значениями (не забывайте, что для списка мейлов для рассылки, чтоб потом его можно было просто вставить в графу "получатель" в Вашем почтовом ящике нужно указывать разделитель ", " с пробелом);
- 1 - критерий, определяющий "сцепку" только для уникальных значений, то есть в данном случае один и тот же мейл в ячейке-сцепке дважды не повторится.
В результате, в ячейке "D1" мы получили список рассылки через запятую по мейлам, которые прошли проверку на "черный список" доменов (по которым отправлять запрещено).
Всем спасибо. Надеюсь осилили и оно будет Вам полезно.