Есть БД (контакты) со смешанными цифрами и текстом, с извлечением первого (цифр) разобрался (благодаря форуму), а вот со вторым, ни как не получается. И как удалить лишние знаки препинания (появились в процессе экспорта БД)?
Есть БД (контакты) со смешанными цифрами и текстом, с извлечением первого (цифр) разобрался (благодаря форуму), а вот со вторым, ни как не получается. И как удалить лишние знаки препинания (появились в процессе экспорта БД)?
Sub xx() Dim re As New RegExp, om As Object With re .Pattern = "([a-zа-яё]+)\s*([a-zа-яё]*).*?(\+*\d+)" .Global = True .IgnoreCase = True Set om = .Execute(",Ивано jА,,,,+456546,,,") MsgBox om.Item(0).SubMatches(0) & vbCrLf _ & om.Item(0).SubMatches(1) & vbCrLf _ & om.Item(0).SubMatches(2) End With End Sub
[/vba]
как-то так?.. [vba]
Code
Sub xx() Dim re As New RegExp, om As Object With re .Pattern = "([a-zа-яё]+)\s*([a-zа-яё]*).*?(\+*\d+)" .Global = True .IgnoreCase = True Set om = .Execute(",Ивано jА,,,,+456546,,,") MsgBox om.Item(0).SubMatches(0) & vbCrLf _ & om.Item(0).SubMatches(1) & vbCrLf _ & om.Item(0).SubMatches(2) End With End Sub
Если это макрос, то мне нужно изучать эту возможность программы. Еще не дошел до нее. Спасибо за вариант решения. Возможно ли скинуть в личку всю БД?
Если это макрос, то мне нужно изучать эту возможность программы. Еще не дошел до нее. Спасибо за вариант решения. Возможно ли скинуть в личку всю БД?Jam
Sub xxx() Dim re As Object, om As Object, c As Range, i% Set re = CreateObject("vbscript.regexp") With re .Pattern = "([a-zа-яё]+)\s*([a-zа-яё]*).*?(\+*\d+)" .Global = True .IgnoreCase = True End With For Each c In [a8:a10] Set om = re.Execute(c.Text).Item(0) For i = 0 To 2 c.Offset(, i + 7).NumberFormat = "@" c.Offset(, i + 7).Value = om.SubMatches(i) Next Next End Sub
[/vba] вставляете этот код в стандартный модуль. на листе нажимаете Alt+F8, выбираете макрос ххх в списке, жмете "выполнить"
для вашего файла: [vba]
Code
Sub xxx() Dim re As Object, om As Object, c As Range, i% Set re = CreateObject("vbscript.regexp") With re .Pattern = "([a-zа-яё]+)\s*([a-zа-яё]*).*?(\+*\d+)" .Global = True .IgnoreCase = True End With For Each c In [a8:a10] Set om = re.Execute(c.Text).Item(0) For i = 0 To 2 c.Offset(, i + 7).NumberFormat = "@" c.Offset(, i + 7).Value = om.SubMatches(i) Next Next End Sub
[/vba] вставляете этот код в стандартный модуль. на листе нажимаете Alt+F8, выбираете макрос ххх в списке, жмете "выполнить"ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
чтоб глянуть, возможно ли ее скорректировать. Кстати, возникла новая задача, группы цифр разделяемые одной или несколькими запятыми сортировать в разные ячейки. Возможно ли такое?
чтоб глянуть, возможно ли ее скорректировать. Кстати, возникла новая задача, группы цифр разделяемые одной или несколькими запятыми сортировать в разные ячейки. Возможно ли такое?Jam
вы код скопировали/выполнили? что-то не получается?
просматривать ВСЮ вашу БД "из интереса" у меня желания нет. возможно, у вас не во всех записях такой формат данных. макрос написан с учетом текущей постановки задачи. что там в реале - мне неведомо.
вот уже первый звоночек прозвенел:
Quote (Jam)
Кстати, возникла новая задача... Возможно ли такое?
конкретно на этот вопрос отвечаю - можно. но надо корректировать макрос.
может быть, вам не стоит торопиться? выберите различные варианты. м.б. где-то номера телефонов написаны с пробелами, скобками, дефисами? это всё важно.
вы код скопировали/выполнили? что-то не получается?
просматривать ВСЮ вашу БД "из интереса" у меня желания нет. возможно, у вас не во всех записях такой формат данных. макрос написан с учетом текущей постановки задачи. что там в реале - мне неведомо.
вот уже первый звоночек прозвенел:
Quote (Jam)
Кстати, возникла новая задача... Возможно ли такое?
конкретно на этот вопрос отвечаю - можно. но надо корректировать макрос.
может быть, вам не стоит торопиться? выберите различные варианты. м.б. где-то номера телефонов написаны с пробелами, скобками, дефисами? это всё важно.ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
Сообщение отредактировал ikki - Четверг, 08.11.2012, 23:23
Спасибо, Вы правы. Номера действительно записаны и с запятыми и с кавычками ( от одной, до 10 кавычек) Больше нет ни каких знаков (ни пробелов, ни чего более).
С текстом разобрался, и он откорректирован, осталось отсортировать номера телефонов с обязательным присутствием (где он есть ) знака "+"
Спасибо, Вы правы. Номера действительно записаны и с запятыми и с кавычками ( от одной, до 10 кавычек) Больше нет ни каких знаков (ни пробелов, ни чего более).
37 - это часть имени (должна была остаться в поле "Имя", не получилось отсортировать таким образом) последние цифры тоже телефон! максимальное количество номеров = 4 "отсортировать" - разместить по одному номеру в отдельный столбец (телефон 1, телефон 2, телефон 3, телефон 4) номера телефонов разделены между собой разным количеством запятых, которые в свою очередь взяты в кавычки. (особенность сортировки) 77012423697",,"+77029179800","87009857977",,,,"+77757477466
И да, упустил (в БД несколько тысяч строк), есть и просто разделенные пробелом. 810491624114366 810499241809312 +49924170425
37 - это часть имени (должна была остаться в поле "Имя", не получилось отсортировать таким образом) последние цифры тоже телефон! максимальное количество номеров = 4 "отсортировать" - разместить по одному номеру в отдельный столбец (телефон 1, телефон 2, телефон 3, телефон 4) номера телефонов разделены между собой разным количеством запятых, которые в свою очередь взяты в кавычки. (особенность сортировки) 77012423697",,"+77029179800","87009857977",,,,"+77757477466
И да, упустил (в БД несколько тысяч строк), есть и просто разделенные пробелом. 810491624114366 810499241809312 +49924170425Jam
Сообщение отредактировал Jam - Четверг, 08.11.2012, 23:53
с учетом того, что в "именах" могут быть цифры, а также того, что четыре номера надо куда-то записать, код становится таким:
[vba]
Code
Sub xxx() Dim re As Object, om As Object, c As Range, i% Set re = CreateObject("vbscript.regexp") With re .Pattern = "([a-zа-яё0-9]+)\s*([a-zа-яё0-9]*).*?(\+*\d+).*?(\+*\d+).*?(\+*\d+).*?(\+*\d+)" .Global = True .IgnoreCase = True End With For Each c In [a8:a10] Set om = re.Execute(c.Text).Item(0) For i = 0 To 5 c.Offset(, i + 7).NumberFormat = "@" c.Offset(, i + 7).Value = om.SubMatches(i) Next Next End Sub
[/vba]
вам нужно будет изменить исходный диапазон (сейчас [a8:a10])
ну... если максимум четыре, то можно тупо удлинить регэксп
с учетом того, что в "именах" могут быть цифры, а также того, что четыре номера надо куда-то записать, код становится таким:
[vba]
Code
Sub xxx() Dim re As Object, om As Object, c As Range, i% Set re = CreateObject("vbscript.regexp") With re .Pattern = "([a-zа-яё0-9]+)\s*([a-zа-яё0-9]*).*?(\+*\d+).*?(\+*\d+).*?(\+*\d+).*?(\+*\d+)" .Global = True .IgnoreCase = True End With For Each c In [a8:a10] Set om = re.Execute(c.Text).Item(0) For i = 0 To 5 c.Offset(, i + 7).NumberFormat = "@" c.Offset(, i + 7).Value = om.SubMatches(i) Next Next End Sub
[/vba]
вам нужно будет изменить исходный диапазон (сейчас [a8:a10])ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
Возможно это сможет облегчить задачу? Я отсортировал столбец с текстом (правда двузначные числа так и не смог перенести к ним) и номера отдельно. Если бы было возможно двузначные номера сортировать к тексту, был бы торт.
Возможно это сможет облегчить задачу? Я отсортировал столбец с текстом (правда двузначные числа так и не смог перенести к ним) и номера отдельно. Если бы было возможно двузначные номера сортировать к тексту, был бы торт.Jam
Сообщение отредактировал Jam - Пятница, 09.11.2012, 00:48
Sub xxx() Dim re1 As Object, re2 As Object, om As Object, c As Range, i% Set re1 = CreateObject("vbscript.regexp") Set re2 = CreateObject("vbscript.regexp")
With re1 .Pattern = "([a-zа-яё0-9]+)\s*([a-zа-яё0-9]*)(.*)" .Global = True .IgnoreCase = True End With With re2 .Pattern = "(\+*\d+)" .Global = True .IgnoreCase = True End With
For Each c In [a10:a12] Set om = re1.Execute(c.Text).Item(0) c.Offset(, 10).Resize(, 6).NumberFormat = "@" c.Offset(, 10).Value = om.SubMatches(0) c.Offset(, 11).Value = om.SubMatches(1) Set om = re2.Execute(om.SubMatches(2)) For i = 0 To om.Count - 1 c.Offset(, i + 12).Value = om.Item(i) Next Next End Sub
[/vba]
Quote (ikki)
надо подумать...
пока вот так придумал:
[vba]
Code
Sub xxx() Dim re1 As Object, re2 As Object, om As Object, c As Range, i% Set re1 = CreateObject("vbscript.regexp") Set re2 = CreateObject("vbscript.regexp")
With re1 .Pattern = "([a-zа-яё0-9]+)\s*([a-zа-яё0-9]*)(.*)" .Global = True .IgnoreCase = True End With With re2 .Pattern = "(\+*\d+)" .Global = True .IgnoreCase = True End With
For Each c In [a10:a12] Set om = re1.Execute(c.Text).Item(0) c.Offset(, 10).Resize(, 6).NumberFormat = "@" c.Offset(, 10).Value = om.SubMatches(0) c.Offset(, 11).Value = om.SubMatches(1) Set om = re2.Execute(om.SubMatches(2)) For i = 0 To om.Count - 1 c.Offset(, i + 12).Value = om.Item(i) Next Next End Sub
нет. давайте все то же самое, но в исходном виде? кстати, у вас там в последней строчке последний "номер" не попадает под категорию "+7 или 8, а за ними 10 цифр". и что делать?
Quote (Jam)
К сообщению приложен файл: 7716025.xls(24Kb)
нет. давайте все то же самое, но в исходном виде? кстати, у вас там в последней строчке последний "номер" не попадает под категорию "+7 или 8, а за ними 10 цифр". и что делать?ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki