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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2011, 16:27   #1
Hoochara
Пользователь
 
Регистрация: 02.08.2011
Сообщений: 42
По умолчанию Сравнение двух массивов с переносом данных

Добрый день уважаемые программисты.
Помогите пожалуйсто написать макрос на сравнение двух листов таблицы с переносом данных.

Нужно взять значения из листа ost первого столбца и сравнить с первым столбцом листа sell, если значения одинаковые то проставить в ost в 8 и 9 столбец данные из sell

Я написал макрос с формулой впр, но так как в файле около 80 000 строк, макрос делается около 2 часов или просто зависает эксель. Сказали что тут нужна работа с массивами.

Заранее спасибо.

Во вложении фаил с моим макросом и второй фаил с полным файлом без макросов.
Вложения
Тип файла: rar stores_macro.rar (560.2 Кб, 19 просмотров)
Тип файла: rar stores_full.rar (871.6 Кб, 22 просмотров)
Hoochara вне форума Ответить с цитированием
Старый 24.08.2011, 17:17   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Да, нужно код писать на словаре/коллекции и массивах...
Запустил свой код
http://www.excelworld.ru/index/comparefiles_find/0-25
или
http://hugo.nxt.ru/CompareFiles.Find.rar

Работает, но ждать надоело, где-то тоже на час вероятно... Сделал 38% минут за 15-20.
Если интересно - настройки были такие:

Файл - приёмник: C:\tmp\Hoochara\stores_full.xls
Файл - источник: C:\tmp\Hoochara\stores_full.xls
Столбцы сравнения в приёмнике: E,F,D,C,B
Столбцы сравнения в источнике: F,G,D,C,B
Лист - приёмник (№): 5
Лист - источник (№): 4
Столбцы - приёмники данных копирования: h,i
Столбцы - источники данных копирования: h,i

Но это 58000х14000 строк, на большем объёме будет соотвестственно дольше...

P.S. "значения из листа ost первого столбца" - тут что-то не того, я сравнивал все столбцы почти со всеми, по настройкам видно
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 24.08.2011, 17:30   #3
Hoochara
Пользователь
 
Регистрация: 02.08.2011
Сообщений: 42
По умолчанию

мне ведь код нужен а не посчитать 1 раз =/
А так спасибо =)
Hoochara вне форума Ответить с цитированием
Старый 24.08.2011, 17:42   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну тем кодом можно 15 раз посчитать... А если купить - то бесконечно. Но под эту задачу медленноват
Но зато никому ничего писать не нужно.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 24.08.2011, 17:44   #5
EugeneS
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 472
По умолчанию

см. вложение
Вложения
Тип файла: rar stores_full.rar (1.05 Мб, 72 просмотров)
EugeneS вне форума Ответить с цитированием
Старый 24.08.2011, 18:00   #6
Hoochara
Пользователь
 
Регистрация: 02.08.2011
Сообщений: 42
По умолчанию

Евгеничь, супер. Но только мог бы подправить так чтоб 7 и 3 столбец Сцеплялись в обоих листах и данные уже вставлялись по этим значениям?

Просто я пока в том что ты написал не разберусь, что и как вставляется. Тоесть у меня данные должны сравниваться одновременно 7 и 3 колонка в одно и в другом листе

Последний раз редактировалось Hoochara; 24.08.2011 в 18:04. Причина: не дописал всё до конца
Hoochara вне форума Ответить с цитированием
Старый 24.08.2011, 20:21   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну вот, теперь можно и погоняться

Код:
Sub testDic()
    Dim t!: t = Timer

    Dim sell As Worksheet, ost As Worksheet, x, y, z, i&, temp$

    Set sell = Sheets("sell")
    Set ost = Sheets("ost")

    With sell
        x = .Range(.Range("b2"), .Cells(Rows.Count, "b").End(xlUp).Offset(, 7)).Value
    End With

    With ost
        y = .Range(.Range("b2"), .Cells(Rows.Count, "b").End(xlUp).Offset(, 7)).Value
        ReDim z(1 To UBound(y), 1 To 2)

        With CreateObject("Scripting.dictionary")
            .CompareMode = 1    'TextCompare

            For i = 1 To UBound(x)
                temp = x(i, 6) & x(i, 2)
                .Item(temp) = i
            Next

            For i = 1 To UBound(y)

                temp = y(i, 5) & y(i, 2)
                If .exists(temp) Then
                    z(i, 1) = x(.Item(temp), 7)
                    z(i, 2) = x(.Item(temp), 8)
                End If

            Next
            
        End With

        .[h2].Resize(UBound(z), 2) = z

    End With

    Debug.Print "Dictionary: " & Timer - t

End Sub
Результаты (по 6 наименьших):

Dictionary: 1,625
Dictionary: 1,59375
Dictionary: 1,578125
Dictionary: 1,453125
Dictionary: 1,4375
Dictionary: 1,265625
Collection: 2,296875
Collection: 2,1875
Collection: 2,109375
Collection: 2,0625
Collection: 1,78125
Collection: 1,625

В общем, ноздря в ноздрю, но словарь быстрее. А я думал, что будет наоборот.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 24.08.2011, 21:47   #8
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Я тоже думал... Интересно. Мало, что словарь дает больше возможностей и с ним работать легче, он еще и шустрей. Спасибо, Игорь. Самому бы лень было:-)
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 24.08.2011, 22:23   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Сергей, у тебя тоже быстрее, или мне поверил?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 24.08.2011, 23:59   #10
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

А с чего я должен тебе не верить? Тем более, что ты на дровах проверяешь, а на моей тачке и медленные дела не тормозят. На старую сейчас БП ремонтирую(не спеша, не горит:-)). И вообще. Мы не первый день вместе, так что верю-не верю тут неуместно.
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение данных из двух книг derlysh Microsoft Office Excel 13 21.07.2011 16:12
Сравнение двух массивов Рик Общие вопросы Delphi 3 07.04.2011 15:53
Сравнение данных из двух книг и добавление строк Soul Leka Microsoft Office Excel 37 19.07.2010 14:36
сравнение данных в двух столбцах в Excel 2003 grinders Microsoft Office Excel 4 25.11.2008 16:58
Сравнение данных из двух книг Excel 2003 ast1r Microsoft Office Excel 2 24.11.2008 21:39