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

 

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

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Сложить имеющиеся данные, не совсем корректный цикл.
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
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3854
Репутация: 814 ±
Замечаний: 0% ±

365
Добрый день.
Цитата Olena, 11.09.2024 в 23:42, в сообщении № 1 ( писал(а)):
Макрос сбора готов, но вот проблема
- проблема в том что вообще непонятно что нужно - макрос делает одно, Вы описываете другое...
В коде вообще наворочено не разберёшься, начиная с

Set Sh_REZ = ThisWorkbook.Sheets("Старт")
Set Sh_START = ThisWorkbook.Sheets("РЕЗ")


Для такой простой задачи (как описано) нужно вообще не править, а писать новое. Массивы вижу есть, словаря не хватает.
Коротенько согласно ТЗ так:


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


Это рабочий прототип ))
Вообще массивы START и inArr можно объединить в один, т.е одна сущность тут лишняя.
Если запускать повторно - то сперва нужно очистить поле. Можно в коде очистить массив outArr, оставив только заголовок, или вообще этот массив сгенерить пустым, без заголовка, и выгружать его на место под заголовком.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD


Сообщение отредактировал Hugo - Четверг, 12.09.2024, 09:17
 
Ответить
СообщениеДобрый день.
Цитата Olena, 11.09.2024 в 23:42, в сообщении № 1 ( писал(а)):
Макрос сбора готов, но вот проблема
- проблема в том что вообще непонятно что нужно - макрос делает одно, Вы описываете другое...
В коде вообще наворочено не разберёшься, начиная с
[vba]
Set Sh_REZ = ТhisWorkbook.Sheets("Старт")Set Sh_START = ТhisWorkbook.Sheets("РЕЗ")
[/vba]
Для такой простой задачи (как описано) нужно вообще не править, а писать новое. Массивы вижу есть, словаря не хватает.
Коротенько согласно ТЗ так:
[vba]
Sub Тest_Т()Dim START; REZ; inArr; outArr; i&; t$START = Sheets("Старт").[a4].CurrentRegion.Columns(9).ValueinArr = Sheets("Старт").[a4].CurrentRegion.Columns(8).ValueREZ = Sheets("РЕЗ").[a1].CurrentRegion.Columns(2).ValueoutArr = Sheets("РЕЗ").[a1].CurrentRegion.Columns(3).ValueWith CreateObject("Scripting.Dictionary"): .comparemode = 1    For i = 3 To UBound(REZ): .Item(Тrim(REZ(i; 1))) = i: Next    For i = 3 To UBound(START)    t = Тrim(СТАРТ(i; 1))        If .exists(t) Then            outArr(.Item(t); 1) = outArr(.Item(t); 1) + inArr(i; 1)        End If    NextEnd WithSheets("РЕЗ").[a1].CurrentRegion.Columns(3).Value = outArrEnd 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
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3854
Репутация: 814 ±
Замечаний: 0% ±

365
Цитата Olena, 12.09.2024 в 11:27, в сообщении № 3 ( писал(а)):
Про currentregion
почитайте, скорее всего в рабочем файле нужно будет эти массивы определять как Вы делали в своём варианте.
Если нужно суммировать значения не в одном столбце, а в многих - тоже можно этим способом делать, в этом же словаре в начале запомнить где какой столбец, и затем использовать

outArr(.Item(заголовокстрока), .Item(заголовокстолбец))



webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
Сообщение
Цитата Olena, 12.09.2024 в 11:27, в сообщении № 3 ( писал(а)):
Про 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
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3854
Репутация: 814 ±
Замечаний: 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% ±

Цитата Hugo, 12.09.2024 в 16:58, в сообщении № 6 ( писал(а)):
Но так очень много памяти съедает словарь

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

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

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

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


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

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

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