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

Вход

Регистрация

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

 

= Мир MS Excel/Сложить имеющиеся данные, не совсем корректный цикл. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Сложить имеющиеся данные, не совсем корректный цикл.
Olena Дата: Среда, 11.09.2024, 23:42 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 68
Репутация: 1 ±
Замечаний: 20% ±

Всем доброго времени. Помогите с макросом.
Задача стоит собрать с листа данные и если совпадают значения на листе "РЕЗ" столбец "В" с значениями листа "СТАРТ" столбец "I" тогда значения столбца "Н" этого же листа должны сложиться если несколько совпадений (на одно совпадение вроде верно отрабатывает)
Макрос сбора готов, но вот проблема, в том что цикл перезаписывает (я уже пробовала по разному складывать) макрос или все складывает или значения для сложения использует из предыдущего цикла.
Пример во вложении и какой результат долен бить написан на листе "РЕЗ" столбец "Р"
Просила бы написать где у меня ошибка в циклах(процесс суммирования не писала, так как он не верный( ). потому как "трех уровневый цикл с массивами мне сложно еще освоить, где какой флаг прерывания ставить

Спасибо за консультацию.
К сообщению приложен файл: fajl.xlsm (28.3 Kb)
 
Ответить
СообщениеВсем доброго времени. Помогите с макросом.
Задача стоит собрать с листа данные и если совпадают значения на листе "РЕЗ" столбец "В" с значениями листа "СТАРТ" столбец "I" тогда значения столбца "Н" этого же листа должны сложиться если несколько совпадений (на одно совпадение вроде верно отрабатывает)
Макрос сбора готов, но вот проблема, в том что цикл перезаписывает (я уже пробовала по разному складывать) макрос или все складывает или значения для сложения использует из предыдущего цикла.
Пример во вложении и какой результат долен бить написан на листе "РЕЗ" столбец "Р"
Просила бы написать где у меня ошибка в циклах(процесс суммирования не писала, так как он не верный( ). потому как "трех уровневый цикл с массивами мне сложно еще освоить, где какой флаг прерывания ставить

Спасибо за консультацию.

Автор - Olena
Дата добавления - 11.09.2024 в 23:42
Hugo Дата: Четверг, 12.09.2024, 08:42 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Добрый день.
Макрос сбора готов, но вот проблема
- проблема в том что вообще непонятно что нужно - макрос делает одно, Вы описываете другое...
В коде вообще наворочено не разберёшься, начиная с
[vba]
Код
Set Sh_REZ = ThisWorkbook.Sheets("Старт")
Set Sh_START = ThisWorkbook.Sheets("РЕЗ")
[/vba]
Для такой простой задачи (как описано) нужно вообще не править, а писать новое. Массивы вижу есть, словаря не хватает.
Коротенько согласно ТЗ так:
[vba]
Код

Sub Test_T()
Dim START, REZ, inArr, outArr, i&, t$

START = Sheets("Старт").[a4].CurrentRegion.Columns(9).Value
inArr = Sheets("Старт").[a4].CurrentRegion.Columns(8).Value
REZ = Sheets("РЕЗ").[a1].CurrentRegion.Columns(2).Value
outArr = Sheets("РЕЗ").[a1].CurrentRegion.Columns(3).Value

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, оставив только заголовок, или вообще этот массив сгенерить пустым, без заголовка, и выгружать его на место под заголовком.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD


Сообщение отредактировал Hugo - Четверг, 12.09.2024, 09:17
 
Ответить
СообщениеДобрый день.
Макрос сбора готов, но вот проблема
- проблема в том что вообще непонятно что нужно - макрос делает одно, Вы описываете другое...
В коде вообще наворочено не разберёшься, начиная с
[vba]
Код
Set Sh_REZ = ThisWorkbook.Sheets("Старт")
Set Sh_START = ThisWorkbook.Sheets("РЕЗ")
[/vba]
Для такой простой задачи (как описано) нужно вообще не править, а писать новое. Массивы вижу есть, словаря не хватает.
Коротенько согласно ТЗ так:
[vba]
Код

Sub Test_T()
Dim START, REZ, inArr, outArr, i&, t$

START = Sheets("Старт").[a4].CurrentRegion.Columns(9).Value
inArr = Sheets("Старт").[a4].CurrentRegion.Columns(8).Value
REZ = Sheets("РЕЗ").[a1].CurrentRegion.Columns(2).Value
outArr = Sheets("РЕЗ").[a1].CurrentRegion.Columns(3).Value

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
Дата добавления - 12.09.2024 в 08:42
Olena Дата: Четверг, 12.09.2024, 11:27 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 68
Репутация: 1 ±
Замечаний: 20% ±

Благодарна вам.
Просмотрела, протестировала. Супер)
Почему у меня так описано, данная процедура будет использоваться на 500 -600 строк ежедневно.
Про currentregion, я мало имела с ними дело. Надо почитать и попрактиковаться.
Огромноя благодарность вам.
Хорошего дня)
 
Ответить
СообщениеБлагодарна вам.
Просмотрела, протестировала. Супер)
Почему у меня так описано, данная процедура будет использоваться на 500 -600 строк ежедневно.
Про currentregion, я мало имела с ними дело. Надо почитать и попрактиковаться.
Огромноя благодарность вам.
Хорошего дня)

Автор - Olena
Дата добавления - 12.09.2024 в 11:27
Hugo Дата: Четверг, 12.09.2024, 13:32 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Про currentregion
почитайте, скорее всего в рабочем файле нужно будет эти массивы определять как Вы делали в своём варианте.
Если нужно суммировать значения не в одном столбце, а в многих - тоже можно этим способом делать, в этом же словаре в начале запомнить где какой столбец, и затем использовать
[vba]
Код
outArr(.Item(заголовокстрока), .Item(заголовокстолбец))
[/vba]


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
Сообщение
Про currentregion
почитайте, скорее всего в рабочем файле нужно будет эти массивы определять как Вы делали в своём варианте.
Если нужно суммировать значения не в одном столбце, а в многих - тоже можно этим способом делать, в этом же словаре в начале запомнить где какой столбец, и затем использовать
[vba]
Код
outArr(.Item(заголовокстрока), .Item(заголовокстолбец))
[/vba]

Автор - Hugo
Дата добавления - 12.09.2024 в 13:32
Olena Дата: Четверг, 12.09.2024, 16:03 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 68
Репутация: 1 ±
Замечаний: 20% ±

Благодарю вас.
Сегодня будет чем заняться))
 
Ответить
СообщениеБлагодарю вас.
Сегодня будет чем заняться))

Автор - Olena
Дата добавления - 12.09.2024 в 16:03
Hugo Дата: Четверг, 12.09.2024, 16:58 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Olena, немного поясню по процессу - обычно я такие задачи решал на словаре немного иначе - сперва циклом по источнику (двумя вложенными циклами - по столбцу и строке заголовков) собирал сразу в словаре суммы для ключа "заголовокстроки|заголовостолбца" - т.е. суммы на пересечении строка/столбец.
Затем аналогично по сводному файлу (а его можно и создать с нуля когда уже собрана информация по существующим данным) раскладывал в шахматку уже готовое.
Но так очень много памяти съедает словарь - там куча ключей и сумм (на каждую ячейку сводной шахматки свой ключ и сумма). Особенно если названия в шапках длинные.
Если же делать как тут в коде выше - когда сводная уже готова, то в словаре можно хранить только координаты строки и столбца (если названия/ключи могут совпадать - можно к ним дописывать например x/y, но такое на практике бывает очень редко), а суммы собирать уже непосредственно в сводной.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеOlena, немного поясню по процессу - обычно я такие задачи решал на словаре немного иначе - сперва циклом по источнику (двумя вложенными циклами - по столбцу и строке заголовков) собирал сразу в словаре суммы для ключа "заголовокстроки|заголовостолбца" - т.е. суммы на пересечении строка/столбец.
Затем аналогично по сводному файлу (а его можно и создать с нуля когда уже собрана информация по существующим данным) раскладывал в шахматку уже готовое.
Но так очень много памяти съедает словарь - там куча ключей и сумм (на каждую ячейку сводной шахматки свой ключ и сумма). Особенно если названия в шапках длинные.
Если же делать как тут в коде выше - когда сводная уже готова, то в словаре можно хранить только координаты строки и столбца (если названия/ключи могут совпадать - можно к ним дописывать например x/y, но такое на практике бывает очень редко), а суммы собирать уже непосредственно в сводной.

Автор - Hugo
Дата добавления - 12.09.2024 в 16:58
Olena Дата: Четверг, 12.09.2024, 23:19 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 68
Репутация: 1 ±
Замечаний: 20% ±

Но так очень много памяти съедает словарь

Мой макрос тоже работает, вроде быстро) только некорректно)))
Сейчас попробую свой переделать под ваш). Ошибку в своем (где сложение делала) нашла, циклы и If и Find, работают как бы типа с запозданием т.е., когда find нашел искомое, условие if почему то содержит старое значение сравнения, вот и выходит разнобой сложения.
Пол дня сегодня пробовала свой макрос оживить своим методом, но увы)))
Сейчас буду под ваш перестраивать.
Благодарю)
 
Ответить
Сообщение
Но так очень много памяти съедает словарь

Мой макрос тоже работает, вроде быстро) только некорректно)))
Сейчас попробую свой переделать под ваш). Ошибку в своем (где сложение делала) нашла, циклы и If и Find, работают как бы типа с запозданием т.е., когда find нашел искомое, условие if почему то содержит старое значение сравнения, вот и выходит разнобой сложения.
Пол дня сегодня пробовала свой макрос оживить своим методом, но увы)))
Сейчас буду под ваш перестраивать.
Благодарю)

Автор - Olena
Дата добавления - 12.09.2024 в 23:19
Hugo Дата: Четверг, 12.09.2024, 23:28 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Olena, но нужно учитывать что на Маках словарей нет (но можно извернуться коллекциями). И очень редко бывает что и на Винде не подключена эта библиотека, один раз было.
Ну а так советую освоить словари - там и словарь коллекций можно строить, или словарь словарей ))


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD


Сообщение отредактировал Hugo - Четверг, 12.09.2024, 23:30
 
Ответить
СообщениеOlena, но нужно учитывать что на Маках словарей нет (но можно извернуться коллекциями). И очень редко бывает что и на Винде не подключена эта библиотека, один раз было.
Ну а так советую освоить словари - там и словарь коллекций можно строить, или словарь словарей ))

Автор - Hugo
Дата добавления - 12.09.2024 в 23:28
Olena Дата: Пятница, 13.09.2024, 08:09 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 68
Репутация: 1 ±
Замечаний: 20% ±

Т.е.просто сравнением массивов последовательно я не смогу реализовать как у вас.
Ищу ошибки в своей реализации, потому как если не освою от А до Я, проблема будет повторяться))
 
Ответить
СообщениеТ.е.просто сравнением массивов последовательно я не смогу реализовать как у вас.
Ищу ошибки в своей реализации, потому как если не освою от А до Я, проблема будет повторяться))

Автор - Olena
Дата добавления - 13.09.2024 в 08:09
Hugo Дата: Пятница, 13.09.2024, 09:13 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Ну можно перебирать цикл в цикле массивы и сравнивать, но это дольше.
Я в Ваш код не вникал, потому что не знаю что именно он должен решать (вопрос звучал не так как работает тот код), делать обратный инжениринг лениво.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНу можно перебирать цикл в цикле массивы и сравнивать, но это дольше.
Я в Ваш код не вникал, потому что не знаю что именно он должен решать (вопрос звучал не так как работает тот код), делать обратный инжениринг лениво.

Автор - Hugo
Дата добавления - 13.09.2024 в 09:13
  • Страница 1 из 1
  • 1
Поиск:

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