Здравствуйте! Более чем во многом благодаря данному сайту, получился Макрос, который извлекает данные по заданному условию из Листа, используя цикл. Как его изменить, чтобы полученные данные вставлялись на другой Лист не подряд, а в нужную строку (по совпадению номера) Подробнее в примере. Спасибо!
Здравствуйте! Более чем во многом благодаря данному сайту, получился Макрос, который извлекает данные по заданному условию из Листа, используя цикл. Как его изменить, чтобы полученные данные вставлялись на другой Лист не подряд, а в нужную строку (по совпадению номера) Подробнее в примере. Спасибо!pechkin
Спасибо! Думал , что все просто-увы... Посмотрите еще раз, может не совсем понятно объяснил задачу Макрос отлично работает если цифры в столбце А идут попорядку, а нужно именно сравнение двух столбцов по этим числам. Спасибо!
Спасибо! Думал , что все просто-увы... Посмотрите еще раз, может не совсем понятно объяснил задачу Макрос отлично работает если цифры в столбце А идут попорядку, а нужно именно сравнение двух столбцов по этим числам. Спасибо!pechkin
Уважаемый, AlexM! Еще раз благодарю за участие. Макрос с Вашим дополнением уже практически решил задачу. Сортировка перед запуском не вариант. Хотелось бы что-то типа функции Если, но по двум условиям, т.е при совпадении двух указанных критериев выбранная Макросом строка вставляется в указанное условием место на Листе. Пытался сам что-то изобразить но ...
Уважаемый, AlexM! Еще раз благодарю за участие. Макрос с Вашим дополнением уже практически решил задачу. Сортировка перед запуском не вариант. Хотелось бы что-то типа функции Если, но по двум условиям, т.е при совпадении двух указанных критериев выбранная Макросом строка вставляется в указанное условием место на Листе. Пытался сам что-то изобразить но ...pechkin
Нужно сперва в словаре запомнить координаты данных в архиве по номеру и месяцу, затем по этим координатам их разложить по местам в листе Месячный. Быстрее через массив, но если данных как в примере немного, то можно без массива. Да и даже без словаря - но с словарём код короче.
[vba]
Код
Sub tt() Dim a(), b(), i&, t$, d$, x&
With CreateObject("scripting.dictionary"): .comparemode = 1 a = Sheets("АРХИВ").UsedRange.Value For i = 1 To UBound(a): .Item(a(i, 1) & "|" & a(i, 3)) = i: Next b = Sheets("Месячный").UsedRange.Offset(1).Value d = [c1] For i = 1 To UBound(b) t = b(i, 1) & "|" & d If .exists(t) Then x = .Item(t) b(i, 2) = a(x, 1) b(i, 3) = a(x, 2) b(i, 4) = a(x, 13) b(i, 5) = a(x, 19) b(i, 6) = a(x, 25) End If Next End With Sheets("Месячный").UsedRange.Offset(1).Value = b End Sub
[/vba] P.S. Вообще есть в коде одна помарка - массив b нужно в начале иметь пустой. Т.е. определить необходимый размер и создать массив под размер, который и заполнить. Потому что иначе для тех, кого нет в выбранном месяце - останутся старые данные! Или же "бюджетный вариант": если t нет в словаре - очищаем текущую строку массива b.
Нужно сперва в словаре запомнить координаты данных в архиве по номеру и месяцу, затем по этим координатам их разложить по местам в листе Месячный. Быстрее через массив, но если данных как в примере немного, то можно без массива. Да и даже без словаря - но с словарём код короче.
[vba]
Код
Sub tt() Dim a(), b(), i&, t$, d$, x&
With CreateObject("scripting.dictionary"): .comparemode = 1 a = Sheets("АРХИВ").UsedRange.Value For i = 1 To UBound(a): .Item(a(i, 1) & "|" & a(i, 3)) = i: Next b = Sheets("Месячный").UsedRange.Offset(1).Value d = [c1] For i = 1 To UBound(b) t = b(i, 1) & "|" & d If .exists(t) Then x = .Item(t) b(i, 2) = a(x, 1) b(i, 3) = a(x, 2) b(i, 4) = a(x, 13) b(i, 5) = a(x, 19) b(i, 6) = a(x, 25) End If Next End With Sheets("Месячный").UsedRange.Offset(1).Value = b End Sub
[/vba] P.S. Вообще есть в коде одна помарка - массив b нужно в начале иметь пустой. Т.е. определить необходимый размер и создать массив под размер, который и заполнить. Потому что иначе для тех, кого нет в выбранном месяце - останутся старые данные! Или же "бюджетный вариант": если t нет в словаре - очищаем текущую строку массива b.Hugo
Еще раз благодарность Hugo! Ваш код работает достаточно быстро,хотя таблица состоит на сегодня порядка 600 строк и 40 столбцов и будет кол-во строк увеличиваться. Один вопрос что значит в коде знак "|" ? Спасибо!
Еще раз благодарность Hugo! Ваш код работает достаточно быстро,хотя таблица состоит на сегодня порядка 600 строк и 40 столбцов и будет кол-во строк увеличиваться. Один вопрос что значит в коде знак "|" ? Спасибо!pechkin
Ничего такого особенного это не значит. Просто Игорь выбрал этот символ как признак места "склейки" двух значений. В принципе это мог быть любой символ, даже вообще ничего.
Ничего такого особенного это не значит. Просто Игорь выбрал этот символ как признак места "склейки" двух значений. В принципе это мог быть любой символ, даже вообще ничего.Alex_ST
Это я выбрал как редко встречающийся в данных символ, да и визуально хорошо выглядит Вообще в 99% случаев можно склеивать вообще без разделителя, но в 1% есть риск попасть на данные 12 345 и 123 45, а этого нам не нужно
Это я выбрал как редко встречающийся в данных символ, да и визуально хорошо выглядит Вообще в 99% случаев можно склеивать вообще без разделителя, но в 1% есть риск попасть на данные 12 345 и 123 45, а этого нам не нужно Hugo