Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Копирование адреса из текста - Мир MS Excel

Старая форма входа
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Копирование адреса из текста (Макросы/Sub)
Копирование адреса из текста
emkub Дата: Четверг, 17.03.2016, 13:35 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Здравствуйте!
Пишу скорее из спортивного интереса, нежели от острой необходимости :) , т.к. я даже приблизительно не представляю реализацию затеи (читать как "миссия невыполнима").
Есть колонка "L" с текстом. В тексте может содержаться адрес "улица, дом" в разных вариациях. На втором листе ("Улицы") есть полный перечень улиц, благодаря которому, название улицы вытягивается в колонку "К". Макрос тоже в файле.
Вопрос. Реально ли копировать в колонку "К" полный адрес, включая номер дома, а иногда и номер дома с буквой? Интересен любой ответ!
К сообщению приложен файл: 9536938.xlsm (83.6 Kb)
 
Ответить
СообщениеЗдравствуйте!
Пишу скорее из спортивного интереса, нежели от острой необходимости :) , т.к. я даже приблизительно не представляю реализацию затеи (читать как "миссия невыполнима").
Есть колонка "L" с текстом. В тексте может содержаться адрес "улица, дом" в разных вариациях. На втором листе ("Улицы") есть полный перечень улиц, благодаря которому, название улицы вытягивается в колонку "К". Макрос тоже в файле.
Вопрос. Реально ли копировать в колонку "К" полный адрес, включая номер дома, а иногда и номер дома с буквой? Интересен любой ответ!

Автор - emkub
Дата добавления - 17.03.2016 в 13:35
Karataev Дата: Четверг, 17.03.2016, 14:40 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 1334
Репутация: 533 ±
Замечаний: 0% ±

Excel
Можно попытаться сделать полуавтоматический способ. Вы запускаете макрос, появляется диалоговое окно, в котором данные из столбца L из первой ячейки. Вы выделяете адрес, кликаете Далее - выделенные данные копируются в столбец K, а в диалоговое окно подставляются данные из следующей ячейки столбца L. И так далее.


Сообщение отредактировал Karataev - Четверг, 17.03.2016, 14:51
 
Ответить
СообщениеМожно попытаться сделать полуавтоматический способ. Вы запускаете макрос, появляется диалоговое окно, в котором данные из столбца L из первой ячейки. Вы выделяете адрес, кликаете Далее - выделенные данные копируются в столбец K, а в диалоговое окно подставляются данные из следующей ячейки столбца L. И так далее.

Автор - Karataev
Дата добавления - 17.03.2016 в 14:40
emkub Дата: Четверг, 17.03.2016, 14:50 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Закономерность есть. За названием улицы следует или "," или пробел. Если сразу за ними есть цифры - это номер дома, если после цифр, вплотную, одна буква - то она тоже относится к номеру дома.
Другое дело - реализация алгоритма! Это ДА!.... вынос мозга killed
 
Ответить
СообщениеЗакономерность есть. За названием улицы следует или "," или пробел. Если сразу за ними есть цифры - это номер дома, если после цифр, вплотную, одна буква - то она тоже относится к номеру дома.
Другое дело - реализация алгоритма! Это ДА!.... вынос мозга killed

Автор - emkub
Дата добавления - 17.03.2016 в 14:50
emkub Дата: Четверг, 17.03.2016, 15:00 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Или ещё.
Выносить в соседнюю колонку совпадающее название улицы + следующие 6 знаков. Затем, "волшебным образом" обрабатывать те самые 6 знаков...
 
Ответить
СообщениеИли ещё.
Выносить в соседнюю колонку совпадающее название улицы + следующие 6 знаков. Затем, "волшебным образом" обрабатывать те самые 6 знаков...

Автор - emkub
Дата добавления - 17.03.2016 в 15:00
abtextime Дата: Четверг, 17.03.2016, 15:38 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 828
Репутация: 117 ±
Замечаний: 0% ±

Excel 2010
Алгоритм поиска текстового фрагмента "Номер дома/квартиры":
1. Забираем в буфер N символов после улицы
2. Удаляем в нем все небуквенные фрагменты, предшествующие специфическим кускам - по данным примерам индикаторы - это "кв.м", "м2", "-ком". Пояснение: в строке "Вышгородская" удаляем "1-ком" и "51.4м2". В строке "Кольцова" убираем "5, 62 кв.м"
3. Если в оставшихся символах нет чисел - значит не нашли(питерские варианты с литерами можно, конечно, учитывать, но это экзотика). Если есть, ищем последнюю цифру, от нее еще оставляем всё до первого пробела/знака препинания, остальное отбрасываем.

Вообще, тема для очень приличного по сложности макроса.
 
Ответить
СообщениеАлгоритм поиска текстового фрагмента "Номер дома/квартиры":
1. Забираем в буфер N символов после улицы
2. Удаляем в нем все небуквенные фрагменты, предшествующие специфическим кускам - по данным примерам индикаторы - это "кв.м", "м2", "-ком". Пояснение: в строке "Вышгородская" удаляем "1-ком" и "51.4м2". В строке "Кольцова" убираем "5, 62 кв.м"
3. Если в оставшихся символах нет чисел - значит не нашли(питерские варианты с литерами можно, конечно, учитывать, но это экзотика). Если есть, ищем последнюю цифру, от нее еще оставляем всё до первого пробела/знака препинания, остальное отбрасываем.

Вообще, тема для очень приличного по сложности макроса.

Автор - abtextime
Дата добавления - 17.03.2016 в 15:38
emkub Дата: Четверг, 17.03.2016, 18:04 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Кто-нибудь ещё подкинет теоретические варианты решения задачки?
 
Ответить
СообщениеКто-нибудь ещё подкинет теоретические варианты решения задачки?

Автор - emkub
Дата добавления - 17.03.2016 в 18:04
emkub Дата: Пятница, 18.03.2016, 00:27 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Первая часть частично решена. Относительно не сложная формула (=ПСТР(НАЙТИ(ДЛСТР))) выводит в отдельную ячейку заданное количество символов. Думаю "запись макроса" по формуле - дело нехитрое. Остаётся разными "еслями" убрать лишнее и соединить нужные ячейки yes
 
Ответить
СообщениеПервая часть частично решена. Относительно не сложная формула (=ПСТР(НАЙТИ(ДЛСТР))) выводит в отдельную ячейку заданное количество символов. Думаю "запись макроса" по формуле - дело нехитрое. Остаётся разными "еслями" убрать лишнее и соединить нужные ячейки yes

Автор - emkub
Дата добавления - 18.03.2016 в 00:27
Wasilich Дата: Пятница, 18.03.2016, 00:51 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
За названием улицы следует или "," или пробел.
А за другими словами нет ни пробелов ни запятых...?
Не вижу закономерности! Но если не шибко много строк, можно разбить строки по столбцам и кликом выбирать улицу, а уж № дома рядом.
 
Ответить
Сообщение
За названием улицы следует или "," или пробел.
А за другими словами нет ни пробелов ни запятых...?
Не вижу закономерности! Но если не шибко много строк, можно разбить строки по столбцам и кликом выбирать улицу, а уж № дома рядом.

Автор - Wasilich
Дата добавления - 18.03.2016 в 00:51
emkub Дата: Пятница, 18.03.2016, 10:51 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Закономерность: "название улицы" - "запятая и/или пробел" - "номер дома" - "возможная буква дома".
Wasilich, предложенный Вами вариант - не вариант. Строк много, текст может быть весьма объёмным, да и далеко не всегда номер дома вообще присутствует.
Я выше написал формулу, по которой я получаю нужное количество символов сразу за названием улицы. Обрабатывать кусочек из 5-6 символов немного проще, чем текст из 10 предложений :)
От советов по обработке этих 5-6 символов не откажусь!


Сообщение отредактировал emkub - Пятница, 18.03.2016, 11:30
 
Ответить
СообщениеЗакономерность: "название улицы" - "запятая и/или пробел" - "номер дома" - "возможная буква дома".
Wasilich, предложенный Вами вариант - не вариант. Строк много, текст может быть весьма объёмным, да и далеко не всегда номер дома вообще присутствует.
Я выше написал формулу, по которой я получаю нужное количество символов сразу за названием улицы. Обрабатывать кусочек из 5-6 символов немного проще, чем текст из 10 предложений :)
От советов по обработке этих 5-6 символов не откажусь!

Автор - emkub
Дата добавления - 18.03.2016 в 10:51
emkub Дата: Пятница, 18.03.2016, 11:39 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Первое, что приходит в голову - обработка по кодам символов. Все русские буквы имеют коды 224-255, соответственно цифры 48-57.
 
Ответить
СообщениеПервое, что приходит в голову - обработка по кодам символов. Все русские буквы имеют коды 224-255, соответственно цифры 48-57.

Автор - emkub
Дата добавления - 18.03.2016 в 11:39
al-Ex Дата: Пятница, 18.03.2016, 13:03 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
От советов по обработке этих 5-6 символов не откажусь!
по всему судя, Вам сюда: Объект RegExp


Сообщение отредактировал al-Ex - Пятница, 18.03.2016, 13:04
 
Ответить
Сообщение
От советов по обработке этих 5-6 символов не откажусь!
по всему судя, Вам сюда: Объект RegExp

Автор - al-Ex
Дата добавления - 18.03.2016 в 13:03
emkub Дата: Пятница, 18.03.2016, 16:12 | Сообщение № 12
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Любопытно. Почитаю. Есть над чем подумать. Но пока с регулярками не дружу...
 
Ответить
СообщениеЛюбопытно. Почитаю. Есть над чем подумать. Но пока с регулярками не дружу...

Автор - emkub
Дата добавления - 18.03.2016 в 16:12
МВТ Дата: Пятница, 18.03.2016, 16:49 | Сообщение № 13
Группа: Проверенные
Ранг: Обитатель
Сообщений: 476
Репутация: 137 ±
Замечаний: 0% ±

Excel 2007
по всему судя, Вам сюда: Объект RegExp

Если бы у Вас данные соответствовали описания из сообщения #1, можно было бы делать вот такой регуляркой
[vba]
Код
Function tt(Text As String, N As Integer) As String
    'Text адрес, в котором проводится поиск
    'N 1 - для названия улицы, 2 - для номера дома
    Dim obj As Object
    With CreateObject("VBScript.RegExp")
        .IgnoreCase = True
        .Pattern = "(?:ул|пер|пр-т|бульв)\.? ?(.+), ?(\d+-?[а-яё]?)"
        Set obj = .Execute(Text)
        If obj.Count = 0 Then Exit Function
        tt = obj(0).submatches(N - 1)
    End With
End Function
[/vba]
Но у Вас там полный бардак, названия зачастую идут вообще без "преамбулы" и в родительном падеже, после названия улицы может не быть запятой и номера дома, проспект сокращается и пр., и пр-т. Кое что из этого можно попробовать поправить за счет серьезного усложнения патерна, но как обойти первый пункт я не представляю (а с учетом родительного падежа, лаже поиск в списке названий улиц не поможет). Если Вы приложили неправильны пример, приложите другой - посмотрим, подуаем...
 
Ответить
Сообщение
по всему судя, Вам сюда: Объект RegExp

Если бы у Вас данные соответствовали описания из сообщения #1, можно было бы делать вот такой регуляркой
[vba]
Код
Function tt(Text As String, N As Integer) As String
    'Text адрес, в котором проводится поиск
    'N 1 - для названия улицы, 2 - для номера дома
    Dim obj As Object
    With CreateObject("VBScript.RegExp")
        .IgnoreCase = True
        .Pattern = "(?:ул|пер|пр-т|бульв)\.? ?(.+), ?(\d+-?[а-яё]?)"
        Set obj = .Execute(Text)
        If obj.Count = 0 Then Exit Function
        tt = obj(0).submatches(N - 1)
    End With
End Function
[/vba]
Но у Вас там полный бардак, названия зачастую идут вообще без "преамбулы" и в родительном падеже, после названия улицы может не быть запятой и номера дома, проспект сокращается и пр., и пр-т. Кое что из этого можно попробовать поправить за счет серьезного усложнения патерна, но как обойти первый пункт я не представляю (а с учетом родительного падежа, лаже поиск в списке названий улиц не поможет). Если Вы приложили неправильны пример, приложите другой - посмотрим, подуаем...

Автор - МВТ
Дата добавления - 18.03.2016 в 16:49
emkub Дата: Пятница, 18.03.2016, 17:31 | Сообщение № 14
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Нет, пример взят из оригинала, 1 в 1 . Он полностью правильный. Скажу даже больше, в оригинальном файле (а он большой), вариаций ещё больше и к тому же, названия улиц и домов могут находиться в ДВУХ столбцах! Я взял в пример самые распространённые строки и только один столбец, т.к. интересен сам принцип решения.
 
Ответить
СообщениеНет, пример взят из оригинала, 1 в 1 . Он полностью правильный. Скажу даже больше, в оригинальном файле (а он большой), вариаций ещё больше и к тому же, названия улиц и домов могут находиться в ДВУХ столбцах! Я взял в пример самые распространённые строки и только один столбец, т.к. интересен сам принцип решения.

Автор - emkub
Дата добавления - 18.03.2016 в 17:31
abtextime Дата: Пятница, 18.03.2016, 17:41 | Сообщение № 15
Группа: Проверенные
Ранг: Ветеран
Сообщений: 828
Репутация: 117 ±
Замечаний: 0% ±

Excel 2010
Невозможно настроить действительно надежно работающий инструмент на иррегулярных текстовых "ручных" данных. И более того, это методически вредно. Т.к. немногочисленные ошибки, которые неизбежно будут сочиться через такое дырявое сито, опасны именно своей неуловимостью.

А что мешает при вводе объявлений навесит на веб-морду ввода объявления адресную базу? Пусть, клиент если хочет, вводит адрес через нее. И дисклеймер подвесить - любую адресную информацию в теле объявления имеем право похерить, т.к. она не верифицируется при вводе. Иногда проще в консерватории что-то поправить, чем переучивать херовых музыкантов.
 
Ответить
СообщениеНевозможно настроить действительно надежно работающий инструмент на иррегулярных текстовых "ручных" данных. И более того, это методически вредно. Т.к. немногочисленные ошибки, которые неизбежно будут сочиться через такое дырявое сито, опасны именно своей неуловимостью.

А что мешает при вводе объявлений навесит на веб-морду ввода объявления адресную базу? Пусть, клиент если хочет, вводит адрес через нее. И дисклеймер подвесить - любую адресную информацию в теле объявления имеем право похерить, т.к. она не верифицируется при вводе. Иногда проще в консерватории что-то поправить, чем переучивать херовых музыкантов.

Автор - abtextime
Дата добавления - 18.03.2016 в 17:41
emkub Дата: Пятница, 18.03.2016, 18:49 | Сообщение № 16
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Да, согласен, при такой подаче информации, промашки могут быть.
А информация берётся из разных источников, по этому невозможно привести её к общему знаменателю.
Но я УЖЕ уверен, что смогу это сделать!
 
Ответить
СообщениеДа, согласен, при такой подаче информации, промашки могут быть.
А информация берётся из разных источников, по этому невозможно привести её к общему знаменателю.
Но я УЖЕ уверен, что смогу это сделать!

Автор - emkub
Дата добавления - 18.03.2016 в 18:49
emkub Дата: Суббота, 19.03.2016, 15:26 | Сообщение № 17
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Вопрос наверное к MBT. Как раз по части регулярных выражений.
Подскажите, как выполнить удаление ДВУХ символов слева от "/", ДВУХ символов справа от "/" и сам "/"? (пример: 12/21)
 
Ответить
СообщениеВопрос наверное к MBT. Как раз по части регулярных выражений.
Подскажите, как выполнить удаление ДВУХ символов слева от "/", ДВУХ символов справа от "/" и сам "/"? (пример: 12/21)

Автор - emkub
Дата добавления - 19.03.2016 в 15:26
МВТ Дата: Суббота, 19.03.2016, 15:37 | Сообщение № 18
Группа: Проверенные
Ранг: Обитатель
Сообщений: 476
Репутация: 137 ±
Замечаний: 0% ±

Excel 2007
emkub, не совсем понимаю, какое отношение имеет Ваш вопрос к данной теме, но отвечу. Регуляркой так
[vba]
Код
Function tt(text As String)
    With CreateObject("VBScript.Regexp")
        .Pattern = "\d\d/\d\d"
        tt = .Replace(text, "")
    End With
End Function
[/vba]
 
Ответить
Сообщениеemkub, не совсем понимаю, какое отношение имеет Ваш вопрос к данной теме, но отвечу. Регуляркой так
[vba]
Код
Function tt(text As String)
    With CreateObject("VBScript.Regexp")
        .Pattern = "\d\d/\d\d"
        tt = .Replace(text, "")
    End With
End Function
[/vba]

Автор - МВТ
Дата добавления - 19.03.2016 в 15:37
emkub Дата: Суббота, 19.03.2016, 15:59 | Сообщение № 19
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Благодарю за оперативность!
Отношение имеет прямое. Я пошёл таким путём: в отдельную колонку вынес 8 знаков после названия улицы. САМОЕ часто-встречаемое "нарушение" циферной закономерности - указание этажа/этажности через "/". На мой скромный взгляд, первое, что нужно убрать - именно эти цифры. Хотя изредка проскакивает и дробный номер дома, но это относительная редкость и им можно пожертвовать.
Сейчас отсекаю лишние символы.
 
Ответить
СообщениеБлагодарю за оперативность!
Отношение имеет прямое. Я пошёл таким путём: в отдельную колонку вынес 8 знаков после названия улицы. САМОЕ часто-встречаемое "нарушение" циферной закономерности - указание этажа/этажности через "/". На мой скромный взгляд, первое, что нужно убрать - именно эти цифры. Хотя изредка проскакивает и дробный номер дома, но это относительная редкость и им можно пожертвовать.
Сейчас отсекаю лишние символы.

Автор - emkub
Дата добавления - 19.03.2016 в 15:59
StoTisteg Дата: Суббота, 19.03.2016, 18:13 | Сообщение № 20
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
emkub, Вы смотрите в неправильную сторону. Если у Вас юзвери вводят данные ручками, дайте им ДВА поля для ввода — одно адрес, другое — прочая лирика. А уж ввести между ними уникальный разделитель, который юзверь либо не станет вводить (например, ~), либо не сможет из-за трудоёмкости (например, неразрывный пробел или перевод каретки) — вопрос техники.


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
Сообщениеemkub, Вы смотрите в неправильную сторону. Если у Вас юзвери вводят данные ручками, дайте им ДВА поля для ввода — одно адрес, другое — прочая лирика. А уж ввести между ними уникальный разделитель, который юзверь либо не станет вводить (например, ~), либо не сможет из-за трудоёмкости (например, неразрывный пробел или перевод каретки) — вопрос техники.

Автор - StoTisteg
Дата добавления - 19.03.2016 в 18:13
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Копирование адреса из текста (Макросы/Sub)
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!