prsserg Пользователь Сообщений: 9 |
За пару лет работы собралось несколько больших xls файлов. В каждом из них несколько листов. На листах среди текста в первом столбце есть номера телефонов записанные по одинаковому шаблону «ТЕКСТ (ххх)ххх-хх-хх ТЕКСТ». p.s. Образец одного листика прикрепил |
Пытливый Пользователь Сообщений: 4586 |
Вам только номера телефонов нужны? Без персоналий? Кому решение нужно — тот пример и рисует. |
prsserg Пользователь Сообщений: 9 |
Да, нужно только создать базу телефонов |
Ivan.kh Пользователь Сообщений: 2024 |
=ЕСЛИОШИБКА(ПСТР(A15;НАЙТИ(«(«;A15);99);P14) в P15 и протянуть вниз, если не нужно дублирование номера, то P14 заменить на «» Изменено: Ivan.kh — 22.07.2019 18:03:29 |
в ячейку А15: |
|
prsserg Пользователь Сообщений: 9 |
пишет в этой ячейке такой результат |
prsserg Пользователь Сообщений: 9 |
Настя_Nastya , в А15 не могу написать — там текст же который надо обрабатывать, написал тоже в Р15, протянул вниз результат такого типа Изменено: prsserg — 22.07.2019 19:11:51 |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Если ячейки с номерами всегда в таком формате, то см. вариант. |
prsserg Пользователь Сообщений: 9 |
Спасибо, работает, но не на всех листах — некоторые чемто не нравятся, выдает ошибку. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Никакой ошибки нет: изначально данные на листах начинались со строки №15, а в последнем файле с первой строки — есть разница? Поменяйте в макросе номер строки, с которой цикл начинает перебор. |
prsserg Пользователь Сообщений: 9 |
Хоть убейте не могу понять обо что спотыкается Вот такой кусочек листа ему подсовываю, ругается Run-time error (9) Изменено: prsserg — 22.07.2019 20:05:22 |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
А чего тут понимать? — не во всех строках с номером имеется имеется Фамилия, Имя, Отчество. Посмотрите строку 71 на первом листе. Ну и ниже тоже есть — строка 274. Макрос отсчитывает три пробела и берёт оставшееся значение. Или приведите все данные к единому формату или нужно менять алгоритм. |
prsserg Пользователь Сообщений: 9 |
теперь понял. к единому формату не получится — нужно чтоб оно именно на маску ориентировалось, ну хотя бы на скобочки вокруг кода оператора (ххх)… |
prsserg Пользователь Сообщений: 9 |
Премного благодарен!! Все работает! Если объясните 2 слова по какому принципу теперь алгоритм определяет то еще и буду понимать что происходит |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Сейчас оставляем всё, что после первой открывающей скобки и эту скобку добавляем в начало текста. А раньше забирали всё, что после третьего пробела. |
prsserg Пользователь Сообщений: 9 |
#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
Еще проще, без доп. столбца с формулой.
-
Левую часть отсекаем, как и написано, автозаменой.
-
Выделяем диапазон, вкладка Данные-Текст_по_столбцам-Фиксированной_ширины-Далее-(задать ширину 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: Формулами листа не подходит!!!
Путей к вершине — множество. Этот один из многих!
Добрый день. Мне кажется задача решаема. Непроста, но решаема. Опять же через макросы. Условий выбора придется правда много заложить. Ну например в качестве восприятия того что это телефон могут быть заложена трех-ходовая комбинация при переборе всего текста: например если три рядом стоящих символа состоят из цифры, скобки или «-».Если сегодня будет время подумаю.
Трудно правда будет установить принадлежность телефона абоненту, но это уже другой этап.
До конца не доводил, но где-то так. Во всяком случае через цикл можно заставить вытащить телефоны. Но доводка потребует времени.
Немного доработал, но все равно пока сыро.
Сделал код, но вот массив отрабатывает несовсем удовлетворительно! А почему? — Не знаю! Может кто посмотрит? Буду признателен!
Путей к вершине — множество. Этот один из многих!
Автоматическое разбиение одного столбца с данными на несколько
может подойдёт
см. пример
Извлечь номер телефона из ячейки в отдельный столбец |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |