Всем доброго времени. Помогите с макросом. Задача стоит собрать с листа данные и если совпадают значения на листе "РЕЗ" столбец "В" с значениями листа "СТАРТ" столбец "I" тогда значения столбца "Н" этого же листа должны сложиться если несколько совпадений (на одно совпадение вроде верно отрабатывает) Макрос сбора готов, но вот проблема, в том что цикл перезаписывает (я уже пробовала по разному складывать) макрос или все складывает или значения для сложения использует из предыдущего цикла. Пример во вложении и какой результат долен бить написан на листе "РЕЗ" столбец "Р" Просила бы написать где у меня ошибка в циклах(процесс суммирования не писала, так как он не верный( ). потому как "трех уровневый цикл с массивами мне сложно еще освоить, где какой флаг прерывания ставить
Спасибо за консультацию.
Всем доброго времени. Помогите с макросом. Задача стоит собрать с листа данные и если совпадают значения на листе "РЕЗ" столбец "В" с значениями листа "СТАРТ" столбец "I" тогда значения столбца "Н" этого же листа должны сложиться если несколько совпадений (на одно совпадение вроде верно отрабатывает) Макрос сбора готов, но вот проблема, в том что цикл перезаписывает (я уже пробовала по разному складывать) макрос или все складывает или значения для сложения использует из предыдущего цикла. Пример во вложении и какой результат долен бить написан на листе "РЕЗ" столбец "Р" Просила бы написать где у меня ошибка в циклах(процесс суммирования не писала, так как он не верный( ). потому как "трех уровневый цикл с массивами мне сложно еще освоить, где какой флаг прерывания ставить
WithCreateObject("Scripting.Dictionary"): .comparemode = 1 For i = 3ToUBound(REZ): .Item(Trim(REZ(i, 1))) = i: Next For i = 3ToUBound(START)
t = Trim(START(i, 1)) If .exists(t) Then
outArr(.Item(t), 1) = outArr(.Item(t), 1) + inArr(i, 1) EndIf Next EndWith
Sheets("РЕЗ").[a1].CurrentRegion.Columns(3).Value = outArr EndSub
Это рабочий прототип )) Вообще массивы START и inArr можно объединить в один, т.е одна сущность тут лишняя. Если запускать повторно - то сперва нужно очистить поле. Можно в коде очистить массив outArr, оставив только заголовок, или вообще этот массив сгенерить пустым, без заголовка, и выгружать его на место под заголовком.
WithCreateObject("Scripting.Dictionary"): .comparemode = 1 For i = 3ToUBound(REZ): .Item(Trim(REZ(i, 1))) = i: Next For i = 3ToUBound(START)
t = Trim(START(i, 1)) If .exists(t) Then
outArr(.Item(t), 1) = outArr(.Item(t), 1) + inArr(i, 1) EndIf Next EndWith
Sheets("РЕЗ").[a1].CurrentRegion.Columns(3).Value = outArr EndSub
Это рабочий прототип )) Вообще массивы START и inArr можно объединить в один, т.е одна сущность тут лишняя. Если запускать повторно - то сперва нужно очистить поле. Можно в коде очистить массив outArr, оставив только заголовок, или вообще этот массив сгенерить пустым, без заголовка, и выгружать его на место под заголовком.Hugo
Благодарна вам. Просмотрела, протестировала. Супер) Почему у меня так описано, данная процедура будет использоваться на 500 -600 строк ежедневно. Про currentregion, я мало имела с ними дело. Надо почитать и попрактиковаться. Огромноя благодарность вам. Хорошего дня)
Благодарна вам. Просмотрела, протестировала. Супер) Почему у меня так описано, данная процедура будет использоваться на 500 -600 строк ежедневно. Про currentregion, я мало имела с ними дело. Надо почитать и попрактиковаться. Огромноя благодарность вам. Хорошего дня)Olena
почитайте, скорее всего в рабочем файле нужно будет эти массивы определять как Вы делали в своём варианте. Если нужно суммировать значения не в одном столбце, а в многих - тоже можно этим способом делать, в этом же словаре в начале запомнить где какой столбец, и затем использовать
почитайте, скорее всего в рабочем файле нужно будет эти массивы определять как Вы делали в своём варианте. Если нужно суммировать значения не в одном столбце, а в многих - тоже можно этим способом делать, в этом же словаре в начале запомнить где какой столбец, и затем использовать
Olena, немного поясню по процессу - обычно я такие задачи решал на словаре немного иначе - сперва циклом по источнику (двумя вложенными циклами - по столбцу и строке заголовков) собирал сразу в словаре суммы для ключа "заголовокстроки|заголовостолбца" - т.е. суммы на пересечении строка/столбец. Затем аналогично по сводному файлу (а его можно и создать с нуля когда уже собрана информация по существующим данным) раскладывал в шахматку уже готовое. Но так очень много памяти съедает словарь - там куча ключей и сумм (на каждую ячейку сводной шахматки свой ключ и сумма). Особенно если названия в шапках длинные. Если же делать как тут в коде выше - когда сводная уже готова, то в словаре можно хранить только координаты строки и столбца (если названия/ключи могут совпадать - можно к ним дописывать например x/y, но такое на практике бывает очень редко), а суммы собирать уже непосредственно в сводной.
Olena, немного поясню по процессу - обычно я такие задачи решал на словаре немного иначе - сперва циклом по источнику (двумя вложенными циклами - по столбцу и строке заголовков) собирал сразу в словаре суммы для ключа "заголовокстроки|заголовостолбца" - т.е. суммы на пересечении строка/столбец. Затем аналогично по сводному файлу (а его можно и создать с нуля когда уже собрана информация по существующим данным) раскладывал в шахматку уже готовое. Но так очень много памяти съедает словарь - там куча ключей и сумм (на каждую ячейку сводной шахматки свой ключ и сумма). Особенно если названия в шапках длинные. Если же делать как тут в коде выше - когда сводная уже готова, то в словаре можно хранить только координаты строки и столбца (если названия/ключи могут совпадать - можно к ним дописывать например x/y, но такое на практике бывает очень редко), а суммы собирать уже непосредственно в сводной.Hugo
Мой макрос тоже работает, вроде быстро) только некорректно))) Сейчас попробую свой переделать под ваш). Ошибку в своем (где сложение делала) нашла, циклы и If и Find, работают как бы типа с запозданием т.е., когда find нашел искомое, условие if почему то содержит старое значение сравнения, вот и выходит разнобой сложения. Пол дня сегодня пробовала свой макрос оживить своим методом, но увы))) Сейчас буду под ваш перестраивать. Благодарю)
Мой макрос тоже работает, вроде быстро) только некорректно))) Сейчас попробую свой переделать под ваш). Ошибку в своем (где сложение делала) нашла, циклы и If и Find, работают как бы типа с запозданием т.е., когда find нашел искомое, условие if почему то содержит старое значение сравнения, вот и выходит разнобой сложения. Пол дня сегодня пробовала свой макрос оживить своим методом, но увы))) Сейчас буду под ваш перестраивать. Благодарю)Olena
Olena, но нужно учитывать что на Маках словарей нет (но можно извернуться коллекциями). И очень редко бывает что и на Винде не подключена эта библиотека, один раз было. Ну а так советую освоить словари - там и словарь коллекций можно строить, или словарь словарей ))
Olena, но нужно учитывать что на Маках словарей нет (но можно извернуться коллекциями). И очень редко бывает что и на Винде не подключена эта библиотека, один раз было. Ну а так советую освоить словари - там и словарь коллекций можно строить, или словарь словарей ))Hugo
Т.е.просто сравнением массивов последовательно я не смогу реализовать как у вас. Ищу ошибки в своей реализации, потому как если не освою от А до Я, проблема будет повторяться))
Т.е.просто сравнением массивов последовательно я не смогу реализовать как у вас. Ищу ошибки в своей реализации, потому как если не освою от А до Я, проблема будет повторяться))Olena
Ну можно перебирать цикл в цикле массивы и сравнивать, но это дольше. Я в Ваш код не вникал, потому что не знаю что именно он должен решать (вопрос звучал не так как работает тот код), делать обратный инжениринг лениво.
Ну можно перебирать цикл в цикле массивы и сравнивать, но это дольше. Я в Ваш код не вникал, потому что не знаю что именно он должен решать (вопрос звучал не так как работает тот код), делать обратный инжениринг лениво.Hugo