Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2016, 06:58   #1
guitar2003
Пользователь
 
Регистрация: 30.05.2016
Сообщений: 17
Лампочка Распространение формулы на диапазон листов

И снова здравствуйте! Ещё раз мои благодарности Hugo121 за решение реально большой проблемы с контекстным поиском. По сравнению с ней новый вопрос должен показаться плёвым, но у меня уже мозг вскипел.

Итак, во вложении пример с выдержкой всё из того же дурацкого файла со статистикой.

Имеем ряд листов с личной статистикой ("поголовной"). Имеем лист СВОДКА, где все эти показатели так или иначе суммируются.

На листах с поголовной статистикой есть колонки, которые учитывают посещение человеком тех или иных мероприятий в конкретную дату. За один день человек может посетить одно и то же мероприятие, но в разных местах (не вдавайтесь в подробности - это надолго). Это решено проставлением плюсиков в соответствующих ячейках. Смысла ставить там цифры нет. Для ясности на всех листах желтым выделена продублированная дата 5 мая.

Казалось бы все просто. Однако, проблема кроется в сводных подсчётах. Если на листах с поголовной статистикой ведётся подсчёт общего количества плюсов за месяц по формуле =СЧЁТЕСЛИ(D2:D34;"+"), то на листе СВОДКА в ячейках на каждую конкретную дату нужно посчитать количество плюсов за день у всех людей.

Пробовали решить это по-разному, но всякий раз сталкивались с тем, что формула не распространяется на диапазон "поголовных" листов.
Пока что проблема решена кустарным способом: на "поголовных" листах есть отдельная таблица с подсчётом суточного количества плюсов с формулой =СЧЁТЕСЛИМН(D:D;Сводка!$I$2;$B:$B;С водка!$B6), а на листе СВОДКА в соответствующих ячейках вбита формула =Чел1!I6+Чел2!I6+Чел3!I6. Именно это и тормозит общий файл, т.к. там листов не 3, а много больше, и подсчёт на каждом из них ведётся не только за май, а по всему году, и колонок с плюсами несколько больше.

Вопрос 1: можно ли распространить формулу подсчёта суточного количества плюсов на диапазон листов, чтобы вбить её сразу в ячейки листа СВОДКА и убрать эти дублирующие таблицы со всех других листов?

Вопрос 2: можно ли распространить формулы на всю книгу в целом, независимо от добавления новых или удаления ненужных листов, чтобы потом не приходилось переписывать формулы?
Вложения
Тип файла: xlsx Книга1.xlsx (22.6 Кб, 7 просмотров)

Последний раз редактировалось guitar2003; 01.06.2016 в 07:01.
guitar2003 вне форума Ответить с цитированием
Старый 02.06.2016, 06:41   #2
guitar2003
Пользователь
 
Регистрация: 30.05.2016
Сообщений: 17
По умолчанию

Неужели это сложнее контескстного поиска?
guitar2003 вне форума Ответить с цитированием
Старый 02.06.2016, 10:21   #3
VictorK
Пользователь
 
Регистрация: 24.05.2008
Сообщений: 64
По умолчанию

Могу только порекомендовать вместо формулы
Код:
=Чел1!I6+Чел2!I6+Чел3!I6
использовать формулу
Код:
=СУММ('Чел*'!I6)
но от "тормозов" это вряд ли спасёт.
VictorK вне форума Ответить с цитированием
Старый 02.06.2016, 10:43   #4
guitar2003
Пользователь
 
Регистрация: 30.05.2016
Сообщений: 17
По умолчанию

Цитата:
Сообщение от VictorK Посмотреть сообщение
Могу только порекомендовать вместо формулы
Код:
=Чел1!I6+Чел2!I6+Чел3!I6
использовать формулу
Код:
=СУММ('Чел*'!I6)
но от "тормозов" это вряд ли спасёт.
До этого я уже сам додумался. Но это не спасает от ошибок в сводных расчётах из-за дублирования строк с датами.
guitar2003 вне форума Ответить с цитированием
Старый 02.06.2016, 14:39   #5
guitar2003
Пользователь
 
Регистрация: 30.05.2016
Сообщений: 17
По умолчанию Одно лечим, другое калечим

Основательно погуглив, применил в файле модуль, описанный здесь http://www.excel-vba.ru/chto-umeet-e...e-po-usloviyu/

Код:
Function All_SumIf(rRange As Range, rCriteria As Range, rSumRange As Range, Optional bAllSh As Boolean = True)
    Dim wsSh As Worksheet, sRange As String, sSumRange As String
    sRange = Right(rRange.Address, Len(rRange.Address) - InStr(rRange.Address, "!"))
    sSumRange = Right(rSumRange.Address, Len(rSumRange.Address) - InStr(rSumRange.Address, "!"))
    For Each wsSh In Sheets
        If bAllSh Then
            If wsSh.Name <> Application.Caller.Parent.Name Then
                All_SumIf = All_SumIf + Application.SumIf(wsSh.Range(sRange), rCriteria, wsSh.Range(sSumRange))
            End If
        Else
            If wsSh.Index < Application.Caller.Parent.Index Then
                All_SumIf = All_SumIf + Application.SumIf(wsSh.Range(sRange), rCriteria, wsSh.Range(sSumRange))
            End If
        End If
    Next wsSh
End Function
Замечательная вещь, доложу я вам. Суммирует всё на ура.

Одно но. После растаскивания функции с этим модулем по листу 400х40 ячеек файл распух с 0,5 Мб до 3 Мб, стал отжирать 100 Мб оперативки и радостно вешаться при попытке скопировать лист с исходными данными на новый лист.

Что я делаю не так?! Как его привести в рабочий вид?
HELP!!!
guitar2003 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диапазон листов vefer Microsoft Office Excel 4 29.04.2014 13:32
Как создать "динамический" диапазон условия суммирования для формулы? kievlyanin Microsoft Office Excel 13 08.09.2011 13:24
Как задать диапазон листов в СЧЁТЕСЛИ olga=) Microsoft Office Excel 7 08.09.2010 01:14
Скопировать диапазон с одной книги в другую, если совпадают назавание листов m_v_v Microsoft Office Excel 7 06.04.2010 13:15
Распространение androidvsu Общие вопросы по Java, Java SE, Kotlin 0 26.01.2010 21:08