0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 4
|
|
1 | |
Поиск в двух столбцах01.06.2014, 14:58. Показов 3661. Ответов 7
Метки нет (Все метки)
Добрый день.
Задача такая: есть столбец А с номерами (условно) машин на странице Sheet1. Есть столбец B с такими же данными на странице Sheet2. Нужно найти для каждого номера из столбца А соответсвие в столбце В на странице Sheet2, определить строку в столбце В, и сделать с данными из других столбцов в этой строке некоторые действия. В принципе, в столбце В может быть несколько номеров, повторяющих номер из столбца А. А можем не быть ни одного. Я это делаю двумя вложенными циклами. Верхний проходит по строкам столбца А, вложенный для каждой cells из А проверяет весь столбец В. В общем-то, все работает, но я предполагаю, что это же можно сделать с меньшими затратами машинного времени. Или я ошибаюсь?
0
|
01.06.2014, 14:58 | |
Ответы с готовыми решениями:
7
Поиск одинаковых чисел в двух столбцах Поиск .Find по двум полям в двух столбцах Поиск схожих значений в двух столбцах и перенос из первого на другой лист Проверка совпадений в двух столбцах |
6944 / 2849 / 548
Регистрация: 19.10.2012
Сообщений: 8,721
|
|
01.06.2014, 16:18 | 2 |
Можно.
Данные из A в массив, его циклом в словарь. Данные из B в массив, его циклом сверяем с словарём - если есть в словаре, то действуем в строке. Будет значительно быстрее - и чем больше данных, тем больше будет разница скорости обработки.
0
|
0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 4
|
|
01.06.2014, 17:09 [ТС] | 3 |
0
|
6944 / 2849 / 548
Регистрация: 19.10.2012
Сообщений: 8,721
|
|
01.06.2014, 17:26 | 4 |
Сообщение было отмечено wstil как решение
Решение
Ссылки - не по правилам (а на MSDN не знаю).
Но есть пример. Там кода всего 10 строк...
1
|
0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 4
|
|
08.06.2014, 15:50 [ТС] | 5 |
Очень интересный пример, спасибо.
Подскажите, а как можно изменить код, если на Sheet2 в столбце А будут совпадающие значения? То есть будут 2 раза встречаться а2 с разными цифрами, и нужно эти цифры на Sheet3 просуммировать? Я так полагаю, что если встречаются повторящиеся значения в первом столбце на странице2, то a(i, 3) = b(.Item(a(i, 1)), 2) работать как положено не будет?
0
|
6944 / 2849 / 548
Регистрация: 19.10.2012
Сообщений: 8,721
|
||||||
08.06.2014, 16:24 | 6 | |||||
В примере в файле сперва в словаре запоминается номер строки (массива) уникальных значений второго листа, затем при цикле по массиву первого листа эти значения подтягиваются. Но т.к. запоминается только один номер - то суммирование там не получится. Но зато из этой строки можно подтянуть хоть 1000 значений.
Если нужно суммировать одну позицию - можно сразу сумму собирать в словаре, затем из словаря и подставлять:
Если нужно - попробуйте самостоятельно, в этих двух примерах всё необходимое кажется есть.
1
|
0 / 0 / 0
Регистрация: 01.06.2014
Сообщений: 4
|
||||||
09.06.2014, 12:22 [ТС] | 7 | |||||
Я тут посидел на выходных, поразмышлял, и так и не придумал, как можно применить словарь к своей задаче.
Алгоритм у меня в конкретной задаче такой: 1. Берется страница Sheet(1401_1402) с данными, загоняется полностью в массив а() (14 столбцов) 2. Берем массив b(), и перегоняем циклом данные из 2-х нужных столбцов в этот массив, при это обрабатывая данные из одного из столбцов (в столбце идентификаторы, у каких-то мы отрезаем лишние цифры (P.26004.09.658.11 -> P.26004), у каких-то отрезаем первые четыре символа. 3. В третий массив с() перегоняем вложенным циклом эти два столбца из массива b(), но уже суммируя строки с одинаковыми идентификаторами (были, скажем, 2 разных идентификатора P.26004.09.658.11 и P.26004.12.758.51, а стал один P.26004). 4. Потом уже берем данным из соответствующего столбца страницы Sheet(CER), сравниваем вложенным циклом каждый идентификатор из этого столбца [они тут уже приведенные к тому виду, который был получен при переводе b()->c()] с идентификаторами в массиве c(), и прописываем идентификатору соответствующую сумму. Иногда на изначальной странице идентификаторы разбросаны по нескольким столбцам, и приходится при перегоне из массива а() в массив b() делать что-то вроде if a(i,10)<>Empty then ... else if a(i,11)<> empty then ... ну и т.д. Можно упростить решение такой задачи с помощью словарей? Код выглядит так: Кликните здесь для просмотра всего текста
З.Ы. Во вложении файл с примером, если нужно.
0
|
6944 / 2849 / 548
Регистрация: 19.10.2012
Сообщений: 8,721
|
||||||
09.06.2014, 13:28 | 8 | |||||
Не понял зачем там третий лист - из описания не понятно, а в код не вникал, больно много всего...
Исходя из описания простой алгоритм на словаре такой: 1. Данные из CER_status в массив, его перебором в словарь - запоминаем позицию каждого уникального (строку). Т.е. ключ=1CR181100102, Item=3. 2. Создаём пустой массив для результата (аналогичный по высоте). 3. Данные двух столбцов листа 1401_1402 в два массива. 4. Цикл по массиву из 14-го столбца, получаем из данных ключ словаря (Вашим хитрым алгоритмом), проверяем его наличие в словаре - если есть, то из словаря берём номер строки массива, в нём собираем сумму (к тому что там есть прибавляем значение массива из 8-го столбца). 5. выгружаем собранное. Если нужно добавить к тому, что уже есть на листе - то массив не создаём, а берём с листа с тем, что там уже есть. Добавлено через 20 минут Вот например так (но в примере совпадений нет - я создал искусственно):
0
|
09.06.2014, 13:28 | |
09.06.2014, 13:28 | |
Помогаю со студенческими работами здесь
8
Сравнение значений в двух столбцах Удаление совпадающих записей в двух столбцах Макрос для сравнения данных в двух столбцах, вместо vlookup Поиск и сравнение значений в столбцах по двум параметрам Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |