Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Отсортировать данные по значению на разные листы - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Отсортировать данные по значению на разные листы
ZamoK Дата: Пятница, 25.09.2015, 11:01 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Доброго дня!
Писать коды не мастак, нарыл подобного алгорима код хотел прикрутить к своему файлу но пока не срослось! Буду конечно дальше ковырять, но и так же не буду против если человек грамотный облегчит мои мучения.
Примерный алгоритм работы (как я на данном этапе моих познаний excel его себе представляю) написан внутри файла.
P.S.Загвоздка пока на этапе как обратится к данным на листе Данные. Копирование пока не исправлял.
К сообщению приложен файл: __.xlsm (37.9 Kb)


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеДоброго дня!
Писать коды не мастак, нарыл подобного алгорима код хотел прикрутить к своему файлу но пока не срослось! Буду конечно дальше ковырять, но и так же не буду против если человек грамотный облегчит мои мучения.
Примерный алгоритм работы (как я на данном этапе моих познаний excel его себе представляю) написан внутри файла.
P.S.Загвоздка пока на этапе как обратится к данным на листе Данные. Копирование пока не исправлял.

Автор - ZamoK
Дата добавления - 25.09.2015 в 11:01
Roman777 Дата: Пятница, 25.09.2015, 13:41 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK, не ясно как будет выполняться пункт "7. Затем заполняется лист Материал". отдельный макрос или ручками?
И во всех листах есть поле "количество деталей" оно как должно считаться?


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Пятница, 25.09.2015, 13:42
 
Ответить
СообщениеZamoK, не ясно как будет выполняться пункт "7. Затем заполняется лист Материал". отдельный макрос или ручками?
И во всех листах есть поле "количество деталей" оно как должно считаться?

Автор - Roman777
Дата добавления - 25.09.2015 в 13:41
Roman777 Дата: Пятница, 25.09.2015, 14:47 | Сообщение № 3
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK,

Вообще для заполнения необходимого кол-ва материала, нет нужды вносить лист материал и туда закидывать данные. В макросе это делается единым циклом всё...
К сообщению приложен файл: _2.xlsm (38.8 Kb)


Много чего не знаю!!!!
 
Ответить
СообщениеZamoK,

Вообще для заполнения необходимого кол-ва материала, нет нужды вносить лист материал и туда закидывать данные. В макросе это делается единым циклом всё...

Автор - Roman777
Дата добавления - 25.09.2015 в 14:47
ZamoK Дата: Понедельник, 28.09.2015, 08:58 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Roman777,
И во всех листах есть поле "количество деталей" оно как должно считаться?
Кол-во деталей на всех листах кроме материала, просто копируется с листа Итог, на листе материал, как вы уже догадались нужно умножить на кол-во деталей, вот только вы это сделали не на том листе :D и добавить бы ссумирование строчек с однотипным материалом. И ещё что-то с листом материал не то!!! Лист материал заполняется с листа Механический - там 21 позиция (одну я добавил на листе Итог с одинаковым материалом Круг 8) на листе Материал 16 позиций т.е. не все и ссумированных там тоже нет., как бы тут немного поковырять нада.
туда закидывать данные. В макросе это делается единым циклом
не этого делать нет нужды т.к. там форма определена, только я ошибся когда форму делал столбец Детали и наименование нада местами поменять и отсортировать по Наименованию. А в остальном очень даже неплохо.
Да можно ли исключить позиции на листе материал, которые =0, и при повторном нажатии на кнопку добавить бы очистку листов от заполненных данных, если не сложно
К сообщению приложен файл: 6753924.xlsm (42.1 Kb)


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Понедельник, 28.09.2015, 09:03
 
Ответить
СообщениеRoman777,
И во всех листах есть поле "количество деталей" оно как должно считаться?
Кол-во деталей на всех листах кроме материала, просто копируется с листа Итог, на листе материал, как вы уже догадались нужно умножить на кол-во деталей, вот только вы это сделали не на том листе :D и добавить бы ссумирование строчек с однотипным материалом. И ещё что-то с листом материал не то!!! Лист материал заполняется с листа Механический - там 21 позиция (одну я добавил на листе Итог с одинаковым материалом Круг 8) на листе Материал 16 позиций т.е. не все и ссумированных там тоже нет., как бы тут немного поковырять нада.
туда закидывать данные. В макросе это делается единым циклом
не этого делать нет нужды т.к. там форма определена, только я ошибся когда форму делал столбец Детали и наименование нада местами поменять и отсортировать по Наименованию. А в остальном очень даже неплохо.
Да можно ли исключить позиции на листе материал, которые =0, и при повторном нажатии на кнопку добавить бы очистку листов от заполненных данных, если не сложно

Автор - ZamoK
Дата добавления - 28.09.2015 в 08:58
Roman777 Дата: Понедельник, 28.09.2015, 10:08 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK, Добрый день. Сразу отмечу. Макрос записывает материал из листа "данные" в лист "Материал" только тот, который используется для деталей с листа "Итог". Если у Вас на листе Итог не будут деталей, которые изготавливаются из какого-либо материала, указанного в листе Данные, то данный материал отображаться не будет (это такой получается так сказать "ком" при выполнении данного макроса за единый цикл).
Не понял я что значит
умножить на кол-во деталей, вот только вы это сделали не на том листе
, а на каком нужно было?
и
добавить бы ссумирование строчек с однотипным материалом
в Вашем примере, просто не было вродебы деталей из одного материала на листе Материал.
Детали и наименование нада местами поменять и отсортировать по Наименованию
это на каком листе?
Если будет время, поковыряюсь ещё...)


Много чего не знаю!!!!
 
Ответить
СообщениеZamoK, Добрый день. Сразу отмечу. Макрос записывает материал из листа "данные" в лист "Материал" только тот, который используется для деталей с листа "Итог". Если у Вас на листе Итог не будут деталей, которые изготавливаются из какого-либо материала, указанного в листе Данные, то данный материал отображаться не будет (это такой получается так сказать "ком" при выполнении данного макроса за единый цикл).
Не понял я что значит
умножить на кол-во деталей, вот только вы это сделали не на том листе
, а на каком нужно было?
и
добавить бы ссумирование строчек с однотипным материалом
в Вашем примере, просто не было вродебы деталей из одного материала на листе Материал.
Детали и наименование нада местами поменять и отсортировать по Наименованию
это на каком листе?
Если будет время, поковыряюсь ещё...)

Автор - Roman777
Дата добавления - 28.09.2015 в 10:08
ZamoK Дата: Понедельник, 28.09.2015, 12:25 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Roman777,
получается так сказать "ком"
макрос берёт только первую позицию а остальные? Думаю если это будет отдельный макрос - будет лучше.
на каком нужно было?
На листе Материал нужно взять норму расхода и умножить на потребность детали + норма расхода*потребность детали однотипного материала. Код сложный поэтому я и думаю надо вынести на отдельную кнопку.
Вашем примере, просто не было вродебы деталей из одного материала на листе Материал
в примере обозначил - все какбы есть :(
Детали и наименование нада местами поменять и отсортировать по Наименованию
это на каком листе?
На листе Механический.
будет время, поковыряюсь ещё...
:D :D Работа творческая время здесь не аргумент, да впрочем и основная работа уже сделана, осталось чуть чуть допилить, может и сам допилю если никто не обгонит, хотя я думаю не успею :D :D :D


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеRoman777,
получается так сказать "ком"
макрос берёт только первую позицию а остальные? Думаю если это будет отдельный макрос - будет лучше.
на каком нужно было?
На листе Материал нужно взять норму расхода и умножить на потребность детали + норма расхода*потребность детали однотипного материала. Код сложный поэтому я и думаю надо вынести на отдельную кнопку.
Вашем примере, просто не было вродебы деталей из одного материала на листе Материал
в примере обозначил - все какбы есть :(
Детали и наименование нада местами поменять и отсортировать по Наименованию
это на каком листе?
На листе Механический.
будет время, поковыряюсь ещё...
:D :D Работа творческая время здесь не аргумент, да впрочем и основная работа уже сделана, осталось чуть чуть допилить, может и сам допилю если никто не обгонит, хотя я думаю не успею :D :D :D

Автор - ZamoK
Дата добавления - 28.09.2015 в 12:25
ZamoK Дата: Понедельник, 28.09.2015, 14:35 | Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Попробовал в рабочую книгу вставить - :D
ответа ждал 3,5 минуты, это нормально или как-то можно ускорить процесс хотябы к минуте свести.
P.S. Итог - 200 строк
Данные - около 5000 строк


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеПопробовал в рабочую книгу вставить - :D
ответа ждал 3,5 минуты, это нормально или как-то можно ускорить процесс хотябы к минуте свести.
P.S. Итог - 200 строк
Данные - около 5000 строк

Автор - ZamoK
Дата добавления - 28.09.2015 в 14:35
Roman777 Дата: Понедельник, 28.09.2015, 14:50 | Сообщение № 8
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK, поскольку в макросе идёт копирование областей (Range), то при таком количестве строк, думаю нормально, можно сначала пройтись макросом и записать все данные в массив, тогда, поидее, будет быстрее, но изменений в код надо будет больше вносить))). Может даже проще с самого начала будет переписать))).


Много чего не знаю!!!!
 
Ответить
СообщениеZamoK, поскольку в макросе идёт копирование областей (Range), то при таком количестве строк, думаю нормально, можно сначала пройтись макросом и записать все данные в массив, тогда, поидее, будет быстрее, но изменений в код надо будет больше вносить))). Может даже проще с самого начала будет переписать))).

Автор - Roman777
Дата добавления - 28.09.2015 в 14:50
ZamoK Дата: Понедельник, 28.09.2015, 14:57 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Может даже проще с самого начала будет переписать
Может и да, отключил пересчет на каждый "чих" выиграл наверно секунд 40 :D


Я не Гуру, но стремлюсь!
 
Ответить
Сообщение
Может даже проще с самого начала будет переписать
Может и да, отключил пересчет на каждый "чих" выиграл наверно секунд 40 :D

Автор - ZamoK
Дата добавления - 28.09.2015 в 14:57
Roman777 Дата: Понедельник, 28.09.2015, 15:29 | Сообщение № 10
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK, ещё, я правильно понимаю, что на листе "Материал" должен отображаться материал только для деталей из листа "Механический" и этот материал должен отображаться в количестве "норма"*"кол-во деталей", при этом, для деталей из 1 материала, материалы должны сложиться и отобразиться в 1 строчке (результаты такого расчёта вы хотите увидеть на листе "Материал")?


Много чего не знаю!!!!
 
Ответить
СообщениеZamoK, ещё, я правильно понимаю, что на листе "Материал" должен отображаться материал только для деталей из листа "Механический" и этот материал должен отображаться в количестве "норма"*"кол-во деталей", при этом, для деталей из 1 материала, материалы должны сложиться и отобразиться в 1 строчке (результаты такого расчёта вы хотите увидеть на листе "Материал")?

Автор - Roman777
Дата добавления - 28.09.2015 в 15:29
ZamoK Дата: Понедельник, 28.09.2015, 16:40 | Сообщение № 11
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Roman777, Да можно и из листа Механический главное - там не должно быть строк с 0 значением (Узел, Кооперация, Сборка ...)


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеRoman777, Да можно и из листа Механический главное - там не должно быть строк с 0 значением (Узел, Кооперация, Сборка ...)

Автор - ZamoK
Дата добавления - 28.09.2015 в 16:40
Roman777 Дата: Понедельник, 28.09.2015, 18:06 | Сообщение № 12
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK, Вроде пока так. Тут не перерабатывал для "ускорения", нужно больше времени чем было. Но вродебы логику подправил. А чтобы
Детали и наименование нада местами поменять и отсортировать по Наименованию
выгоднее исправить макрос сначала. Либо придётся после цикла тут добавить перемену столбцов и сортировку...
К сообщению приложен файл: 6753924_.xlsm (46.5 Kb)


Много чего не знаю!!!!
 
Ответить
СообщениеZamoK, Вроде пока так. Тут не перерабатывал для "ускорения", нужно больше времени чем было. Но вродебы логику подправил. А чтобы
Детали и наименование нада местами поменять и отсортировать по Наименованию
выгоднее исправить макрос сначала. Либо придётся после цикла тут добавить перемену столбцов и сортировку...

Автор - Roman777
Дата добавления - 28.09.2015 в 18:06
ZamoK Дата: Вторник, 29.09.2015, 09:51 | Сообщение № 13
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Roman777, Код стал чище это +, но вот на листе материал колво материала суммируется, но не умножается на кол-во деталей из потребности, я тут в заначках нарыл код и немного струганул под свою ситуацию. Очень не плохо вышло положил на кнопочку чтоб было видно где в Вашем коде пробелы. работает он мгновенно - что радует. Ваш код попробовал в оригинальном файле, да чисто стало в результате его работы, но время :( 4 минуты я покурить успел сходить :D :D :D
К сообщению приложен файл: 6753924_22.xlsm (51.0 Kb)


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Вторник, 29.09.2015, 09:52
 
Ответить
СообщениеRoman777, Код стал чище это +, но вот на листе материал колво материала суммируется, но не умножается на кол-во деталей из потребности, я тут в заначках нарыл код и немного струганул под свою ситуацию. Очень не плохо вышло положил на кнопочку чтоб было видно где в Вашем коде пробелы. работает он мгновенно - что радует. Ваш код попробовал в оригинальном файле, да чисто стало в результате его работы, но время :( 4 минуты я покурить успел сходить :D :D :D

Автор - ZamoK
Дата добавления - 29.09.2015 в 09:51
Hugo Дата: Вторник, 29.09.2015, 10:27 | Сообщение № 14
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
В модуле 2 массив создаёте так:
[vba]
Код
dx = Sh.Range("B3:F" & LastRow)
[/vba]
В модуле 1 так:
[vba]
Код
ReDim Detal(i_n)
For i = 3 To i_n
    Detal(i) = Cells(i, 2)
Next i
[/vba]
Зачем? Необходимости в одномерном массиве нет, да если бы и была...


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеВ модуле 2 массив создаёте так:
[vba]
Код
dx = Sh.Range("B3:F" & LastRow)
[/vba]
В модуле 1 так:
[vba]
Код
ReDim Detal(i_n)
For i = 3 To i_n
    Detal(i) = Cells(i, 2)
Next i
[/vba]
Зачем? Необходимости в одномерном массиве нет, да если бы и была...

Автор - Hugo
Дата добавления - 29.09.2015 в 10:27
Roman777 Дата: Вторник, 29.09.2015, 10:30 | Сообщение № 15
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK, ааа, я просто посчитал зачем на листе Материал это делать, если там в 1 позиции может быть несколько деталей с листа "Механический". Ваше дополнение весьма приукрасило).


Много чего не знаю!!!!
 
Ответить
СообщениеZamoK, ааа, я просто посчитал зачем на листе Материал это делать, если там в 1 позиции может быть несколько деталей с листа "Механический". Ваше дополнение весьма приукрасило).

Автор - Roman777
Дата добавления - 29.09.2015 в 10:30
Hugo Дата: Вторник, 29.09.2015, 11:13 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Как вариант быстрого алгоритма для сортировки по листам:
1. набираем словарь номеров с именами листов по данным из "Данные"
2. "Итог" берём в массив, проходим циклом, проверяем номер по словарю - получаем имя листа, который берём в другой словарь, где каждому имени листа собираем коллекцию номеров строк, которые в него будем копировать.
3. цикл уже по словарю имён листов - берём ключ, создаём массив нужного размера (всё уже известно), перекладываем в него данные из исходного масисва, выгружаем на лист.
Вроде всё. Быстро.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеКак вариант быстрого алгоритма для сортировки по листам:
1. набираем словарь номеров с именами листов по данным из "Данные"
2. "Итог" берём в массив, проходим циклом, проверяем номер по словарю - получаем имя листа, который берём в другой словарь, где каждому имени листа собираем коллекцию номеров строк, которые в него будем копировать.
3. цикл уже по словарю имён листов - берём ключ, создаём массив нужного размера (всё уже известно), перекладываем в него данные из исходного масисва, выгружаем на лист.
Вроде всё. Быстро.

Автор - Hugo
Дата добавления - 29.09.2015 в 11:13
ZamoK Дата: Вторник, 29.09.2015, 11:50 | Сообщение № 17
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Hugo,
Вроде всё. Быстро.
Да если учесть что я не айс в написании кода и без помощи знатоков наверняка не справлюсь
Зачем? Необходимости в одномерном массиве нет
я не создавал ни 1 ни 2 модуль, я модуль 2 позаимствовал (автор: doober) и откорректировал, т.к. моих познаний VBA не хватит для такого рода творчества.
Roman777,
Ваше дополнение весьма приукрасило).
ну если появились цифры они должны нести полную информацию, как мне кажется


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Вторник, 29.09.2015, 11:57
 
Ответить
СообщениеHugo,
Вроде всё. Быстро.
Да если учесть что я не айс в написании кода и без помощи знатоков наверняка не справлюсь
Зачем? Необходимости в одномерном массиве нет
я не создавал ни 1 ни 2 модуль, я модуль 2 позаимствовал (автор: doober) и откорректировал, т.к. моих познаний VBA не хватит для такого рода творчества.
Roman777,
Ваше дополнение весьма приукрасило).
ну если появились цифры они должны нести полную информацию, как мне кажется

Автор - ZamoK
Дата добавления - 29.09.2015 в 11:50
ZamoK Дата: Вторник, 29.09.2015, 13:12 | Сообщение № 18
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Hugo,
может как вариант в виде кода? Если конечно не сложно. :)


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеHugo,
может как вариант в виде кода? Если конечно не сложно. :)

Автор - ZamoK
Дата добавления - 29.09.2015 в 13:12
Hugo Дата: Вторник, 29.09.2015, 13:39 | Сообщение № 19
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Сейчас некогда, работы по горло. Может вечером, если интереснее занятие не найду.
Вообще все части такого кода уже были на форуме - работа с словарём и массивами есть уже у Вас во втором модуле, а как в словарь подключить коллекцию я могу показать на таком примере из "загашника":

[vba]
Код
Sub PereborFailov() 'коллекция в словаре
     Dim a, i&, t$, Dic As Object
     Dim el, col
      
     a = Range("C3", Cells(Rows.Count, "A").End(xlUp)).Value
     Set Dic = CreateObject("Scripting.Dictionary")
     With Dic
         .CompareMode = 1
         For i = 1 To UBound(a)
             t = a(i, 1)
             If Not .exists(t) Then .Add t, New Collection
             .Item(t).Add a(i, 2) & "|" & a(i, 3) & "|" & i
         Next
     End With
      
     For Each el In Dic.keys
         Debug.Print "Открываем файл " & el
         For Each col In Dic.Item(el)
             Debug.Print "Ищем данные " & col
         Next
         Debug.Print "Закрываем файл " & el
     Next

End Sub
[/vba]

Но может ещё кто подключится, может что-то на SQL можно придумать...


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеСейчас некогда, работы по горло. Может вечером, если интереснее занятие не найду.
Вообще все части такого кода уже были на форуме - работа с словарём и массивами есть уже у Вас во втором модуле, а как в словарь подключить коллекцию я могу показать на таком примере из "загашника":

[vba]
Код
Sub PereborFailov() 'коллекция в словаре
     Dim a, i&, t$, Dic As Object
     Dim el, col
      
     a = Range("C3", Cells(Rows.Count, "A").End(xlUp)).Value
     Set Dic = CreateObject("Scripting.Dictionary")
     With Dic
         .CompareMode = 1
         For i = 1 To UBound(a)
             t = a(i, 1)
             If Not .exists(t) Then .Add t, New Collection
             .Item(t).Add a(i, 2) & "|" & a(i, 3) & "|" & i
         Next
     End With
      
     For Each el In Dic.keys
         Debug.Print "Открываем файл " & el
         For Each col In Dic.Item(el)
             Debug.Print "Ищем данные " & col
         Next
         Debug.Print "Закрываем файл " & el
     Next

End Sub
[/vba]

Но может ещё кто подключится, может что-то на SQL можно придумать...

Автор - Hugo
Дата добавления - 29.09.2015 в 13:39
Hugo Дата: Вторник, 29.09.2015, 20:45 | Сообщение № 20
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Вот такой полуфабрикат, но рабочий. Полуфабрикат потому, что не понял что там с этими нормами расхода и куда их нужно умножать - код писал для первого примера, где нет примера...
Но задел для норм в коде есть - это третий словарь, там каждому номеру прописан расход, бери и пользуйся (кроме тех, у кого 0)
[vba]
Код
Option Explicit

Sub tt()
      Dim a(), i&, d1 As Object, d2 As Object, d3 As Object, t$, k, kol As Object, el, x&

      Set d1 = CreateObject("scripting.dictionary"): d1.comparemode = 1
      Set d2 = CreateObject("scripting.dictionary"): d2.comparemode = 1
      Set d3 = CreateObject("scripting.dictionary"): d3.comparemode = 1    'норма расхода

      '1. набираем словарь номеров с именами листов по данным из "Данные"   
      a = Sheets("Данные").[a1].CurrentRegion.Columns(1).Resize(, 5).Value
      For i = 2 To UBound(a)
          t = Trim(a(i, 1))
          If a(i, 5) > 0 Then d3.Item(t) = a(i, 5)    'норма расхода
          Select Case Trim(a(i, 3))
          Case "Сборка": d1.Item(t) = "Сборка"
          Case "Покупные": d1.Item(t) = "Покупные"
          Case "Кооперация": d1.Item(t) = "Покупные"
          Case "Крепеж": d1.Item(t) = "Крепёж"
          Case Else: d1.Item(t) = "Механический"
          End Select
      Next

      '2. "Итог" берём в массив, проходим циклом, проверяем номер по словарю - получаем имя листа,
      'который берём в другой словарь, где каждому имени листа собираем коллекцию номеров строк, которые в него будем копировать.   

      a = Sheets("Итог").[a2].CurrentRegion.Columns(1).Resize(, 4).Value
      For i = 2 To UBound(a)
          t = Trim(a(i, 2))
          If d1.exists(t) Then
              If Not d2.exists(d1.Item(t)) Then d2.Add d1.Item(t), New Collection
              d2.Item(d1.Item(t)).Add i
          End If
      Next

      '3. цикл уже по словарю имён листов - берём ключ, создаём массив нужного размера (всё уже известно),
      'перекладываем в него данные из исходного массива, выгружаем на лист.   

      For Each k In d2.keys
          Set kol = d2.Item(k)
          ReDim b(1 To kol.Count, 1 To 4) As String
          i = 0
          For Each el In kol
              i = i + 1
              For x = 1 To 4: b(i, x) = a(el, x): Next
          Next
          With Sheets(k)
              .UsedRange.Offset(2).Clear
              .[a3].Resize(UBound(B), 4) = b
          End With
      Next
End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Вторник, 29.09.2015, 20:54
 
Ответить
СообщениеВот такой полуфабрикат, но рабочий. Полуфабрикат потому, что не понял что там с этими нормами расхода и куда их нужно умножать - код писал для первого примера, где нет примера...
Но задел для норм в коде есть - это третий словарь, там каждому номеру прописан расход, бери и пользуйся (кроме тех, у кого 0)
[vba]
Код
Option Explicit

Sub tt()
      Dim a(), i&, d1 As Object, d2 As Object, d3 As Object, t$, k, kol As Object, el, x&

      Set d1 = CreateObject("scripting.dictionary"): d1.comparemode = 1
      Set d2 = CreateObject("scripting.dictionary"): d2.comparemode = 1
      Set d3 = CreateObject("scripting.dictionary"): d3.comparemode = 1    'норма расхода

      '1. набираем словарь номеров с именами листов по данным из "Данные"   
      a = Sheets("Данные").[a1].CurrentRegion.Columns(1).Resize(, 5).Value
      For i = 2 To UBound(a)
          t = Trim(a(i, 1))
          If a(i, 5) > 0 Then d3.Item(t) = a(i, 5)    'норма расхода
          Select Case Trim(a(i, 3))
          Case "Сборка": d1.Item(t) = "Сборка"
          Case "Покупные": d1.Item(t) = "Покупные"
          Case "Кооперация": d1.Item(t) = "Покупные"
          Case "Крепеж": d1.Item(t) = "Крепёж"
          Case Else: d1.Item(t) = "Механический"
          End Select
      Next

      '2. "Итог" берём в массив, проходим циклом, проверяем номер по словарю - получаем имя листа,
      'который берём в другой словарь, где каждому имени листа собираем коллекцию номеров строк, которые в него будем копировать.   

      a = Sheets("Итог").[a2].CurrentRegion.Columns(1).Resize(, 4).Value
      For i = 2 To UBound(a)
          t = Trim(a(i, 2))
          If d1.exists(t) Then
              If Not d2.exists(d1.Item(t)) Then d2.Add d1.Item(t), New Collection
              d2.Item(d1.Item(t)).Add i
          End If
      Next

      '3. цикл уже по словарю имён листов - берём ключ, создаём массив нужного размера (всё уже известно),
      'перекладываем в него данные из исходного массива, выгружаем на лист.   

      For Each k In d2.keys
          Set kol = d2.Item(k)
          ReDim b(1 To kol.Count, 1 To 4) As String
          i = 0
          For Each el In kol
              i = i + 1
              For x = 1 To 4: b(i, x) = a(el, x): Next
          Next
          With Sheets(k)
              .UsedRange.Offset(2).Clear
              .[a3].Resize(UBound(B), 4) = b
          End With
      Next
End Sub
[/vba]

Автор - Hugo
Дата добавления - 29.09.2015 в 20:45
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!