Не могу вытащить ФИО из текста, в котором нет четкой иерархии, вернее она предусмотрена, но не соблюдается. 1. Формула 1 =ПСТР(A2;НАЙТИ(СИМВОЛ(1);ПОДСТАВИТЬ(A2;"|";СИМВОЛ(1);3))+1;НАЙТИ(СИМВОЛ(1);ПОДСТАВИТЬ(A2;"|";СИМВОЛ(1);3+1))-НАЙТИ(СИМВОЛ(1);ПОДСТАВИТЬ(A2;"|";СИМВОЛ(1);3))-1) Не всегда работает, потому что не всегда ФИО является третьей по счету, если забыли указать ГОРОД, плюс может попасться комментарий из другого города и тогда порядок совсем рушится. 2. Формула 2 =ПСТР(A2;ПОИСК("* ?.?";A2;1);10) Вообще не работает, т.к. маска с ФИО получается не уникальной, если есть еще точки в тексте. Друзья помогите, перерыл кучу примеров в нете, но ничего не помогает решить данную задачу!
titov_s@bk.ru, поменяйте отображаемое имя согласно правилам форума. Тема читается как вытащить случайным образом построку из строки, а не вытащить что-то , что не имеет четкого расположения. Предложите адекватное название теме, модераторы поменяют.
Function iFio(iCell As Range) As String
Dim re
Set re = CreateObject("VBScript.RegExp")
re.Global = True
re.Pattern = "[А-ЯЁ][а-яё]+ [А-ЯЁ]\.([А-ЯЁ]\.)?"
iFio = re.Execute(iCell)(0)
End Function
БМВ, сорри за название темы, но не нашел как самому отредактировать!
Спасибо, формула отлично работает, кроме случая когда (бывает и такое, и к сожалению таких случаев много) после отчества не стоит "." То есть должно быть "Иванов И.И.", по имеем "Иванов И.И" без точки в конце. Лечится конечно легко, заменой ФИО без точки на ФИО с точкой и меня это по большому счету устраивает, но если есть варианты обойти и эту проблему, буду благодарен! И еще, можно алгоритм работы вашей формулы описать?
написал: А Вас просили самому редактировать? Вот что Вам писали:Цитата БМВ написал:Предложите адекватное название теме, модераторы поменяют.
название вроде бы старое, посмотрел есть ли возможность это делать самому! Если от меня все таки нужно предложение по названию темы, то "Как вытащить из строки подстроку по маске расположенной в случайном порядке".
[URL=#]?[/URL] 1 2 3 4 5 6 7 Function iFio(iCell As Range) As String Dim re Set re = CreateObject( "VBScript.RegExp" ) re.Global = True re.Pattern = "[А-ЯЁ][а-яё]+ [А-ЯЁ]\.([А-ЯЁ]\.)?" iFio = re.Execute(iCell)(0) End Function
Kuzmich, подскажите, как в маску добавить знак "|" ? Всплывают новые подводные камни, в частности попадаются в строке просто ФИО, не обрамленные ||, которые попадают в выборку, а обрамленные || соответственно уже нет. Если я корректирую код добавляя "|" так (выделил красным): re.Pattern = "|[А-ЯЁ][а-яё]+ [А-ЯЁ]\.([А-ЯЁ]\.)?|" выдаются пустые значения почему-то!
Sergey, вам нужно решение? всем остальным оно на фиг не нужно (для понимания ситуации) так и пишете предложенный вами вариант не сработал в строке ХХ моего файла тот, кто решал задачу смотрит в строку ХХ, понимает что нужно исправить, исправляет (или бросает это все и вы дальше решаете свою задачу самостоятельно, еще раз - никому, кроме вас решение на фиг не нужно! никому, но из спортивного интереса при наличии постановки задачи - сделать можно, потому что любая решенная тут задача ничего у меня не забирает, а лишь добавляет навыков решений и может пригодиться для реальной задачи именно так я и осваивал программирование - решая любые практические (а иногда и нет) задачи, именно так я все еще совершенствую свои навыки или чаще всего, просто так провожу свободное время)
Kuzmich, спасибо большое, получилось (файл приложил), но: 1. при этом стали отображаться сами знаки "|", а они не нужны 2. в случае если после ФИО нет точки (к сожалению бывает), получаем #ЗНАЧ! В строке под №3 (которых вобрал в себя все возможные вариации данных) результат работы макроса, а так же то, как хотелось бы, что бы выглядел результат! Если возможно получить такой результат, можете еще раз помочь? Спасибо!
Function iFio(iCell As Range) As String
Dim re
Set re = CreateObject("VBScript.RegExp")
re.Global = True
' re.MultiLine = True
re.Pattern = "\|([А-ЯЁ][а-яё]+ [А-ЯЁ]\.[А-ЯЁ]\.?)\|"
iFio = re.Execute(iCell)(0).SubMatches(0)
End Function
написал: С FILTERXML можно и попроще, только терзают меня смутные сомнения насчет постоянства позиции с конца.
memo, к сожалению постоянства нет (с эту строку сливаются комментарии из разных каналов продаж, там могут написать все что угодно, кто во что горазд, в нашем канал есть шаблон с "|....|" между двумя <ГПП>, плюс сотрудник может добавить любые комм вне этого шаблона для себя, как до так и после, плюс комм от других каналов, а может быть только комм с "|.....|" между двумя <ГПП>), на этих трех примерах сработало отлично, но когда применил на всех на 1,5 тыс строк, вылезло много не тех данных! Формула берет все данные между | |, но попадаются не только ФИО, но и даты, города, услуги. Спасибо за вариант!