Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2015, 08:17   #1
123456678
Пользователь
 
Регистрация: 13.11.2014
Сообщений: 13
По умолчанию Сравнение двух больших массивов

Доброго времени суток, уважаемый форумчане!
Прошу не кидать сразу камнями, возможно данная тема уже поднималась, но с моими кривыми руками так и не смог её найти по средствам поиска.

Столкнулся с проблемой сравнения двух массивов. Имеются две таблицы, одна относительно постоянно (изредка дополняется дополнительными строками), а вторая постоянно обновляется и надо к первой таблице используя столбец идентификатор "подтягивать" значения во вторую.
Пока таблицы были не очень большие пользовался обычным перебором по порядку используя циклы, но когда в таблицах стало более 30 тыс. строк, то это стало слишком долго и не приемлемо.

Примеры к сожалению пока не могу приложить, они не доступны

Так вот, обращаюсь за Вашей помощью. Может кто то сталкивался с подобной задачей и знает как можно её решить? Очень жду Ваших ответов.
123456678 вне форума Ответить с цитированием
Старый 03.07.2015, 08:24   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1. Забираем обе таблицы в массивы.
2. С помощью словаря (коллекции) формируем результирующий массив.
3. Выгружаем результат на лист.
Это существенно (в 10-ки, а то и 100-ни раз) быстрее. Будут конкретные таблицы - будут и конкретные ответы.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 03.07.2015, 10:16   #3
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Цитата:
Сообщение от 123456678 Посмотреть сообщение
надо к первой таблице используя столбец идентификатор "подтягивать" значения во вторую
Непонятно, к какой таблице подтягивать и в какой таблице находится идентификатор
Надо сделать так, чтобы столбец, по которому ведется поиск, был отсортирован. В этом случае можно использовать функцию ПОИСКПОЗ (т.е. WorksheetFunction.Match) с последним аргументом 1 (интервальный просмотр), получается на порядки быстрее.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 03.07.2015, 14:07   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Есть готовое решение, - можете попробовать:
http://excelvba.ru/programmes/Lookup
EducatedFool вне форума Ответить с цитированием
Старый 06.07.2015, 19:59   #5
123456678
Пользователь
 
Регистрация: 13.11.2014
Сообщений: 13
По умолчанию

Уважаемые форумчане! спасибо большое за ответы. пытаюсь решить вопрос с тем, что бы сделать доступными таблицы (убрать из них конфид) и выложить, что бы было проще понять.
Уважаемый Казанский, данный метод достаточно трудоемок и в данном случае не сможет к сожалению помочь. Спасибо за совет.
Уважаемый EducatedFool, возможно и весьма полезный софт, но принести на работу сторонний софт крайне затруднительно и вряд ли служба ИТ разрешит, поэтому к сожалению не подойдет. Спасибо за совет.

Уважаемый SAS888, Ваш вариант показался самым удобным. На счет двух динамичных массивов понятно, на счет выгрузки их на лист вопросов нет. А вот по поводу словаря, не понимаю как его делать. Очень бы помог пример. Возможно есть какие то заготовки, с описанием кода, что бы можно было посмотреть, пощупать? Если нет, то постараюсь все таки сделать таблицы (я надеюсь не обязательно делать большие массивы?) и разместить, что бы Вы (если конечно есть возможность) поделились кодом.
123456678 вне форума Ответить с цитированием
Старый 07.07.2015, 06:29   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Приведите пример двух таблиц из нескольких строк, указав:
1. Из какой таблицы брать значения и в какую добавлять?
2. Куда и какие значения добавлять из идентифицированной строки?
2. Какой столбец является идентификатором?
4. Что делать, если нет совпадения по идентификатору?
5. Могут ли повторяться значения идентификаторов в таблицах? Если могут, то что в этом случае делать?
Это необходимые вопросы для решения Вашей задачи. Возможно, что у Вас есть и дополнительные требования.
Прикрепите файл с данными (кроме Вас никто не знает структуру Ваших таблиц, поэтому, создавать его самостоятельно никто не будет) и подробно опишите задачу, ответив на все вышеперечисленные вопросы.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 07.07.2015, 23:19   #7
123456678
Пользователь
 
Регистрация: 13.11.2014
Сообщений: 13
По умолчанию

Уважаемый SAS888, выкладываю условный пример. В файле 3 листа (не стал бить на 3 книги, вообще в исходном варианте это три разные книги вторая и третья постоянно обновляется). Книга 1 - Это своеобразная база, куда будет все собираться.
Из книги 2 необходимо в первый свободный столбец в книге 1 (в примере это столбец I) подтягивать в нужную строку информацию о "Уровне благонадежности" по идентификатору "ИНН". Из книги 2 будут использоваться не все строки, необходимо только те, которые есть в книге 1. Если случится случай что "ИНН" из книги 1 нет в книге 2, то ячейку в книге один на против не найденного идентификатора просто оставляем пустой.
Периодически будет обновляться информация в книге 1 из книги 3. При этом возможны следующие варианты:
- если по инн найдены совпадения - то необходимо в соответствующую колонку подтягиваем значение колонки "сумма"
- если в книге 1 не найден инн который есть в книге 3, то необходимо в самый низ книги 1 добавить строку, в которой по соответствующим столбцам будут разнесены все значения из книги 3
-если в книге 1 есть инн которого нет в книге 3, то у него устанавливаем значение 0 в поле "сумма"

В книге 2 и в книге 3 исключена возможность повторяющихся ИНН.
Во всех книгах идентификатором является столбец ИНН.
Вроде бы все учел. Отдельно приношу свои извинения что так сбивчиво и не внятно описал суть и благодарю за терпение.
Буду очень благодарен за подробные комментарии к коду, пока очень сложно читать сложный код.
Очень надеюсь на Вашу помощь.
Вложения
Тип файла: zip Пример.zip (12.3 Кб, 8 просмотров)
123456678 вне форума Ответить с цитированием
Старый 08.07.2015, 06:42   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Посмотрите пример во вложении. Откройте файл и запустите макрос "Main".
Комментарии напишу после того, как мы окончательно отладим работу макроса.
Сначала я сделал обработку книги 3 (где могут быть добавлены строки в книгу 1), затем книги 2 (чтобы учесть добавленные строки).
Единственное, что мне не совсем нравится, это то, что при запуске макроса несколько раз подряд, количество столбцов в книге 1 будет увеличиваться. Если так и нужно, то хорошо, но, может быть, Вы придумаете какой-то критерий для добавления столбца, либо его замены (например, по дате).
Проверьте на своих больших файлах. Все ли так, как нужно?

P.S. Если Вы хотите обращаться лично, то используйте либо ЛС, либо мой e-mail. Иначе, Вы "отворачиваете" других помогающих от Вашего вопроса.
Вложения
Тип файла: rar Пример.rar (21.6 Кб, 32 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 10.07.2015, 06:55   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

123456678
См. почту.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение двух массивов bigfootik Microsoft Office Excel 6 20.12.2013 17:55
Сравнение двух массивов(Pascal) Bounty Hunter Помощь студентам 4 19.01.2012 15:58
Сравнение двух массивов с переносом данных Hoochara Microsoft Office Excel 24 29.08.2011 13:04
Направьте в нужное русло. Сравнение двух больших таблиц Excel hijke Microsoft Office Excel 6 05.05.2011 13:24
Сравнение двух массивов Рик Общие вопросы Delphi 3 07.04.2011 15:53