Страницы: 1
RSS
Как сразу найти все адреса эл.почты содержащие определенные домейны
 
Буду благодарен узнать какой формулой можно пользоваться, чтобы при получении базы данных с адресами эл.почты и имея в отдельном столбике домейны существующих клиетов можно было узнать в один миг, есть ли в полученной базе адреса с домейнами уже существующих клиентов?
Спасибо
 
Цитата
vadim801 написал: узнать какой формулой
Да какая понравится - их масса, лень все перечислять... ;)
Вот здесь, к примеру, можно примерочку устроить - http://www.planetaexcel.ru/techniques/14/
Изменено: Z - 04.09.2017 12:55:34
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Что-то не нашел...
 
Так нужно?
Код
=ЕСЛИ(ЕЧИСЛО(ПОИСК(B2;A2));"Есть домен";"Нет домен")
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Цитата
vadim801 написал: Что-то не нашел...
А что искали? Не это ли - http://www.planetaexcel.ru/techniques/14/3304/ ?!. ;)
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Bema
Можете приложить и файл?
Спасибо
 
Пожалуйста:
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Bema,
Огромное спасибо!
А если осуществить поиск по всему столбику А, а не по строчке (с учетом, что домены будут на разных строчках)?

Как тогда будет выглядеть формула?
 
Формула массива. Вводить тремя клавишами Ctrl+Shift+Enter
Код
=ЕСЛИ(ИЛИ(ЕЧИСЛО(ПОИСК(B2;$A$2:$A$6)));"Есть домен";"Нет домена")
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Цитата
Bema написал:
ЕСЛИ(ИЛИ(ЕЧИСЛО
Кхе-кхе, может без многих логических операторов
Код
=ЕСЛИОШИБКА(ПОИСКПОЗ(B2;ЗАМЕНИТЬ($A$2:$A$4;1;ПОИСК("@";$A$2:$A$4);"");0);"")
 
Цитата
z_sir написал:
может без многих логических операторов
Может и так, но как мне кажется, Ваша формула сложнее для понимания. Да и в качестве результата возвращает цифры.
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
vadim801, можно побаловаться с формулой "=ПРАВСИМВ()" и "=СЧЁТЕСЛИ()".
Итог: если у тебя адреса начинаются с ячейки А1 и вниз, то в ячейку B1 вставляешь формулу
=СЧЁТЕСЛИ(A:A;"*"&ПРАВСИМВ(A1;8)&"*")-1
Что оно делает: оно берет последние 8 символов (в формуле можно указать нужное кол-во) из ячейки с мейлом и проверяет совпадения этих 8 символов со всеми адресами из диапазона "А:А" и выдает кол-во совпадений без учета ячейки из которой оно ищет.
Плюсы: не надо делать отдельный столбик с доменами клиентов.
Минусы: кол-во символов с конца не может быть стандартным, так как могут быть всякие ".biz.com.ua", ".host.kiev.ua" (когда оно не "дотягивается" поиском до "части" домена) или очень короткие окончания "@i.ua", "@f.ua" (когда при поиске оно будет "тянуть" именную часть мейла "левее" после символа "@").

Теоретическое усовершенствование: можно в формулу задать отбор символов для поиска с конца мейла до первого слева знака "@" с подсчетом повторов по всему диапазону. Сейчас не помню как правильно это реализовывать. Если вспомню - напишу.
Изменено: msdoser - 04.09.2017 14:41:55
 
vadim801, вот решение
Если у тебя мейлы идут от "А1" и вниз, в ячейке "B1" (или где надо) вставляешь
Формула:
=СЧЁТЕСЛИ(A:A;"*"&ПРАВСИМВ(A1;ДЛСТР(A1)-НАЙТИ("@";A1;НАЙТИ("@";A1)))&"*")-1
Что оно делает: отсчитывает знаки справа влево до знака "@" и находит совпадения по всем мейлам из диапазона "А:А" и выдает кол-во совпадений без учете ячейки откуда было взято домен для поиска.
Плюсы: забудь про столбик "доменов" для мейла.
Минусы: они разве есть?
Изменено: msdoser - 04.09.2017 15:11:13
 
Bema,
А "Есть домен";"Нет домена"- это встроенные функции Экселя?
Почему, если меняю в формуле на "yes"/ "no"- она перестает работать
 
msdoser
Спасибо за совет, мне он пригодится в другом проекте
 
Цитата
vadim801 написал:
А "Есть домен";"Нет домена"- это встроенные функции Экселя?
Нет, это текст, который возвращает функция ЕСЛИ.
Цитата
vadim801 написал:
Почему, если меняю в формуле на "yes"/ "no"- она перестает работать
Могу предположить, что из-за того, что вводите не как формулу массива. Вводить тремя клавишами Ctrl+Shift+Enter. Если все сделаете правильно, формула обернется фигурными скобками { }
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Еще вариант. Немассивный
Код
=ЕСЛИ(ЕЧИСЛО(ПОИСКПОЗ("*"&B2;A$2:A$6;));"Есть домен";"Нет домена")
Изменено: _Boroda_ - 04.09.2017 15:31:27
Скажи мне, кудесник, любимец ба’гов...
 
Bema
Большое спасибо за помощь!
 
vadim801,
можно еще так
Код
=ЕСЛИ(СЧЁТЕСЛИ(A:A;"*"&ПРАВСИМВ(A2;ДЛСТР(A2)-НАЙТИ("@";A2;НАЙТИ("@";A2)))&"*")-1>0;"Есть домен";"Нет домена")

Это если нужно работать без столбика доменов.
Изменено: msdoser - 06.09.2017 11:03:59
 
vadim801, так ведь не только я помогал ;)  
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
msdoser, а где хранится база доменов?
 
Цитата
Bema написал:  vadim801 , так ведь не только я помогал  
Других так же поблагодарил.
Ваше решение самое простое и доходчивое
Изменено: vadim801 - 06.09.2017 11:04:44
 
Решение _Boroda_,тоже простое и понятное (см. сообщение 17 ) и работает по схожей логике. Но у него есть преимущество- формула не массивная. На больших объемах будет работать веселее чем моя формула. Ну а выбирать уже Вам.
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
vadim801, ее нету в этом случае.
Эта формула берет ячейку из столбца "А", берет все символы справа налево до символа "@", куда попадает домен почты, и ищет по всему столбцу "А" совпадения (без учета самой ячейки откуда был взять пример для поиска), после чего 2 варианта:
1) найдено минимум одно совпадение в столбце "А" => оно выдает сообщение "Есть домен";
2) оно не находит повторов по домену в столбце "А" => выдает сообщение "Нету домена".

Фактически, оно в реальном времени проверяет наличие повтора домена почты без наличия словаря.
Вопрос может быть в другом: насколько тебе важно иметь отдельный столбик с доменами? У меня подозрения что они вбиваются руками, как следствие - могут быть ошибки. Если этот отдельный столбец с доменами нужен, то там также можно настроить автоматическое "вытягивание" домена, допустим, в ячейку "С1" после ввода мейла в ячейку "А1" и так по каждой строчке.
Изменено: msdoser - 06.09.2017 11:05:07
 
_Boroda_,спасибо
А как в эту формулу можно еще добавить опцию выделить найденные значения в "А" определенным цветом?
 
msdoser,
Возможно так будет более понятно.
Время от времени мне надо делать рассылку для конечных пользователей. Иногода в этом списке присутствуют адреса клиентов (которые не должны получать рассылку). Для этого есть список в колонке (В) есть домены всех клиентов.
Если есть более креативное решение, чтобы выделить адреса в колонке "А" содержащие домены из  колонки "В"- буду признателен получить пример
 
Цитата
vadim801 написал: Иногода в этом списке присутствуют адреса клиентов (которые не должны получать рассылку)
Так имейте спец лист для рассылки и отбирайте на него только необходимое. Для удобства в основных данных можно иметь два поля - разделить по "@" эл. адрес, который даст возможность выбирать/отмечать/красить и т.п.
Есть в "Приемах" и на форуме много вариантов решения -  формул, расширенных фильтров и макросов, их сочетаний.
Цитата
vadim801 написал: Если есть более креативное решение...
Если сами не умеете/не желаете, а предложенное не устраивает - почему бы не обратиться с заказом в раздел "Работа"?!
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Код
=Если(Ечисло(ЕСЛИОШИБКА(ПОИСКПОЗ(B2;ЗАМЕНИТЬ($A$2:$A$4;1;ПОИСК("@";$A$2:$A$4);"");0);""));"Есть домен";"Нет домена")
Изменено: z_sir - 06.09.2017 13:56:37
 
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" мы получили список рассылки через запятую по мейлам, которые прошли проверку на "черный список" доменов (по которым отправлять запрещено).

Всем спасибо. Надеюсь осилили и оно будет Вам полезно.
Изменено: msdoser - 06.09.2017 17:26:14
Страницы: 1
Читают тему
Наверх