Страницы: 1 2 След.
RSS
Сравнивать столбцы програмно
 
Всем привет!
Возник следующий вопрос - можно ли сделать так, чтоб колонка с адресом, где содержится название города, сравнивалась с базой данных городов и, при наличии совпадения, название города и области подтягивались в соседние ячейки (как в примере)?

Посоветуйте, пожалуйста, алгоритм реализации такого способа.
Спасибо!
 
Заметьте, что "Верхний Тагил" не равен "Верхнии Тагил".
ФМ (город):
Код
=ИНДЕКС($E$7:$E$13;МАКС(СТРОКА($E$7:$E$13)*ЕЧИСЛО(ПОИСК($E$7:$E$13;$C3)))-СТРОКА($E$6))
Область:
Код
=ВПР($A3;$E$7:$F$13;2;0)
Формулы в A3 и B3 соответственно и протянуть вниз.
Изменено: JayBhagavan - 10.07.2014 12:10:13

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Спасибо большое за  ответ!
Меня больше интересует реализация программного заполнения (например, создание макроса, который будет обрабатывать лист), чтобы можно было еще подвязать определенную логику выбора того или иного города из базы городов.
Логика, примерно, такая: берется город из базы городов, проходит весь столбец, если этот город есть в ячейке, то подставляется пара город-область, если нет - идет дальше, потом второй город из списка итд.
Интересно, с помощью какого алгоритма можно реализовать такое?
 
Т.е. фактически нужно разбить столбец С (в таблице "До") на составляющие? Тогда и "база" городов не нужно.
 
Ну по этому примеру сделать легко - сперва базу городов в словарь (через массив), затем цикл по данным в  C (через массив), отрезаем последнее за запятой, если оно есть в словаре - пишем город и область на место (быстрее тоже всё делать через массив).
Но вот думаю что в рабочем файле не всё так гладко... Хотя если что-то не найдётся (как тот же Верхний Тагил) - это можно вручную поискать.
Писать код, или брать город после запятой не годится?
 
Действительно, адрес может быть записан в любом формате - город может стоять где угодно, плюс в названии города может быть ошибка.
Поэтому и хочется реализовать программный метод, куда можно будет вписать определенные правила поиска.
Как я понимаю, необходимо сделать цикл по столбцу с адресом (фактически перебрать его) и каждую ячейку сравнить со словарем городов?
 
Цитата
Podles пишет:
адрес может быть записан в любом формате - город может стоять где угодно, плюс в названии города может быть ошибка.
А вот по этому поводу в Правилах есть такое:
Цитата
Приложите файл(ы) с примером (общим весом не более 100 Кб) в реальной структуре и форматах данных того, что есть сейчас и того, что хотелось бы на выходе.
Кто Вам мешал показать все возможные варианты? Или это должны додумывать помогающие Вам?
А по существующему примеру и база не нужна...
 
Если город где угодно - то проблема...
Тогда нужно искать циклом по всему списку городов, и вот тогда такая штука - есть например город "Ростов", и есть "Ростов-на-Дону", и есть "Ростов на Дону". Если начнёте думать над реализацией - сразу встанет вопрос о том, что сперва искать...
Изменено: Hugo - 10.07.2014 13:02:35
 
Цитата
Hugo пишет: "Ростов", и есть "Ростов-на-Дону"
А есть еще любители которые пишут просто Ростов, а на все вопросы отвечают что работают только с Ростов-на-Дону и смысла писать дальше нет :)
 
На счет последнего, то для решения этой проблемы думаю использовать только уникальные названия из базы городов.
Вообще, идея такая: берется первый город из базы городов, проверяется его наличие  каждой ячейке столбца, если совпадение найдено, в соседних ячейках слева записывается пара город-область и так по всему столбцу, потом берется второе значение из базы городов итд.  
 
Можно и так, но так придётся каждый город искать в каждой ячейке, и как тогда быть с Ростовом? Ну можно конечно дополнительно проверять соседнюю ячейку, но это время...
Лучше наоборот - каждую ячейку проверяем на наличие города из списка. И как только нашли совпадение с "Ростов на Дону" - заканчиваем сверку, берём следующую ячейку.
 
Цитата
Ну можно конечно дополнительно проверять соседнюю ячейку
Hugo, не совсем Вас понял - Вы предлагаете разбить текст с адресом на столбцы?
 
Вариант. Только "Верхнии" нужно исправить на "Верхний"
Код
Sub Macro1()
Dim i As Long, j As Long, Uniq As New Collection, n as Long, Arr()
    Arr = Range(Cells(7, 5), Cells(13, 6)).Value
    For i = 1 To UBound(Arr)
        On Error Resume Next
        Uniq.Add Arr(i, 1), CStr(Arr(i, 1))
    Next
    For i = 1 To Uniq.Count
        For j = 3 To 9
            If UCase(Cells(j, 3)) Like "*" & UCase(Uniq(i)) & "*" Then
                For n = 1 To UBound(Arr)
                    If Arr(n, 1) = Uniq(i) Then
                        Cells(j, 1) = Uniq(i)
                        Cells(j, 2) = Arr(n, 2)
                        Exit For
                    End If
                Next
            End If
        Next
    Next
End Sub

 
 
Нет.
Смотрим Ваш алгоритм "идея такая: берется первый город из базы городов, проверяется его наличие каждой ячейке столбца... потом берется второе значение из базы городов"
Ну вот есть у Вас в ячейке столбца
624160,Какаято обл,Ростов на Дону
Вы поиском нашли совпадение с "Ростов-на-Дону", сделали дело, пошли на следующую ячейку.
Затем берёте город Ростов, снова проверяете столбец... Находите "Ростов-на-Дону" и что делаете? Ну конечно если всегда и всюду оставлять/вставлять эти дефисы, то другое дело, но на практике так не будет.

Если же делать наоборот - то:
1. Города будем перебирать только пока не найдём нужный, что хорошо и экономно (нашли - выходим из цикла).
2. Если нашли совпадение с "Ростов-на-Дону", то до проверки с "Ростов" дело вообще не дойдёт. Если конечно правильно сделать список городов.
 
Цитата
Города будем перебирать только пока не найдём нужный, что хорошо и экономно (нашли - выходим из цикла)
А если необходимо найти все города, которые будут удовлетворять поиску?
 
Зачем? Пример такой необходимости есть?
 
Мой код не подошёл?
 
Юрий,
Я не совсем понял как Ваш код работает.
Можете в двух словах объяснить?
 
Вы не можете его запустить или непонятен алгоритм?
 
Юрий, если делать на словаре, то можно избавиться от цикла For n = 1 To UBound(Arr), сразу из словаря и берём область.
Или же вообще без коллекций и словарей - тупо цикл в цикле по двум массивам. В реальной базе ведь не должно быть повторов как в примере, впрочем они не критичны.
 
Согласен)
 
Юрий,
Не могу запустить.
 
Тогда сложнее)) Код следует скопировать в стандартный (обычный) модуль. Почитать об этом можно ЗДЕСЬ
 
Юрий,
А Вам не сложно еще будет рассказать алгоритм?
 
У меня алгоритм следующий:
1. Забрали в массив базу городов (необязательно: если база небольшая, то можно работать по листу)
2. Выбрали уникальные значения (города)
3. Цикл по этим уникальным.
4. Цикл по таблице с исходными данными.
5. Если город встречается в строке столбца С, то цикл по массиву, пока не найдём совпадение. Нашли - заносим город и область из массива в таблицу, выходим из цикла.
 
Юрий,
У меня есть еще такой вопрос - как можно сделать так, чтоб excel различал где название города, а где название улицы? Например, улица Псковская в городе Тверь. Я могу в Вашем макросе указать признак окончания города, например, что после названия города должен стоять пробел, запятая?
 
Podles, созданная тема не затрагивает улицы. Создавайте новую тему с полным рабочим примером и вопросом, который Вам не удаётся самостоятельно разрешить + Ваши попытки реализации задумки.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Вы хотите все вопросы в одну тему? Низ-зя!
 
Да, Вы правы! :)
Спасибо большое за помощь!
 
Низззяааа!!! :)))

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
Страницы: 1 2 След.
Наверх