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