Excel вытащить номер телефона

 

prsserg

Пользователь

Сообщений: 9
Регистрация: 22.07.2019

За пару лет работы собралось несколько больших  xls файлов. В каждом из них несколько листов. На листах  среди текста в первом столбце есть номера телефонов записанные по одинаковому шаблону «ТЕКСТ (ххх)ххх-хх-хх  ТЕКСТ».
Нужно их вытянуть в виде списка или в текстовый файл или на отдельный лист экселя.
Поковырял макросы из подобных тем, так и не смог под свои задачи адаптировать :).
Хэлп плииииз!

p.s. Образец одного листика прикрепил

 

Пытливый

Пользователь

Сообщений: 4586
Регистрация: 22.12.2012

Вам только номера телефонов нужны? Без персоналий?

Кому решение нужно — тот пример и рисует.

 

prsserg

Пользователь

Сообщений: 9
Регистрация: 22.07.2019

Да, нужно только создать базу телефонов  

 

Ivan.kh

Пользователь

Сообщений: 2024
Регистрация: 04.03.2013

=ЕСЛИОШИБКА(ПСТР(A15;НАЙТИ(«(«;A15);99);P14) в P15 и протянуть вниз, если не нужно дублирование номера, то P14 заменить на «»

Изменено: Ivan.kh22.07.2019 18:03:29

 

в ячейку А15:
< =ПСТР(A15;НАЙТИ(«(«;A15);14) >

 

prsserg

Пользователь

Сообщений: 9
Регистрация: 22.07.2019

пишет в этой ячейке такой результат
#ИМЯ?

 

prsserg

Пользователь

Сообщений: 9
Регистрация: 22.07.2019

Настя_Nastya , в А15 не могу написать — там текст же который надо обрабатывать, написал тоже в Р15, протянул вниз результат такого типа
(067)123-34-56
#ЗНАЧ!
#ЗНАЧ!
#ЗНАЧ!
#ЗНАЧ!
#ЗНАЧ!
(050)965-77-50
#ЗНАЧ!

, а как с мусором быть?
И я так понимаю еще загвоздка в том что если в тексте будет встречаться открытие  скобки, то оттуда тоже будет браться 14 символов. Хотелось бы именно соблюдения шаблона (ххх)ххх-хх-хх

Изменено: prsserg22.07.2019 19:11:51

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Если ячейки с номерами всегда в таком формате, то см. вариант.
Обрабатываются листы с первого по предпоследний.  

 

prsserg

Пользователь

Сообщений: 9
Регистрация: 22.07.2019

Спасибо, работает, но не на всех листах — некоторые чемто не нравятся, выдает ошибку.
А можно его модифицировать чтоб он  в таком виде лист обрабатывал, к которому я могу все листы привести, вот такой вот:

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Никакой ошибки нет: изначально данные на листах начинались со строки №15, а в последнем файле с первой строки — есть разница? Поменяйте в макросе номер строки, с которой цикл начинает перебор.
И ещё один момент: сейчас отталкиваемся от первой скобки, что может привести к ошибке. Поменяйте маску на такую:
like «*(###)###-##-##*»

 

prsserg

Пользователь

Сообщений: 9
Регистрация: 22.07.2019

Хоть убейте не могу понять обо что спотыкается :) Вот такой кусочек листа ему подсовываю, ругается Run-time error (9)
Ну и поменять маску это совсем круто — строку 15 на 1 поменял .
Вернее вижу что там в скрытом есть текст со скобочками)
p.s. маску вписал, но на этом листе все равно спотыкается

Изменено: prsserg22.07.2019 20:05:22

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

А чего тут понимать? — не во всех строках с номером имеется имеется Фамилия, Имя, Отчество. Посмотрите строку 71 на первом листе. Ну и ниже тоже есть — строка 274. Макрос отсчитывает три пробела и берёт оставшееся значение. Или приведите все данные к единому формату или нужно менять алгоритм.

 

prsserg

Пользователь

Сообщений: 9
Регистрация: 22.07.2019

теперь понял. к единому формату не получится —  нужно чтоб оно именно на маску ориентировалось, ну хотя бы на скобочки вокруг кода оператора (ххх)…

 

prsserg

Пользователь

Сообщений: 9
Регистрация: 22.07.2019

Премного благодарен!! Все работает! Если объясните 2 слова по какому принципу теперь алгоритм определяет то еще и буду понимать что происходит :)

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Сейчас оставляем всё, что после первой открывающей скобки и эту скобку добавляем в начало текста. А раньше забирали всё, что после третьего пробела.
Ну и маска поменялась под телефонный стандарт.

 

prsserg

Пользователь

Сообщений: 9
Регистрация: 22.07.2019

#17

22.07.2019 20:30:57

Еще раз спасибо.  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Option Explicit
 
Dim FileInXl, RBegin, FileIn, MyBook, MySheet
Dim i, Li, Ui, jFrom, jOut
Dim RNum, RPhone
Dim WS
 
With WScript.Arguments
    If .Count > 0 Then
        FileInXl = .Item(0)
    Else
        MsgBox "Скрипт запущен без имени файла в аргументе" + vbCrLf + vbCrLf + "Не выполняем", 16
        WScript.Quit 2
    End If
End With
 
RNum = Array("A2", "H2")            'Первые ячейки с порядковыми номерами в обрабатываемой книге
RPhone = Array("F2", "M2")          'Первые ячейки с номером телефона в обрабатываемой книге
RBegin = "A1"                       'Первая ячейка, куда в рабочей книге поместим выбранный номер телефона
 
' FileInXl = "D:Мой контентЗагрузки5 Копия ГТО № 234 (МАЙ).xlsx"
 
If MsgBox("Начинаем обработку" + vbCrLf + vbCrLf + FileInXl + vbCrLf + vbCrLf + "Дождитесь сообщения об окончании", 65) = 2 Then WScript.Quit 2
 
With CreateObject("Excel.Application")
    .Visible = True  ' False
    .Workbooks.Add
    MyBook = .ActiveWorkbook.Name
    MySheet = .ActiveSheet.Name
    
    .Workbooks(MyBook).Sheets(MySheet).Columns(.Range(RBegin).Column).ClearContents
    .Workbooks.Open (FileInXl)
    
    FileIn = .Application.ActiveWorkbook.Name
    
    Li = LBound(RNum)
    Ui = UBound(RNum)
    
    jOut = 0
    
    For Each WS In .Workbooks(FileIn).Worksheets
        For i = Li To Ui
            jFrom = 0
            Do While Trim(WS.Range(RNum(i)).Offset(jFrom, 0)) <> ""
                If Trim(WS.Range(RPhone(i)).Offset(jFrom, 0)) <> "" Then
                    .Workbooks(MyBook).Worksheets(MySheet).Range(RBegin).Offset(jOut, 0) = CStr(WS.Range(RPhone(i)).Offset(jFrom, 0))
                    jOut = jOut + 1
                End If
                jFrom = jFrom + 1
            Loop
        Next
    Next
    .Workbooks(FileIn).Close
    
    With .Workbooks(MyBook).Worksheets(MySheet)
        .Columns(.Range(RBegin).Column).NumberFormat = "0"
        .Sort.SortFields.Clear
        
         .Sort.SortFields.Add .Range(RBegin + ":" + .Range(RBegin).Offset(jOut - 1, 0).Address), 0, 1, 0
        .Sort.SetRange .Range(RBegin + ":" + .Range(RBegin).Offset(jOut - 1, 0).Address)
        With .Sort
            .Header = 0
            .MatchCase = False
            .Orientation = 1
            .SortMethod = 1
            .Apply
        End With
        
        i = 1
        Do While Trim(.Range(RBegin).Offset(i, 0)) <> ""
            If .Range(RBegin).Offset(i, 0) = .Range(RBegin).Offset(i - 1, 0) Then
                .Range(RBegin).Offset(i, 0).Delete -4162
            Else
                i = i + 1
            End If
        Loop
    End With
End With
MsgBox "Обработка завершена", 65

Maxim Yenaleyv: …автозаменой. Можно заменить *+7 ( на +7

Еще проще, без доп. столбца с формулой.

  1. Левую часть отсекаем, как и написано, автозаменой.

  2. Выделяем диапазон, вкладка Данные-Текст_по_столбцам-Фиксированной_ширины-Далее-(задать ширину 18 символов)-Далее-(указать, с какой ячейки начать вставку)-Готово. Правая часть перенесена в отдельный столбец, его можно удалить.

‘—————————-

Чтобы не искажать исходные данные, для поиска создать шаблон, применяя подстановочные знаки: знак вопроса(?) — один любой символ, или звездочку (*) — любые символы в количестве >=0

=ПСТР(A1;ПОИСК("+7 (???) ??? ?? ??";A1);18)

Шаблон можно сократить, если есть уверенность в том, что сокращенный не будет подходить к другим фрагментам текста. Вполне может оказаться достаточным «+7 (???)».

Шаблон можно оперативно менять, если записать его в в отдельную ячейку, в формуле поставить ссылку.

Если обрабатывается диапазон ячеек, в текстах которых номер телефона может отсутствовать:

=ЕСЛИОШИБКА(ПСТР(A1;ПОИСК("+7 (???)";A1);18);"")

Для Excel-2003:

=ЕСЛИ(ЕЧИСЛО(ПОИСК("+7 (???)";A1));ПСТР(A1;ПОИСК("+7 (???)";A1);18);"")

В ячейках находятся записи вида:

ячейка B1: ГВ — Кондратьев Алексей Васильевич, приемная 55-30-23, зам по АХЧ Нина Дмитриевна — 8-905-943-26-28; 55-30-32, дир. Рогожкин Андрей Владимирович, гл.инж. Шляпников Андрей Эдуардович (34391) 2-14-78; 8-902-26-64-095

ячейка B2: Директор — Эдуард Александрович, гл инж,  т/ф (3452)41-93-58 (пр) (3452)41-93-59 (бух). yamal-str@rambler.ru
Николай Владимирович, Татьяна Михайловна Чуваева, Базин Владимир Павлович тф (3412)784803, 785956, ф.510901
т/ф(3852)610240, 611374, 611373, 611401

ячейка B3: Гуревич Константин Вадимович моб. 8-904-895-59-04,  Гуревич Дмитрий Вадимович моб. 8-902-924-14-30, рабочий в Красноярске он же секретаря Василина (3912) 23-86-75, бухгалтер Оксана Валентиновна тел. Раб. Тот же. smskrsn@mail.ru;

ячейка B4: Баунцвейгер Сергей Дмитриевич-зам директора СтроймонтажСервис по строительству 8-913-534-51-65; Евгений Анатольевич-проектировщик-8-904-892-72-74

и так далее.

Вопрос: Как из этой информации вытащить номера телефонов и адреса эл. почты и вывести, ну хотя бы в MsgBox?

Путей к вершине — множество. Этот один из многих!


#1




24.12.2008, 10:31

Последнее редактирование: 24.12.2008, 10:34 от Василий Алибабаевич

Как мыло вытащить я себе примерно представляю, хотя бы в теории, а вот телефон… ://
В мыле есть символ(64) — собака @

Во вложении подробнее, но пришлось подправить Ваш текст — у Вас мыло даже пробелами не отбито, секретаршу, которая это набивала @#$%$#%#@^&&!


Цитата: Василий Алибабаевич от 24.12.2008, 10:31
Во вложении подробнее, но пришлось подправить Ваш текст — у Вас мыло даже пробелами не отбито, секретаршу, которая это набивала @#$%$#%#@^&&!

Спасибо уважаемый Василий Алибабаевич за оперативный отклик! С мылом постараюсь разобратся! А вот по поводу телефона: — мыслю так:

Возможно ли научить машину отбирать текст не по прямому сравнению, например: Коля -> Коля. Т.е. как это делает InStr, а по «маске»: — например: (????) ??-??-?? и тогда можно разложив строку на составляющие в одномерный массив, искать совпадение элемента массивы с «масками». Но вот как научить понимать машину, что под символом скобка и тире должны находится скобка и тире а, под знаком вопроса, любые другие символы — я незнаю! Помогите.

А что касательно секретарши — то их (комерсантов) целый отдел! И их коллективное мнение призвать к ормализации записей …. Проще написать обработчик. С ВАШЕЙ ПОМОЩЬЮ!!! Если позволите!

Добавлено в 17:46: Формулами листа не подходит!!!

Путей к вершине — множество. Этот один из многих!


Добрый день. Мне кажется задача решаема. Непроста, но решаема. Опять же через макросы. Условий выбора придется правда много заложить. Ну например в качестве восприятия того что это телефон могут быть заложена трех-ходовая комбинация при переборе всего текста: например если три рядом стоящих символа состоят из цифры, скобки или «-».Если сегодня будет время подумаю.
Трудно правда будет установить принадлежность телефона абоненту, но это уже другой этап.


До конца не доводил, но где-то так. Во всяком случае через цикл можно заставить вытащить телефоны. Но доводка потребует времени.


Немного доработал, но все равно пока сыро.


Сделал код, но вот массив отрабатывает несовсем удовлетворительно! А почему? — Не знаю! Может кто посмотрит? Буду признателен!

Путей к вершине — множество. Этот один из многих!


Автоматическое разбиение одного столбца с данными на несколько
может подойдёт
см. пример


Извлечь номер телефона из ячейки в отдельный столбец

Viktoriyaonly

Дата: Суббота, 15.08.2015, 20:57 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
40% ±


Excel 2010

Умные люди, помогите пожалуйста))

В произвольной форме написаны контакты клиента (например, 9222234, kerjfgkerfn@ya.ru ), email может быть в любой части текста.
Задача — составить колонку контактов с почтой и телефоном.

С контактами вроде разобралась — нашла формулу более менее подходящую, но с телефоном не получается использовать все выше предложенные варианты, т к при нахождении номера после email формула не отображает значение.

К сообщению приложен файл:

6849447.xlsx
(10.8 Kb)

 

Ответить

Serge_007

Дата: Суббота, 15.08.2015, 21:01 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 15888


Репутация:

2623

±

Замечаний:
±


Excel 2016

Код

=ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;B1;);»,»;)


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Viktoriyaonly

Дата: Суббота, 15.08.2015, 21:27 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
40% ±


Excel 2010

Serge_007, Спасибо огромное!)
а по выборке имейлов может есть что попроще для моего случая? а то длиннющая формула меня пугает)

 

Ответить

Serge_007

Дата: Суббота, 15.08.2015, 21:57 |
Сообщение № 4

Группа: Админы

Ранг: Местный житель

Сообщений: 15888


Репутация:

2623

±

Замечаний:
±


Excel 2016

длиннющая формула меня пугает)

Пусть не пугает. Можно сделать короче, но внешне будет так же страшно :)


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Nic70y

Дата: Воскресенье, 16.08.2015, 09:07 |
Сообщение № 5

Группа: Друзья

Ранг: Экселист

Сообщений: 8132


Репутация:

1998

±

Замечаний:
0% ±


Excel 2010

Код

=ПСТР(A1;(ПОИСК(» «;A1)<ПОИСК(«@»;A1))*ПОИСК(» «;A1)+1;МАКС((ПОИСК(» «;A1)<ПОИСК(«@»;A1))*99;ПОИСК(» «;A1)-2))

на 46 знаков короче :) и без ,


ЮMoney 41001841029809

Сообщение отредактировал Nic70yВоскресенье, 16.08.2015, 09:09

 

Ответить

Serge_007

Дата: Воскресенье, 16.08.2015, 09:11 |
Сообщение № 6

Группа: Админы

Ранг: Местный житель

Сообщений: 15888


Репутация:

2623

±

Замечаний:
±


Excel 2016

Можно сделать короче, но внешне будет так же страшно

Я ж говорил ;)


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

МВТ

Дата: Воскресенье, 16.08.2015, 10:58 |
Сообщение № 7

Группа: Проверенные

Ранг: Обитатель

Сообщений: 476


Репутация:

137

±

Замечаний:
0% ±


Excel 2007

Или так [vba]

Код

Sub tt()
Dim arr
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
arr = Split(Application.WorksheetFunction.Trim(Replace(Cells(i, 1), «,», » «)))
If UBound(arr) > 0 Then
If InStr(arr(0), «@») <> 0 Then
     Cells(i, 2) = arr(0)
     Cells(i, 3) = arr(1)
Else
     Cells(i, 2) = arr(1)
     Cells(i, 3) = arr(0)
End If
End If
Next i
End Sub

[/vba]

 

Ответить

Viktoriyaonly

Дата: Воскресенье, 16.08.2015, 20:47 |
Сообщение № 8

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
40% ±


Excel 2010

Спасибо огромное!)

 

Ответить

Hugo

Дата: Воскресенье, 16.08.2015, 20:49 |
Сообщение № 9

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

По емейлам ведь давно есть решение на регэксп:
[vba]

Код

Function em(s As String)
     Dim v
     Dim EML_PTRN$
     ‘http://www.regular-expressions.info/regexbuddy/email.html
     EML_PTRN = «[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z]{2,4}»

     With CreateObject(«vbscript.regexp»)
         .Pattern = EML_PTRN
         .Global = True
         .IgnoreCase = True
         Set v = .Execute(s)
     End With
     em = v(0).Value
End Function

[/vba]


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Aleksander777

Дата: Понедельник, 26.02.2018, 19:09 |
Сообщение № 10

Группа: Пользователи

Ранг: Участник

Сообщений: 67


Репутация:

10

±

Замечаний:
60% ±


Excel 2016

Всем привет.
Очень нужна помощь.
Нужно сделать как в файле который прикрепил — сборщик эл. почт, а мне нужно чтобы собирал телефонные номера.
На 1 листе база, а на 2-м сборщик телефонов.
Желательно чтобы поиск распространялся на телефоны которые написаны с пробелами, скобками, тире.

Заранее спасибо.

 

Ответить

Che79

Дата: Понедельник, 26.02.2018, 19:18 |
Сообщение № 11

Группа: Друзья

Ранг: Старожил

Сообщений: 1649


Репутация:

306

±

Замечаний:
0% ±


2013 Win, 365 Mac

Aleksander777, и Вам здравствуйте.
Создайте отдельную тему со своим вопросом согласно Правилам форума.
Учитывая, что Вы довольно категорично пишите, то, Вам с большой долей вероятности сюда, хотя, возможно, я и не прав.


Делай нормально и будет нормально!

 

Ответить

Like this post? Please share to your friends:
  • Excel выстраивая список сам
  • Excel выстраивает по убыванию
  • Excel высота ячейки по размеру текста
  • Excel высота ячейки по значению
  • Excel высота ячейки данные