Добрый день! Прошу подсказать решение задачи.. Есть таблица с данными по разным контрагентам, контрагенты между собой отделены жирным подчеркиванием. Никак не могу сообразить, как сделать суммирование ячеек между этими строками (кол-во строк разное, более того, строки могут добавляться/удаляться) На данный момент знаний хватило на то, чтобы написать функцию, которая выводит 1 если есть жирное подчеркивание и 0 если его нет
[vba]
Код
Function жирная_нижняя_граница(cl As Range) 'функция ставит 1, если в ячейки жирная нижняя граница Application.Volatile 'пересчитывается при изменении ячейки If cl.Borders(xlEdgeBottom).Weight = xlMedium Then жирная_нижняя_граница = 1 End If End Function
[/vba]
В идеале конечно хотелось бы написать формулу, чтобы работала при обновлении данных, макросом производить подсуммирование было бы не так удобно. Буду рад любой подсказке.
Добрый день! Прошу подсказать решение задачи.. Есть таблица с данными по разным контрагентам, контрагенты между собой отделены жирным подчеркиванием. Никак не могу сообразить, как сделать суммирование ячеек между этими строками (кол-во строк разное, более того, строки могут добавляться/удаляться) На данный момент знаний хватило на то, чтобы написать функцию, которая выводит 1 если есть жирное подчеркивание и 0 если его нет
[vba]
Код
Function жирная_нижняя_граница(cl As Range) 'функция ставит 1, если в ячейки жирная нижняя граница Application.Volatile 'пересчитывается при изменении ячейки If cl.Borders(xlEdgeBottom).Weight = xlMedium Then жирная_нижняя_граница = 1 End If End Function
[/vba]
В идеале конечно хотелось бы написать формулу, чтобы работала при обновлении данных, макросом производить подсуммирование было бы не так удобно. Буду рад любой подсказке.Chikitonik
- Прочитайте Правила форума - Оформите код тегами (в режиме правки поста выделите код и нажмите кнопку #, пояснялка здесь)
И, если хотите формулой, то приведите не самописный, а нормальный пример, в котором было бы логически понятна конструкция таблицы. Ведь у Вас жирная линия не просто так откуда-то берется, Вы ее по какой-то причине ставите? По какой?
- Прочитайте Правила форума - Оформите код тегами (в режиме правки поста выделите код и нажмите кнопку #, пояснялка здесь)
И, если хотите формулой, то приведите не самописный, а нормальный пример, в котором было бы логически понятна конструкция таблицы. Ведь у Вас жирная линия не просто так откуда-то берется, Вы ее по какой-то причине ставите? По какой?_Boroda_
Жирной линией отделяются разные контрагенты друг от друга. Название контрагента вводится один раз, например Вася (как на скриншоте), потом ниже еще могут быть какие-то записи, но они значения не имеют. Имеет значение только название контрагента(Вася) и то, что все его данные отделены жирным подчеркиванием от другого контрагента. В его данных различные цифры и пустые строки, вот цифры надо и суммировать в желтом столбце напротив контрагента.
Жирной линией отделяются разные контрагенты друг от друга. Название контрагента вводится один раз, например Вася (как на скриншоте), потом ниже еще могут быть какие-то записи, но они значения не имеют. Имеет значение только название контрагента(Вася) и то, что все его данные отделены жирным подчеркиванием от другого контрагента. В его данных различные цифры и пустые строки, вот цифры надо и суммировать в желтом столбце напротив контрагента.Chikitonik
Ну как хотите, не даете реальный пример, тогда только или макросом, или макрофункцией Макрофункцией см. файл. Хоть макросов там и нет, но они должны быть разрешены Формула для D2
Код
=ЕСЛИ(Гр;СУММ(B2:C999)-СУММ(D3:D999);"")
Что такое "Гр" можно посмотреть в диспетчере имен, нажав Контрл F3
Дает единицу? если в столбце А жирная или верхняя граница текущей строки или нижняя граница строки выше
Ну как хотите, не даете реальный пример, тогда только или макросом, или макрофункцией Макрофункцией см. файл. Хоть макросов там и нет, но они должны быть разрешены Формула для D2
Код
=ЕСЛИ(Гр;СУММ(B2:C999)-СУММ(D3:D999);"")
Что такое "Гр" можно посмотреть в диспетчере имен, нажав Контрл F3
Спасибо за помощь! Ваша формула в "Гр" по сути выполняет то же, что и моя функция "жирная_нижняя_граница", т.е. определят если жирная граница.
Формула для D2
Код
=ЕСЛИ(Гр;СУММ(B2:C999)-СУММ(D3:D999);"")
также подходит, но она, если можно так выразиться, не гибкая. Ее нельзя использовать на весь столбец, нельзя вставлять какие-либо другие данные в столбец (например общий итог по столбцу).
Я, впринципе, написал формулы, которые решают мою задачу, но с использованием промежуточного столбца, а хотелось бы без него, возможно сможете подсказать?
Вначале использую формулу, которая проставляет контрагента в каждую ячейку между жирными границами (формула в F2)
Код
=ЕСЛИ(жирная_нижняя_граница(A1);A2;F1)
Затем суммирование по созданному диапазону (формула в D2)
Решение не нравится тем, что добавляется столбец, а также в формуле слишком грубо добавлено суммирование по каждому столбцу, наверняка можно сделать изящнее
Спасибо за помощь! Ваша формула в "Гр" по сути выполняет то же, что и моя функция "жирная_нижняя_граница", т.е. определят если жирная граница.
Формула для D2
Код
=ЕСЛИ(Гр;СУММ(B2:C999)-СУММ(D3:D999);"")
также подходит, но она, если можно так выразиться, не гибкая. Ее нельзя использовать на весь столбец, нельзя вставлять какие-либо другие данные в столбец (например общий итог по столбцу).
Я, впринципе, написал формулы, которые решают мою задачу, но с использованием промежуточного столбца, а хотелось бы без него, возможно сможете подсказать?
Вначале использую формулу, которая проставляет контрагента в каждую ячейку между жирными границами (формула в F2)
Код
=ЕСЛИ(жирная_нижняя_граница(A1);A2;F1)
Затем суммирование по созданному диапазону (формула в D2)
Решение не нравится тем, что добавляется столбец, а также в формуле слишком грубо добавлено суммирование по каждому столбцу, наверняка можно сделать изящнее Chikitonik
Ваша формула в "Гр" по сути выполняет то же, что и моя функция "жирная_нижняя_граница", т.е. определят если жирная граница.
Да, только работает она гораздо быстрее - это "вшитая" в Excel функция, она по-любому быстрее самописного макроса. Вы нормальный файл так и не дали, поэтому ориентироваться можно только на жирную границу. Был бы нормальный файл, мы бы скорее всего придумали , как найти размер одного блока без просмотра границ.
Формула для D2 =ЕСЛИ(Гр;СУММ(B2:C999)-СУММ(D3:D999);"") также подходит, но она, если можно так выразиться, не гибкая. Ее нельзя использовать на весь столбец, нельзя вставлять какие-либо другие данные в столбец
Ну вот интересное заявление! Вы раньше хоть словом об этом обмолвились? Что попросили - то получили, а то, что необозначенные хотелки не работают - это сами виноваты, нужно было говорить про них.
Ваша формула в "Гр" по сути выполняет то же, что и моя функция "жирная_нижняя_граница", т.е. определят если жирная граница.
Да, только работает она гораздо быстрее - это "вшитая" в Excel функция, она по-любому быстрее самописного макроса. Вы нормальный файл так и не дали, поэтому ориентироваться можно только на жирную границу. Был бы нормальный файл, мы бы скорее всего придумали , как найти размер одного блока без просмотра границ.
Формула для D2 =ЕСЛИ(Гр;СУММ(B2:C999)-СУММ(D3:D999);"") также подходит, но она, если можно так выразиться, не гибкая. Ее нельзя использовать на весь столбец, нельзя вставлять какие-либо другие данные в столбец
Ну вот интересное заявление! Вы раньше хоть словом об этом обмолвились? Что попросили - то получили, а то, что необозначенные хотелки не работают - это сами виноваты, нужно было говорить про них.
Реальный пример приложил, но в первоначальном примере я привел все данные, что играют ключевую роль. Кол-во столбцов, строк и простые арифметические действия в исходном файле опустил, оставил только суть, чтобы не перегружать лишней информацией.
Ну а хотелка та же самая - ищу формулу, которая будет отображать итог напротив контрагента в выделенном столбце по всем строкам между жирным подчеркиванием (сейчас там ручками забита формула СУММ), ну и хочется, чтобы это бы красиво, элегантно и универсально чтобы можно было добавлять новые строки, новых контрагентов и не трогая формулу получать нужные данные
Реальный пример приложил, но в первоначальном примере я привел все данные, что играют ключевую роль. Кол-во столбцов, строк и простые арифметические действия в исходном файле опустил, оставил только суть, чтобы не перегружать лишней информацией.
Ну а хотелка та же самая - ищу формулу, которая будет отображать итог напротив контрагента в выделенном столбце по всем строкам между жирным подчеркиванием (сейчас там ручками забита формула СУММ), ну и хочется, чтобы это бы красиво, элегантно и универсально чтобы можно было добавлять новые строки, новых контрагентов и не трогая формулу получать нужные данные Chikitonik
Может, пока не поздно, пересмотреть саму организацию данных? Пока не накопились десятки тысяч строк? (для формул большое кол-во строк не очень хорошо, и в конечном итоге все равно придется макрос делать - смотря сколько данных будет в Вашей таблице, конечно) Со временем можете с таким файлом зайти в тупик. Вариант выхода - макрос, но для Вас
Может, пока не поздно, пересмотреть саму организацию данных? Пока не накопились десятки тысяч строк? (для формул большое кол-во строк не очень хорошо, и в конечном итоге все равно придется макрос делать - смотря сколько данных будет в Вашей таблице, конечно) Со временем можете с таким файлом зайти в тупик. Вариант выхода - макрос, но для Вас
Данные да, организованы жутким образом. Я на форуме недавно также просил помощи с формулой для обработки данных. Но переучить, к сожалению нельзя, пытаюсь только облегчить работу людям, которые работают с текущими данными. Если с формулой вариантов не будет, то можно конечно и макросом, но их там уже и там хватает для других задач, хотелось бы автоматизма без вмешательства пользователя. Ну и так как для меня важно саморазвитие, то стараюсь не использовать простых но громоздких вариантов с дополнительными столбцами, а искать элегантное решение.
Данные да, организованы жутким образом. Я на форуме недавно также просил помощи с формулой для обработки данных. Но переучить, к сожалению нельзя, пытаюсь только облегчить работу людям, которые работают с текущими данными. Если с формулой вариантов не будет, то можно конечно и макросом, но их там уже и там хватает для других задач, хотелось бы автоматизма без вмешательства пользователя. Ну и так как для меня важно саморазвитие, то стараюсь не использовать простых но громоздких вариантов с дополнительными столбцами, а искать элегантное решение.Chikitonik
Добрый день. Написал UDF, но пришлось отключить автопересчет, т.к. даже на таком маленьком примере подвисал. поэтому пришлось переделать, но тогда нули не нужные появились... в общем
Function СУММ_ЖИР(ByVal cl As Range) Application.Volatile 'отключил пересчет, т.к. файл подвисает If cl.Borders(xlEdgeTop).Weight <> xlMedium Then СУММ_ЖИР = Empty Exit Function End If flag = False Do i = i + 1 If cl.Offset(i, 0).Borders(xlEdgeBottom).Weight = xlMedium Then flag = True Loop While flag = False СУММ_ЖИР = WorksheetFunction.Sum(Range(cl, Application.Caller.Offset(i, -1))) End Function
[/vba] в функцию передается верхняя левая ячейка диапазона
Добрый день. Написал UDF, но пришлось отключить автопересчет, т.к. даже на таком маленьком примере подвисал. поэтому пришлось переделать, но тогда нули не нужные появились... в общем
Function СУММ_ЖИР(ByVal cl As Range) Application.Volatile 'отключил пересчет, т.к. файл подвисает If cl.Borders(xlEdgeTop).Weight <> xlMedium Then СУММ_ЖИР = Empty Exit Function End If flag = False Do i = i + 1 If cl.Offset(i, 0).Borders(xlEdgeBottom).Weight = xlMedium Then flag = True Loop While flag = False СУММ_ЖИР = WorksheetFunction.Sum(Range(cl, Application.Caller.Offset(i, -1))) End Function
[/vba] в функцию передается верхняя левая ячейка диапазонаsboy