В файле содержится информация о контрагентах, и в отдельном столбце - их контакты, притом все сразу (ФИО, должность, телефон, почта). Есть ли какие-то инструменты для извлечения телефона и почты в соседние ячейки? Это необходимо для загрузки данных в систему, поэтому нужно привести их к одному формату. Думаю, я не первая, кто столкнулся с такой задачей, надеюсь на Вашу помощь!
Вот тут есть вариант решения вопроса с эл. почтой, но он больше направлен на то, чтобы извлечь все адреса эл. почты в отдельный столбец, поэтому не будет увязки с конкретным контрагентом, а в случае многотысячного списка это бесполезная вещь... Пробовала делить на столбцы по пробелам и запятым и затем в каждом столбце сортировать строки, содержащие по @ - очень долго, потому что в ячейке может быть длинный текст, соответственно приходится проверять до 10 столбцов, а с телефонами это вообще не сработает.
Судя по тому, что мне не удалось найти такого решения, задача не простая, но не теряю надежды...) Заранее спасибо!
Для вашего случая оптимально - макросом с применением RegExp. По RegExp я не спец, может придет кто-нибудь умный, напишет (ikki, например ) Только единственное, что нужно - предусмотреть все возможные маски телефонных номеров
Function Email(iCell As String)
With CreateObject("vbscript.regexp")
.Pattern = "[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}"
.Global = True
.IgnoreCase = True
If .test(iCell) Then
Email = .Execute(iCell)(0).Value
Else
Email = "Нет в строке электронного адреса"
End If
End With
End Function
а еще вопрос: можно ли теоретически сделать так, чтобы данные из ячейки не просто дублировались в соседний столбец, а вырезались из ячейки? или это я уже фантазирую?
используйте RE (регулярное выражение) от Kuzmich пример кода от ikki
Код
Function ikki$(s$)
Static r As Object: If r Is Nothing Then Set r = CreateObject("vbscript.regexp"):
r.Global = 1: r.IgnoreCase = True
r.Pattern = "[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}"
ikki = r.Replace(s, "")
End Function
Sub t(): For Each s In [b3:b5].Cells: s.Value = ikki(s.Value): Next: End Sub
- для вывода в любую соседнюю ячейку (обрезанного текста) - использовать функцию - для вывода в те же ячейки (изменённый текст) - запускать процедуру sub p.s. убрала дефис в 5- строке...
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi, , я Вам очень благодарна за помощь, но честно говоря, не очень понимаю, что мне нужно сейчас сделать... добавить Ваш код к тому, что предложил Kuzmich,?..
Наверное, глупый вопрос, но я вообще не разбираюсь в этом...
это "регулярное выражение" - то, что в кавычках - то, что предложил Kuzmich - его, чуть изменив код, можно заставить вырезать (см пример)... а используя первоначальный код от Kuzmich - чтобы искать это выражение и оставлять только этот паттерн - строку с sub (с указанием нужных ячеек) добавить придётся - чтобы сначала запустить 1-ю функцию, как макрос - чтобы сначала достать эмэйлы... потом можно запускать код, вложенный мной - чтобы стереть их из ячеек источника... p.s. делайте по примеру... (у меня проблемы с клавиатурой)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Sub tt()
With CreateObject("VBScript.RegExp")
.Global = True
.IgnoreCase = True
For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row
.Pattern = "\w+.@\w+.\w+\.\w{2,4}"
Cells(i, 3).Value = .Execute(Cells(i, 2).Value).Item(0)
.Pattern = "[\d+-]+"
With .Execute(Cells(i, 2).Value)
Cells(i, 4).Value = .Item(0)
If .Count > 1 Then Cells(i, 5).Value = .Item(1)
End With
Next i
End With
End Sub
Function GorTel(iCell As String)
With CreateObject("vbscript.regexp")
.Pattern = "\d{3}-\d{3}-\d{2}(-|)\d{2}"
.Global = True
.IgnoreCase = True
If .test(iCell) Then
GorTel = .Execute(iCell)(0).Value
Else
GorTel = "Нет в строке городского телефона"
End If
End With
End Function
Всем большое-пребольшое спасибо, лучи добра и вообще! Пока не очень поняла, что куда и как, но на примере все работает, супер!!! офисный планктон ликует
asjanechka, переносит в соседние столбцы почту и телефоны. Но можно переделать, чтобы вырезало
Код
Sub tt()
On Error Resume Next
With CreateObject("VBScript.RegExp")
.Global = True
.IgnoreCase = True
For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row
.Pattern = "\w+.@\w+.\w+\.\w{2,4}"
Cells(i, 3).Value = .Execute(Cells(i, 2).Value).Item(0)
.Pattern = "[\d+-]+"
With .Execute(Cells(i, 2).Value)
Cells(i, 4).Value = .Item(0)
If .Count > 1 Then Cells(i, 5).Value = .Item(1)
End With
Cells(i, 2) = Application.WorksheetFunction.Trim( _
Replace(Replace(Replace(Replace(Cells(i, 2), Cells(i, 3), ""), Cells(i, 4), ""), "äîá.", ""), Cells(i, 5), ""))
Next i
End With
End Sub
МВТ, да, проверила, работает! хоть и не везде четко, но все равно это уже очень большая помощь. и еще, небльшое уточнение. Правильно ли я понимаю, что эта штука работает, только если контакты записаны в столбце В, и разносит их на соседние C,D,E?
Огромная благодарность от меня и многих клерков, которых я не знаю, но уверена, они зайдут сюда и воспользуются...)
МВТ, в реальном примере нужно из ячейки D вставить в E, F. Но это не столь существенно, т.к. в других файлах может быть иначе, и нет смысла под каждый затачивать, наверное, можно и на отдельном листе все это провернуть...) и насколько я поняла из комента JayBhagavan, мне надо в коде изменить циферки после cells на те номера столбцов, куда мне надо вырезать, верно?
Меня больше смущает то, что не всегда верно распознаются эл. адреса и телефоны (например,из ivan.petrov@mail.ru берет только petrov@mail.ru или из gg1234-bb@mail.ru берет bb@mail.ru, а цифери вообще как телефон распознает, или в случае с телефонами почему-то в некоторых случаях выдирает по одной цифре из кода, а остальное оставляет ), но понимаю, что сложно предугадать все нюансы, это уже вручную сделаю)
asjanechka написал: Меня больше смущает то, что не всегда верно распознаются эл. адреса и телефоны (например,из ivan.petrov@mail.ru берет только petrov@mail.ru или из gg1234-bb@mail.ru берет bb@mail.ru
достаточно чуть дополнить первый шаблон в коде МВТ:
Код
.Pattern = "[\w.-]+.@\w+.\w+\.\w{2,4}"
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
и выкладывайте примеры тех вариантов, где макрос сработал не совсем желаемым образом гарантировать ничего нельзя, но, возможно, что-то получится подправить.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
email'ы: не распознал blabla.xx@bk.ru, хотя с аналогичными (с точкой посередине) справлялся. Может, дело в bk?..
с телефонами косяки из-за пробела, например, из номера 7 495 2223344 в первый столбец берет 7, а во второй 495. Но это уж вряд ли исправишь, иначе наверное вообще все в кучу будет мешать...
пока вроде все, что нашла, в остальном все получается