Сборка данных со всех листов книги в одну таблицу
Постановка задачи
Допустим, что у нас есть книга с большим количеством листов, где на каждом листе находится таблица с данными по сделкам в этом городе:
Давайте будем исходить из следующих соображений:
- Структура и столбцов на всех листах одинаковая.
- Количество строк на всех листах разное.
- Листы могут в будущем добавляться или удаляться.
Наша задача — собрать все данные со всех листов в одну таблицу, чтобы потом с ней работать (фильтровать, сортировать, построить сводную и т.д.) Сделать это можно разными способами, но самыми удобными будут, пожалуй, Power Query и макросы.
Способ 1. Сборка данных с листов с помощью Power Query
Если вы ещё не сталкивались в своей работе с Power Query, то очень советую копнуть в этом направлении. Использование этой бесплатной и уже встроенной по умолчанию в Excel надстройки, способно полностью перевернуть весь ваш процесс сбора и анализа данных, упростив всё в разы. С задачей сбора данных с листов Power Query справляется весьма успешно.
Шаг 1. Подключаемся к файлу
Для начала, создадим новый пустой файл в Excel, куда и будут собираться данные.
Если у вас Excel 2010-2013 и вы установили Power Query как отдельную надстройку, то откройте вкладку Power Query, если у вас Excel 2016 или новее, то вкладку Данные (Data). Нажмите кнопку Получить данные / Создать запрос — Из файла — Книга Excel (Get Data / New Query — From file — From Excel) и укажите наш файл с исходными листами:
В появившемся окне Навигатора (Navigator) выберите слева любой лист и нажмите в правом нижнем углу кнопку Преобразовать данные (Transform Data) или Изменить (Edit):
Должно появиться окно редактора запросов Power Query, где отобразятся данные с выбранного листа. Поскольку нам нужен, на самом деле, не один лист, а все, то удалим в правой панели все шаги, кроме первого шага Источник (Source) используя крестик слева от названия шага:
То, что останется после удаления шагов — это список всех объектов, которые Power Query «видит» во внешних файлах, а это:
- листы (Sheet)
- «умные таблицы» (Table)
- именованные диапазоны (Defined Name)
- области печати (Print Area), которые, по сути, являются одним из видов именованного диапазона
Шаг 2. Отбираем нужные листы
В исходном файле может быть много всего лишнего, что нам не требуется собирать: случайные ненужные листы, служебные именованные диапазоны, побочные умные таблицы и т.п. Очень важно отфильтровать этот «информационный мусор», т.к. в будущем из-за любого подобного объекта наш запорс будет, скорее всего, вылетать с ошибкой или некорректно собирать данные. Для решения этой задачи можно использовать несколько подходов.
Во-первых, легко можно отфильтровать нужные объекты по типу по столбцу Kind. Например, если вам нужны только листы:
Во-вторых, если нам нужны только видимые листы, то дополнительно можно отфильтровать ещё по столбцу Hidden.
В-третьих, если вы точно знаете размер таблиц, которые вам нужны, то можно легко добавить к нашему списку вычисляемый столбец с формулой, выводящей количество столбцов или строк и использовать потом эти числа для отбора. Для этого выберем на вкладке Добавление столбца — Настраиваемый столбец (Add Column — Custom Column) и введём в открывшееся окно следующую формулу (с учётом регистра):
Для подсчёта количества строк можно использовать аналогичную функцию Table.RowCount. Получившийся столбец затем можно использовать для фильтрации «мусорных» таблиц.
В-четвёртых, можно извлечь с каждого листа содержимое любой ячейки (например, А1) и использовать его для отбора. Например, если там нет слова «Товар«, то это не наш лист. Для извлечения нужно будет также добавить вычисляемый столбец с такой конструкцией:
=[Data][Column1]{0}
Здесь:
- [Data] — имя столбца, где в каждой ячейке лежат таблицы с содержимым каждого листа (убийственная формулировка для рядового пользователя Excel, да, я знаю)
- [Column1] — имя столбца на листе, из которого мы хотим извлечь данные
- {0} — номер строки (считая с нуля), откуда мы хотим взять данные
После фильтрации «мусора» все добавленные вспомогательные столбцы можно, конечно же, спокойно удалить, оставив только колонки Name и Data.
Шаг 3. Разворачиваем таблицы
Теперь развернём содержимое таблиц в одно целое, используя кнопку с двойными стрелками в заголовке столбца Data, отключив флажок Использовать исходное имя столбца как префикс (Use original column name as prefix):
После нажатия на ОК Power Query соберёт для нас все данные в одну мегатаблицу со всех отобранных листов нашего файла:
Останется лишь «навести блеск», а именно:
- Поднять первую строку в шапку таблицы кнопкой Использовать первую строку в качестве заголовков (Use first row as headers) на вкладке Главная (Home).
- Переименовать первый столбец в Город двойным щелчком на заголовку.
- Удалить повторяющиеся шапки таблиц, попавшие в одну кучу вместе с данными, используя фильтр по столбцу Товар.
Всё. Осталось только дать нашему запросу подходящее имя (например, Сборка) в панели справа и выгрузить затем собранные данные обратно в Excel кнопкой Закрыть и загрузить на вкладке Главная (Home — Close & Load):
В будущем, при любых изменениях в исходном файле достаточно будет лишь обновить наш запрос, щелкнув по собранной таблице правой кнопкой мыши и выбрав команду Обновить (Refresh) или такой же кнопкой на вкладке Данные (Data) или сочетанием клавиш Ctrl+Alt+F5.
Плюсы такого подхода:
- Не нужно уметь программировать, всё делается быстро и почти без использования клавиатуры.
- Последовательность столбцов на разных листах может быть различной — это не играет роли, столбцы правильно встанут друг под друга в итоговой сборке.
- Можно быстро обновлять запрос при изменении исходных данных.
Минусы этого способа:
- Собираются только значения, т.е. формулы с исходных листов не сохраняются.
- Названия столбцов должны на всех листах совпадать с точностью до регистра.
- Нельзя выбрать какой именно диапазон берётся с каждого листа — это определяется автоматически (берётся всё, что есть).
- Для обновления нужен Excel 2016 или новее или установленная надстройка Power Query.
Способ 2. Сборка данных с листов макросом на VBA
Похожего результата можно добиться и с помощью более «классического» подохода — макросом на VBA. Для этого на вкладке Разработчик (Developer) нажмите кнпоку Visual Basic или воспользуйтесь сочетанием клавиш Alt+F11. В открывшемся окне добавьте новый модуль через меню Insert — Module и скопируйте туда текст вот такого макроса:
Sub CollectDataFromAllSheets() Dim ws As Worksheet Set wbCurrent = ActiveWorkbook Workbooks.Add Set wbReport = ActiveWorkbook 'копируем на итоговый лист шапку таблицы из первого листа wbCurrent.Worksheets(1).Range("A1:D1").Copy Destination:=wbReport.Worksheets(1).Range("A1") 'проходим в цикле по всем листам исходного файла For Each ws In wbCurrent.Worksheets 'определяем номер последней строки на текущем листе и на листе сборки n = wbReport.Worksheets(1).Range("A1").CurrentRegion.Rows.Count 'задаем исходный диапазон, который надо скопировать с каждого листа - любой вариант на выбор: Set rngData = ws.Range("A1:D5") 'фиксированный диапазон или Set rngData = ws.UsedRange 'всё, что есть на листе или Set rngData = ws.Range("F5").CurrentRegion 'область, начиная от ячейки F5 или Set rngData = ws.Range("A2", ws.Range("A2").SpecialCells(xlCellTypeLastCell)) 'от А2 и до конца листа 'копируем исходный диапазон и вставляем в итоговую книгу со следующей строки rngData.Copy Destination:=wbReport.Worksheets(1).Cells(n + 1, 1) Next ws End Sub
Запустить созданный макрос можно на вкладке Разработчик кнопкой Макросы (Developer — Macros) или с помощью сочетания клавиш Alt+F8. Макрос автоматически создаст новую книгу и скопирует туда нужные вам данные.
Плюсы такого подхода:
- Формулы с исходных листов сохраняются в сборке.
- Имена столбцов не играют роли.
- Макрос будет работать в любой версии Excel.
- Можно выбирать, что именно брать с каждого листа (конкретный фиксированный диапазон или весь лист).
Минусы этого способа:
- Последовательность столбцов на всех листах должна быть одинаковой, т.к. происходит, по сути, тупое копирование таблиц друг-под-друга.
- Защита от макросов должна быть отключена.
- Быстрого обновления, как это было с Power Query, здесь, к сожалению, не будет. При изменении исходных данных придётся запустить макрос повторно.
Способ 3. Готовый макрос из надстройки PLEX
Если лень возиться с макросами или Power Query, то можно пойти по пути наименьшего сопротивления — использовать готовый макрос (кнопка Собрать) из моей надстройки PLEX для Excel. Это, может, и не спортивно, но зато эффективно:
В общем, выбирайте любой удобный вам вариант и действуйте. Выбор — это всегда хорошо.
Ссылки по теме
- Что такое Power Query и с чем его едят.
- Как создавать свои макросы, использовать чужие и запускать их в своих файлах.
- Сборка данных из нескольких файлов с помощью Power Query.
Как посчитать сумму с разных листов в Excel?
Изучим возможности для суммирования данных из ячеек с разных листов книги с помощью использования трехмерных ссылок в Excel.
Приветствую всех, уважаемые читатели блога TutorExcel.Ru.
Практически каждый из нас при работе в Excel хотя бы раз наверняка применял операцию сложения с помощью оператора плюс «+» и различных функций (СУММ, СУММЕСЛИ, СУММЕСЛИМН и т.п.).
В связи с этим часто можно столкнуться с задачей, когда нужно просуммировать данные из одних и тех же ячеек с нескольких листов. К примеру, подвести общий итог для всех филиалов или отделов компании (коих может быть очень много), посчитать сумму за год по всем месяцам, где каждая часть с данными расположена на отдельном листе книги.
К решению этой задачи можно подходить по-разному, рассмотрим несколько вариантов как мы это можно сделать — от медленного и ручного до быстрого и полуавтоматического.
Как сложить листы в Excel?
Вариант 1. Ручной ввод.
Начнем с одной стороны с медленного варианта, но с другой стороны с более понятного и наглядного способа.
Для примера возьмем простую задачу и сложим данные ячейки A1 с трех листов: Лист1, Лист2 и Лист3. Для этого поочередно в формулу записываем ссылки на ячейку с разных листов и знаки сложения «+»:
Это совсем простой вариант. Еще один вариант записи можно аналогично реализовать с помощью функции СУММ:
В реализуемых нами вариантах в общем и целом все хорошо, за исключением большой ручной работы при прощелкивании всех нужных для суммирования ячеек.
Как это часто бывает если нужно посчитать сумму для двух или трех листов, то вышеописанный способ отлично подойдет. Но если усложнить задачу и представить подобный пример не для 3, а, например, для 30 листов, то процесс уже несколько затянется.
Поэтому перейдем к чуть более сложному на первый взгляд варианту, но гораздо более быстрому с точки зрения трудовых и временных затрат.
Вариант 2. Полуавтоматический ввод.
Повторно воспользуемся функцией СУММ, но в этот раз запишем ссылку на листы через двоеточие:
В этом случае общее количество суммируемых листов для нас уже не так важно, главное знать только начальный и конечный.
Поэтому запись для сложения 10 или 20 листов будет примерно такой же — ИмяПервогоЛиста:ИмяПоследнегоЛиста!Диапазон.
Чуть более подробно остановимся на логике формирования формулы. Напомню, что оператор двоеточие в Excel служит для объединения диапазона, который образует ссылку на все ячейки находящиеся между первой и последней (включая сами ячейки). Например, диапазон A1:A10 обозначает двумерную ссылку, в которую попадают все ячейки между первой (A1) и последней (A10).
При добавлении еще одной размерности в виде листов мы получаем так называемую трехмерную ссылку. К примеру, диапазон Лист1:Лист3!A1:A10 содержит все ячейки от Лист1!A1:A10 до Лист3!A1:A10.
Таким образом в нашем примере суммируются все ячейки A1 от Лист1 до Лист3. Но при применении такого способа суммирования есть некоторые тонкости, которые желательно нужно помнить, чтобы случайно не допустить ошибку, давайте подробнее про них поговорим.
Особенности трехмерных ссылок
Как мы уже говорили ранее, при применении трехмерных ссылок нужен только первый и последний лист, промежуточные листы между ними в записи никак не участвуют. Отсюда и возникают следующие тонкости:
- Добавление/копирование листа. Если добавить новый лист или скопировать уже существующий и вставить его между первым и последним (используемых в формуле), то он автоматически будет участвовать в расчете.
Т.е. сама формула не поменяется, а значение вполне может измениться, если на новом листе в тех же ячейках содержатся данные; - Удаление листа. Аналогичный случай примеру выше. При удалении листа формула не изменится, а расчет поменяется в зависимости от удаленных данных (если удалить начальный или конечный листы, то формула изменится, промежуточный — формула останется неизменной);
- Перемещение листа. При перемещении листа в другое место книги формула не изменится, но поменяется набор листов между ними (либо добавятся новые, либо удалятся текущие).
Если описание покажется несколько сложным, в этом случае попробуйте поэкспериментировать с формулой и перестановкой листов на конкретном примере и поймите по какому принципу она работает.
Использование трехмерных ссылок не ограничивается только функциями для сложения данных, а можно использовать большинство математических функций. Поэтому если стоит аналогичная задача для нахождения, к примеру, среднего арифметического или наибольшего с наименьшим, то без проблем применяйте.
Спасибо за внимание!
Если у вас есть мысли или вопросы по теме статьи — пишите и спрашивайте в комментариях.
Microsoft Excel
трюки • приёмы • решения
Как суммировать данные с разных листов книг Excel
Формулы могут работать с ячейками из других листов. Вам просто нужно указать перед ссылкой на ячейку имя листа и восклицательный знак. Например, следующая формула добавляет 12 к значению в ячейке С1 , которая находится на листе Лист2: =Лист2!С1+12 .
Что делать, если вам нужно вычислить сумму всех значений в С1, начиная с листа Лист2 и заканчивая листом Лист6? Следующая формула решает эту задачу: =СУММ(Лист2:Лист6!C1) . В данном случае двоеточие разделяет название первого и последнего листов.
Для создания такой формулы выполните приведенные ниже действия.
- Активизируйте ячейку, которая будет содержать формулу, и наберите =СУММ( .
- Щелкните на вкладке первого листа (в нашем случае это Лист2) и выберите ячейку С1 .
- Нажмите Shift и щелкните на вкладке последнего листа (в нашем случае это Лист6).
- Нажмите Enter, и формула будет введена в ячейку.
В шаге 2 вы можете выбрать диапазон, а не одну-единствениую ячейку. Например, эта формула возвращает сумму C1:F12 для всех листов от Лист2 до Лист6: =СУММ(Лист2:Лист6!С1:Р12) .
Теперь я покажу вам интересный прием, который узнал при прочтении новостных конференций Excel и на обучение в Минске. Если вы хотите просуммировать одну и ту же ячейку со всех листов, кроме текущего, просто введите формулу наподобие этой: =СУММ(‘*’!C1) . Звездочка служит подстановочным символом, который интерпретируется как «все листы, кроме этого одного». Когда вы нажмете клавишу Enter после ввода этой формулы, Excel преобразует формулу, чтобы она использовала фактические имена листов. Это работает, даже если активный лист находится где-нибудь в середине, между другими листами. Например, если книга состоит из шести листов и вы введете приведенную выше формулу в ячейку листа Лист3, Excel создаст следующую формулу: =СУММ(Лист1:Лист2!С1;Лист4:Лист6!C1) .
Но это еще не все. Введите следующую формулу для нахождения суммы ячеек С1 во всех листах, которые начинаются со слова Регион: =СУММ(‘Регион*»!C1) . Excel может преобразовать данную формулу во что-то наподобие этого: =СУММ(Регион1:Регион4!C1) .
Вы также можете использовать подстановочный знак ? — он указывает на любой отдельный символ. Например, при вводе следующей формулы Excel создаст формулу, которая просуммирует значения, начиная с листа Лист1 и заканчивая листом Лист9 (названия, которые содержат одну цифру): =СУММ(‘Лист?’!C1). Этот прием не ограничивается функцией СУММ. Он работает и с другими функциями, такими как СРЗНАЧ, МИН, МАКС.
Сумма одной и той же ячейки на нескольких листах
Задача: у вас есть 12 листов с одинаковой структурой данных, по одному на каждый месяц. Вы бы хотели просуммировать одну и ту же ячейку на каждом листе. Есть ли способ лучше, чем использование =Янв!B4+Фев!B4+Мар!B4+…+Дек!B4?
Решение: вы можете использовать «3D-формулу», например, =СУММ(Янв:Дек!B4), как показано на рис. 1.
Рис. 1. 3D-формулу для суммирования одной и той же ячейки на нескольких листах
Скачать заметку в формате Word или pdf, примеры в формате Excel
Если в имени первого и/или последнего листа содержится пробел, используйте апострофы вокруг пары имен листов: =СУММ( ‘ Янв 2009:Дек ‘ !B5), как показано на рис. 2. Любопытно, что, если пробел есть в имени любого промежуточного листа, апострофы не требуются. Более того, если вы введете апострофы, когда они не требуются, Excel автоматически их уберет.
Рис. 2. Используйте апострофы, если в имени листа есть пробел
Вы можете легко скопировать эту формулу в другие ячейки на листе Итоги.
Подводный камень: не размещайте сводный лист между листами Янв и Дек. Это приведет к циклической ссылке (подробнее о борьбе с последней см. Как найти циклическую ссылку).
Дополнительные сведения: можно создать именованный диапазон, который ссылается на 3D-область. Для этого перейдите к ячейке B4 на лист Янв. Пройдите по меню ФОРМУЛА –> Присвоить имя. В открывшемся окне Создание имени (рис. 3) перейдите в поле Диапазон путем многократного нажатия клавиши Табуляция. При этом всё содержимое поле Диапазон становится выделенным. Удерживая нажатой клавишу Shift кликните на лист Дек. Обратите внимание, что на рис. 3 все листы от Янв по Дек выделены. Нажмите Ok.
Рис. 3. Присвоение имени 3D-диапазону
После этого формулы приобретают «человеческий» вид. Например, =СУММ(Объем_продаж).
Как просуммировать данные с нескольких листов, в том числе по условию
В данной статье я хочу рассказать, как можно просуммировать данные на одном листе из других листов. К примеру: на листах Январь, Февраль и Март расположены данные по продажам, а под ними итог. Допустим, это будет ячейка D7. Если структура всех таблиц одинакова (одинаковое кол-во строк, товар может различаться) и Итог расположен во всех таблицах в одной ячейке, то можно воспользоваться простой формулой:
=СУММ(Январь:Март!D7)
Подобная ссылка на диапазоны называется трехмерной ссылкой. Если между листом Январь и Март добавить еще какой-нибудь лист — то данные с него будут также автоматически просуммированы. Поэтому необходимо следить, чтобы указывались только нужные листы. Минус в том, что таким образом можно просуммировать данные только ячеек листа, расположенных в одном и том же диапазоне(т.е. со всех листов будет взята сумма всех ячеек конкретного диапазона). Так же, трехмерные ссылки не могут быть созданы при помощи ДВССЫЛ(INDIRECT) для динамического указания имен первого и последнего листа.
Но, если необходимо будет просуммировать данные по отдельным товарам со всех листов, а товар расположен в хаотичном порядке, разном для каждого листа и количество строк различается, то здесь такая формула не подойдет. Можно воспользоваться формулой массива, которая несколько неудобна именно в таком виде:
=СУММПРОИЗВ(СУММЕСЛИ(ДВССЫЛ(<«Январь»:»Февраль»:»Март»:»Апрель»:»Май»:»Июнь»>&»!B3:B100″); B2 ;ДВССЫЛ(<«Январь»:»Февраль»:»Март»:»Апрель»:»Май»:»Июнь»>&»!C3:C100″)))
«Январь»:»Февраль»:»Март»:»Апрель»:»Май»:»Июнь» — имена листов, с которых происходит суммирование. Не буду останавливаться подробно на всех вложенных функциях. Про СУММЕСЛИ можно прочитать в этой статье. ДВССЫЛ используется для создания ссылки на диапазон, состоящей из имени листа и адреса ячеек: Январь!B3:B100, Февраль!B3:B100, Март!B3:B100, Апрель!B3:B100, Май!B3:B100, Июнь!B3:B100 . Т.е. мы в формуле переибраем все указанные листы и диапазоны в них.
Важно: если в имени листа встречается пробел, либо иной знак препинания, то имя листа необходимо заключать в апострофы: «‘Январь 2014′»:»‘Февраль 2014′»:»Март»:»Апрель»:»Май»:»Июнь»
либо ставить апострофы заранее для всех листов:
ДВССЫЛ(» ‘ «&<«Январь»:»Февраль»:»Март»:»Апрель»:»Май»:»Июнь»>&» ‘ !C3:C100″)
B3:B100 — диапазон с критериями(при необходимости указать больше строк).
C3:C100 — диапазон суммирования(при необходимости указать больше строк).
В чем главное неудобство — необходимо так или иначе указывать листы, с которых суммировать. Это очень неудобно, если листов много. Во вложении ниже эта формула представлена в двух вариантах: как выше и с использованием дополнительного столбца для перечисления листов (формула в данном случае получается более универсальной и короткой).
Скачать пример суммирования с листов формулой
Tips_All_SumIf_AllSheets_Formula.xls (67,5 KiB, 7 735 скачиваний)
Но в приложенном примере тоже стоит учитывать один момент: при ссылке на диапазон с именами листов, в этом диапазоне не должно быть:
1. Пустых ячеек
2. Имен листов, которые заведомо отсутствуют в книге
При несоблюдении этих правил формула вернет ошибку #ССЫЛКА (#REF!)
Возможно, есть и иные способы суммирования формулой. Может даже есть способ суммировать, не указывая имена листов, но у меня не получилось так сделать без использования VBA. Поэтому я написал свою пользовательскую функцию:
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 Alt + F11 ) -создать стандартный модуль(Insert —Module) и в него вставить скопированный текст. После чего функцию можно будет вызвать из Диспетчера функций( Shift + F3 ), отыскав её в категории Определенные пользователем (User Defined Functions) .
Аргументы функции аналогичны стандартной СУММЕСЛИ, только в конце добавлен еще один, необязательный.
rRange — Ссылка на диапазон ячеек. Указывается диапазон значений, среди которых необходимо искать критерий.
rCriteria — Ссылка на одну ячейку. Указывается ячейка, в которой содержится значение, данные по которому надо просуммировать.
rSumRange — Ссылка на диапазон ячеек. Указывается диапазон сумм или чисел, которые необходимо просуммировать на основании критерия.
bAllSh — Необязательный аргумент. Если не указан, или указано значение 1 или ИСТИНА, то будут суммироваться значения со всех листов, кроме листа, на котором записана функция. Если указано значение 0 или ЛОЖЬ, то будут суммироваться значения с листов, расположенных до листа, на котором записана функция.
Применение обеих функций вы найдете в примере к статье.
Скачать пример
Tips_All_SumIf_Few_Sheets.xls (57,5 KiB, 3 745 скачиваний)
Дополнил статью функцией, которая суммирует данные только с указанных листов, либо со всех, кроме листа с функцией:
Function All_SumIf(rRange As Range, rCriteria As Range, rSumRange As Range, Optional sSheets = «») Dim wsSh As Worksheet, sRange As String, sSumRange As String, asSheets, li As Long sRange = Right(rRange.Address, Len(rRange.Address) — InStr(rRange.Address, «!»)) sSumRange = Right(rSumRange.Address, Len(rSumRange.Address) — InStr(rSumRange.Address, «!»)) If sSheets = «» Then For Each wsSh In Worksheets If wsSh.Name <> Application.Caller.Parent.Name Then sSheets = sSheets & «?» & wsSh.Name Next wsSh sSheets = Mid$(sSheets, 2) End If asSheets = Split(sSheets, «?») For li = LBound(asSheets) To UBound(asSheets) Set wsSh = Sheets(asSheets(li)) If Not wsSh Is Nothing Then All_SumIf = All_SumIf + Application.SumIf(wsSh.Range(sRange), rCriteria, wsSh.Range(sSumRange)) End If Next li End Function
rRange — Ссылка на диапазон ячеек. Указывается диапазон значений, среди которых необходимо искать критерий.
rCriteria — Ссылка на одну ячейку. Указывается ячейка, в которой содержится значение, данные по которому надо просуммировать.
rSumRange — Ссылка на диапазон ячеек. Указывается диапазон сумм или чисел, которые необходимо просуммировать на основании критерия.
sSheets — Необязательный аргумент. Указываются имена листов книги, с которых надо суммировать данные. Имена листов должны быть записаны через вопросительный знак: Февраль?Март. Если аргумент не указан или равен пустой ячейке, то будут суммироваться значения со всех листов, кроме листа, на котором записана функция.
Скачать пример
Tips_All_SumIf_Show_Sheets.xls (59,5 KiB, 2 626 скачиваний)
Очередное дополнение статьи — функция, в которой помимо перечисления листов можно указать книгу, в которой эти листы просматривать:
Function All_SumIf(rRange As Range, rCriteria As Range, rSumRange As Range, Optional sSheets = «», Optional wsAnotherWB As String = «») Dim wsSh As Worksheet, sRange As String, sSumRange As String, asSheets, li As Long Dim wbB As Workbook If wsAnotherWB = «» Then Set wbB = Application.Caller.Parent.Parent Else Set wbB = Workbooks(wsAnotherWB) End If sRange = Right(rRange.Address, Len(rRange.Address) — InStr(rRange.Address, «!»)) sSumRange = Right(rSumRange.Address, Len(rSumRange.Address) — InStr(rSumRange.Address, «!»)) If sSheets = «» Then For Each wsSh In wbB.Worksheets If wsSh.Name <> Application.Caller.Parent.Name Then sSheets = sSheets & «?» & wsSh.Name Next wsSh sSheets = Mid$(sSheets, 2) End If asSheets = Split(sSheets, «?») For li = LBound(asSheets) To UBound(asSheets) Set wsSh = wbB.Sheets(asSheets(li)) If Not wsSh Is Nothing Then All_SumIf = All_SumIf + Application.SumIf(wsSh.Range(sRange), rCriteria, wsSh.Range(sSumRange)) End If Next li End Function
Аргументы и их использование полностью совпадают с описанием выше. Опишу только последний аргумент:
wsAnotherWB — Необязательный аргумент. Указываются имя книги, в которой будут просматриваться листы, указанные параметром sSheets. Если аргумент wsAnotherWB не указан — листы просматриваются в книге, с листа которой вызвана функция. Если какого-либо из указанных листов не будет в указанной книге — функция вернет ошибку.
Статья помогла? Поделись ссылкой с друзьями!
Excel At Excel вып.3: Собираем данные с разных листов
Дано: 22 таблицы унифицированного формата с перечнем помещений от 22 дочерних предприятий.
Задача: сделать сводную таблицу с данными всех 22 таблиц
Итак, решение. Есть три варианта решения данной задачи. Первый — использовать встроенную (начиная с excel 2013) надстройку PowerPivot (об этом методе мы поговорим позднее). Второй — посредством сводной таблицы через несколько диапазонов консолидации. Не люблю этот метод, т.к. такая сводная таблица имеет существенно более ограниченный функционал по сравнению с простой сводной таблицей. Наконец, третий вариант — это создать общую таблицу с использованием функции INDIRECT (ДВССЫЛ). Этому методу и посвятим сегодня наш пост.
Что мы имеем? 22 одинаковых по формату таблицы на отдельных листах и с разным количеством строк в каждой. Соответственно, для построения общей таблицы нам надо решить следующие «проблемы»:
1) как заставить общую таблицу «переключаться» с одного листа данных на другой?;
2) как заставить ее делать это в нужный момент (когда закончились строки на одном листе)?
Начнем со второго вопроса, т.к. ответ на него мы уже знаем. Это циклы, о которых мы подробно говорили в выпуске 2 «Циклы в Excel без VBA». Для решения проблемы достаточно в наш файл добавить лист с перечнем всех обществ, соответствующими названиями листов и количеством подсчетом количества строк на каждом таком листе.
Обратите внимание на формулу в столбце Кол-во записей. Мы могли бы использовать просто COUNTA (СЧЁТА) со ссылкой на каждый лист. Но это потребует времени для «линковки» каждого листа. Плюс мы с вами готовим универсальные решения, которые будут работать в независимости от количества листов.
Именно для этого в функцию COUNTA (СЧЁТА) и внедряется эта чуднАя функция INDIRECT (ДВССЫЛ). Остановимся на ней подробнее.
Функция имеет, по сути, единственный параметр — ref_text (ссылка_на_текст). Что делает эта функция? Всего-навсего преобразует текст в ссылку на ячейку. То есть она преобразует текст, например, «А1» в ссылку и возвращает значение ячейки А1.
Соответственно, зная несложные правила работы с текстом в Excel, мы можем легко сделать текст внутри изменяемым, а значит можем сделать и изменяемыми ссылки, которые будет возвращать функция INDIRECT (ДВССЫЛ).
Разберем пример выше. Функция INDIRECT (ДВССЫЛ) имеет следующий вид:
Чтобы понять, что означает текст внутри нее, давайте вспомним, как выглядит в Excel ссылка на ячейку на другом листе. Вот так:
Соответственно, в нашем случае у нас неизменен столбец B:B, а вот название листа меняется. Для «автоматизации» формулы заменяем Название листа на ссылку на название листа с данными по соответствующему обществу (столбец Название листа). Получаем следующее:
где все, что подчеркнуто — текст, а выделено жирным — ссылки.
ВАЖНО! Обратите внимание на кавычки и конкатенацию («склеивание») при помощи амперсента. Не забудьте, что текст вносится в кавычках и соединяется со ссылками при помощи символа &.
Получается, что INDIRECT (ДВССЫЛ) получает название листа из ячеек в столбце А:А (Название листа), а диапазон у нас прописан фиксированно текстом (В:В). COUNTA (СЧЁТА) же просто считает количество строк в столбце В:В на соответствующем листа за вычетом заголовка.
Перейдем к формированию общей таблицы. Как вы уже наверное прикинули, у нас будет два вложенных цикла: один — количество обществ, второй — количество записей на листе данных по соответствующему обществу. Соответственно, нам потребуются два вспомогательных столбца (определим их в столбцы А и В). Ровно так же, как мы делали на примере в выпуске 2 «Циклы в Excel без VBA», пишем формулу первого цикла:
=IF(A2=»»;»»;IF(COUNTIF($A$2:A2;A2)=OFFSET(‘Список обществ’!$E$2;A2-1;0);IF(A2+1>COUNTA(‘Список обществ’!A:A)-1;»»;A2+1);A2))
Затем пишем формулу второго цикла:
Далее при помощи уже знакомой нам функции OFFSET (СМЕЩ) заполняем столбцы из таблицы на листе Список обществ.
Осталось подтянуть данные с 22 листов по обществам. Тут нам опять поможет OFFSET (СМЕЩ), но уже в паре с INDIRECT (ДВССЫЛ).
OFFSET (СМЕЩ) передает в формулу название листа, а конструкция B2+1 — номер строки в столбце Е на том листе.
ВАЖНО! Обратите внимание, что OFFSET (СМЕЩ) вкладывается внутрь INDIRECT (ДВССЫЛ), а не наоборот.
Формулы могут работать с ячейками из других листов. Вам просто нужно указать перед ссылкой на ячейку имя листа и восклицательный знак. Например, следующая формула добавляет 12 к значению в ячейке С1
, которая находится на листе Лист2: =Лист2!С1+12
.
Что делать, если вам нужно вычислить сумму всех значений в С1, начиная с листа Лист2 и заканчивая листом Лист6? Следующая формула решает эту задачу: =СУММ(Лист2:Лист6!C1)
. В данном случае двоеточие разделяет название первого и последнего листов.
Для создания такой формулы выполните приведенные ниже действия.
- Активизируйте ячейку, которая будет содержать формулу, и наберите
=СУММ(
. - Щелкните на вкладке первого листа (в нашем случае это Лист2) и выберите ячейку
С1
. - Нажмите Shift и щелкните на вкладке последнего листа (в нашем случае это Лист6).
- Нажмите Enter, и формула будет введена в ячейку.
В шаге 2 вы можете выбрать диапазон, а не одну-единствениую ячейку. Например, эта формула возвращает сумму C1:F12
для всех листов от Лист2 до Лист6: =СУММ(Лист2:Лист6!С1:Р12)
.
Теперь я покажу вам интересный прием, который узнал при прочтении новостных конференций Excel и на обучение в Минске. Если вы хотите просуммировать одну и ту же ячейку со всех листов, кроме текущего, просто введите формулу наподобие этой: =СУММ('*'!C1)
. Звездочка служит подстановочным символом, который интерпретируется как «все листы, кроме этого одного». Когда вы нажмете клавишу Enter после ввода этой формулы, Excel преобразует формулу, чтобы она использовала фактические имена листов. Это работает, даже если активный лист находится где-нибудь в середине, между другими листами. Например, если книга состоит из шести листов и вы введете приведенную выше формулу в ячейку листа Лист3, Excel создаст следующую формулу: =СУММ(Лист1:Лист2!С1;Лист4:Лист6!C1)
.
Но это еще не все. Введите следующую формулу для нахождения суммы ячеек С1 во всех листах, которые начинаются со слова Регион: =СУММ('Регион*"!C1)
. Excel может преобразовать данную формулу во что-то наподобие этого: =СУММ(Регион1:Регион4!C1)
.
Вы также можете использовать подстановочный знак ? — он указывает на любой отдельный символ. Например, при вводе следующей формулы Excel создаст формулу, которая просуммирует значения, начиная с листа Лист1 и заканчивая листом Лист9 (названия, которые содержат одну цифру): =СУММ(‘Лист?’!C1). Этот прием не ограничивается функцией СУММ. Он работает и с другими функциями, такими как СРЗНАЧ, МИН, МАКС.
Подсчет является неотъемлемой частью анализа данных, будь то определение численности сотрудников отдела в организации или количества единиц, проданных поквартально. В Excel есть несколько методов для подсчета ячеек, строк или столбцов данных. В этой статье содержится полный обзор методов, загружаемая книга с интерактивными примерами и ссылки на связанные темы для более подробного понимания.
Примечание: Подсчет не следует путать с суммированием. Дополнительные сведения о сумме значений в ячейках, столбцах или строках см. в статье Сумминг способов сложить и подсчитать Excel данных.
Скачивание примеров
Вы можете скачать образец книги, в дополнение к сведениям в этой статье, с примерами. В большинстве разделов этой статьи приводится ссылка на соответствующий таблицу в книге примера, которая содержит примеры и дополнительные сведения.
Скачивание примеров для подсчета значений в электронных таблицах
В этой статье
-
Простой подсчет
-
Использование автосуммирования
-
Добавление строки «Подытая»
-
Подсчет ячеек в списке или столбце таблицы Excel с помощью функции ПРОМЕЖУТОЧНЫЕ.ИТОГИ
-
-
Подсчет на основе одного или нескольких условий
-
Видео: использование функций СЧЁТ, СЧЁТЕСЛИ и СЧЁТЗ
-
Подсчет ячеек в диапазоне с помощью функции СЧЁТ
-
Подсчет ячеек в диапазоне на основе одного условия с помощью функции СЧЁТЕСЛИ
-
Подсчет ячеек в столбце на основе одного или нескольких условий с помощью функции БСЧЁТ
-
Подсчет ячеек в диапазоне на основе нескольких условий с помощью функции СЧЁТЕФС
-
Подсчет количества вхождений на основе условий с помощью функций СЧЁТ и ЕСЛИ
-
Подсчет количества вхождений нескольких текстовых и числовых значений с помощью функций СУММ и ЕСЛИ
-
Подсчет ячеек в столбце или строке в pivotTable
-
-
Подсчет, если данные содержат пустые значения
-
Подсчет непустых ячеек в диапазоне с помощью функции СЧЁТ
-
Подсчет непанковых ячеек в списке с определенными условиями с помощью функции БДСУНТА
-
Подсчет пустых ячеек в смежном диапазоне с помощью функции СЧИТАТЬПУСТОТЫ
-
Подсчет пустых ячеек в несмежном диапазоне с помощью сочетания функций СУММ и ЕСЛИ
-
-
Подсчет частоты вхождения уникальных значений
-
Подсчет количества уникальных значений в столбце списка с помощью расширенного фильтра
-
Подсчет количества уникальных значений в диапазоне, которые отвечают одному или несколько условиям, с помощью функций ЕСЛИ, СУММ, ЧАСТОТА, СОВПАДЕНИЕ и LEN
-
-
Особые случаи (подсчет всех ячеек, подсчет слов)
-
Подсчет общего количества ячеек в диапазоне с помощью функций ЧСТРОК и ЧИСЛСТОЛБ
-
Подсчет слов в диапазоне с помощью сочетания функций СУММ, ЕСЛИ, LEN, TRIM и SUBSTITUTE
-
-
Отображение вычислений и подсчетов в строке состояния
Простой подсчет
Подсчитать количество значений в диапазоне можно с помощью простой формулы, кнопки или функции.
Excel также можно отобразить количество выбранных ячеек на Excel строка состояния. Чтобы узнать, как это сделать, посмотрите видеоролик, в котором по этой теме вы можете быстро увидеть, как это сделать. Дополнительные сведения см. в разделе Отображение вычислений и подсчетов в панели состояния. Вы можете ссылаться на значения, показанные в панели состояния, если вам нужно быстро взглянуть на данные и не уходить от времени на ввод формул.
Видео: подсчет ячеек с помощью строки состояния Excel
Просмотрите видео, чтобы узнать, как просмотреть количество в панели состояния.
Использование автосуммирования
Для этого вы можете выбрать диапазон ячеек, содержащий хотя бы одно числовые значения. Затем на вкладке Формулы нажмите кнопку Автоумма > чисел.
Excel возвращает количество числных значений в диапазоне ячейки, смежной с выбранным диапазоном. Как правило, этот результат отображается в ячейке справа для горизонтального диапазона или в ячейке снизу для вертикального диапазона.
К началу страницы
Добавление строки «Подытая»
Вы можете добавить строку подытвного Excel данных. Щелкните в любом месте данных и выберите в > данные.
Примечание: Параметр «Подытая» работает только с обычными Excel данными, а не Excel таблицами, сетными таблицами и сетными таблицами.
Кроме того, обратитесь к следующим статьям:
-
Структурирование (группировка) данных на листе
-
Вставка промежуточных итогов в списке данных на листе
К началу страницы
Подсчет ячеек в списке или столбце таблицы Excel с помощью функции ПРОМЕЖУТОЧНЫЕ.ИТОГИ
Функция SUBTOTAL используется для подсчета количества значений в Excel или диапазоне ячеек. Если таблица или диапазон содержат скрытые ячейки, можно использовать функцию SUBTOTAL, чтобы включить или исключить эти скрытые ячейки, что является самым большим различием между функциями СУММ и ИТОГИ.
Синтаксис SUBTOTAL выглядит так:
ПРОМЕЖУТОЧНЫЕ.ИТОГИ(номер_функции;ссылка1;[ссылка2];…])
Чтобы включить скрытые значения в диапазон, для аргумента function_num следует установить значение 2.
Чтобы исключить скрытые значения в диапазоне, function_num значение 102.
К началу страницы
Подсчет на основе одного или нескольких условий
С помощью ряда функций можно подсчитать количество ячеек в диапазоне, удовлетворяющих заданным условиям (критериям).
Видео: использование функций СЧЁТ, СЧЁТЕСЛИ и СЧЁТЗ
В видеоролике ниже показано, как использовать функцию СЧЁТ, а также функции СЧЁТЕСЛИ и СЧЁТЗ для подсчета только тех ячеек, которые удовлетворяют заданным условиям.
К началу страницы
Подсчет ячеек в диапазоне с помощью функции СЧЁТ
Чтобы подсчитать количество числовых значений в диапазоне, используйте в формуле функцию СЧЁТ.
В примере выше ячейки A2, A3 и A6 содержат числовые значения в диапазоне, поэтому результат — 3.
Примечание: A7 — это значение времени, но оно содержит текст(a.m.),поэтому COUNT не считает его числом. Если вы удалите a.m. В ячейке счёт будет считать A7 числом и изменит результат на 4.
К началу страницы
Подсчет ячеек в диапазоне на основе одного условия с помощью функции СЧЁТЕСЛИ
С помощью функции СЧЁТЕФ можно подсчитать, сколько раз определенное значение отображается в диапазоне ячеек.
К началу страницы
Подсчет ячеек в столбце на основе одного или нескольких условий с помощью функции БСЧЁТ
Функция Б СЧЁТ подсчитывают ячейки, содержащие числа в поле (столбце) записей списка или базы данных, которые соответствуют за условиям, за которые вы указываете.
В следующем примере нужно подсчитать количество месяцев, включая или более поздние месяцы марта 2016 г., в которых было продано более 400 единиц товаров. Первая таблица на этом сайте (от А1 до B7) содержит данные о продажах.
В DCOUNT используются условия для определения того, откуда следует возвратить значения. Условия обычно вются в ячейки на самом на этом же самом телефоне, а затем ссылаются на эти ячейки в аргументе условия. В этом примере ячейки A10 и B10 содержат два условия: одно, которое указывает, что возвращаемого значения должно быть больше 400, а другое, которое указывает, что конец месяца должен быть равен или больше 31 марта 2016 г.
Используйте следующий синтаксис:
=БСКП(A1:B7;»Конец месяца»;A9:B10)
DCOUNT проверяет данные в диапазоне A1—B7, применяет условия, заданные в A10 и B10, и возвращает 2, общее количество строк, которые удовлетворяют обоим условиям (строки 5 и 7).
К началу страницы
Подсчет ячеек в диапазоне на основе нескольких условий с помощью функции СЧЁТЕФС
Функция СЧЁТЕСЛИМН аналогична функции СЧЁТЕСЛИ с одним важным исключением: СЧЁТЕСЛИМН позволяет применить критерии к ячейкам в нескольких диапазонах и подсчитывает число соответствий каждому критерию. С функцией СЧЁТЕСЛИМН можно использовать до 127 пар диапазонов и критериев.
Синтаксис функции СЧЁТЕСЛИМН имеет следующий вид:
СЧЁТЕСЛИМН(диапазон_условия1; условие1; [диапазон_условия2; условие2]; …)
См. пример ниже.
К началу страницы
Подсчет количества вхождений на основе условий с помощью функций СЧЁТ и ЕСЛИ
Предположим, вам нужно определить, сколько продавцов продали определенный товар в определенном регионе или сколько продаж было сделано конкретным продавцом. Функции ЕСЛИ и СЧЁТ можно использовать вместе. то есть сначала для проверки условия используется функция ЕСЛИ, а затем для подсчета ячеек используется функция СЧЁТ, только если функция ЕСЛИ имеет true.
Примечания:
-
Формулы, приведенные в этом примере, должны быть введены как формулы массива. Если эта книга открыта в приложении Excel для Windows или Excel 2016 для Mac и вы хотите изменить формулу или создать похожую, нажмите клавишу F2, а затем клавиши CTRL+SHIFT+ВВОД, чтобы формула возвращала нужные результаты. В более ранних версиях Excel для Mac используйте
+SHIFT+ВВОД.
-
Чтобы эти примеры формул работали, вторым аргументом функции ЕСЛИ должно быть число.
К началу страницы
Подсчет количества вхождений нескольких текстовых и числовых значений с помощью функций СУММ и ЕСЛИ
В следующих примерах функции ЕСЛИ и СУММ используются вместе. Функция ЕСЛИ сначала проверяет значения в определенных ячейках, а затем, если возвращается значение ИСТИНА, функция СУММ складывает значения, удовлетворяющие условию.
Пример 1
Функция выше означает, что если диапазон C2:C7 содержит значения Шашков и Туманов, то функция СУММ должна отобразить сумму записей, в которых выполняется условие. Формула найдет в данном диапазоне три записи для «Шашков» и одну для «Туманов» и отобразит 4.
Пример 2
Функция выше означает, что если ячейка D2:D7 содержит значения меньше 9 000 ₽ или больше 19 000 ₽, то функция СУММ должна отобразить сумму всех записей, в которых выполняется условие. Формула найдет две записи D3 и D5 со значениями меньше 9 000 ₽, а затем D4 и D6 со значениями больше 19 000 ₽ и отобразит 4.
Пример 3
Функция выше говорит, что если в D2:D7 есть счета за сумму менее 9 000 рублей, функция СУММ должна отобразить сумму записей, в которых должно быть выполнены условия. Формула найдет ячейку C6, которая соответствует условию, и отобразит 1.
Важно: Формулы в этом примере должны быть введены как формулы массива. Это означает, что сначала нужно нажать клавишу F2, а затем клавиши CTRL+SHIFT+ВВОД. В более ранних версиях Excel для Mac используйте клавиши +SHIFT+ВВОД.
Дополнительные советы см. в следующих статьях базы знаний:
-
Использование функции СУММ(ЕСЛИ()) в качестве функции массива вместо функции СЧЁТЕСЛИ() с критериями И и ИЛИ в Excel
-
Использование частоты вхождения числа или текста в диапазоне в Excel
К началу страницы
Подсчет ячеек в столбце или строке в pivotTable
В одной из них можно подвести итоговые данные, а также проанализировать их и проанализировать, а затем выбрать категории, по которым вы хотите просмотреть данные.
Чтобы быстро создать сводную таблицу, выделите любую ячейку в диапазоне данных или таблице Excel, а затем на вкладке Вставка в группе Таблицы щелкните Сводная таблица.
Рассмотрим пример электронной таблицы «Продажи», в которой можно подсчитать количество значений продаж для разделов «Гольф» и «Теннис» за конкретные кварталы.
Примечание: Для интерактивного впечатления вы можете выполнить эти действия с образцом данных, указанным на листе таблицы в книге для скачивания.
-
Введите данные в электронную таблицу Excel.
-
Выделите диапазон A2:C8
-
Выберите Вставка > Сводная таблица.
-
В диалоговом окне «Создание сводной таблицы» установите переключатель Выбрать таблицу или диапазон, а затем — На новый лист и нажмите кнопку ОК.
Пустая сводная таблица будет создана на новом листе.
-
В области «Поля сводной таблицы» выполните одно из указанных ниже действий.
-
Перетащите элемент Спорт в область Строки.
-
Перетащите элемент Квартал в область Столбцы.
-
Перетащите элемент Продажи в область Значения.
-
Повторите третье действие.
Имя поля Сумма_продаж_2 отобразится и в области «Сводная таблица», и в области «Значения».
На этом этапе область «Поля сводной таблицы» будет выглядеть так:
-
В области Значения щелкните стрелку раскрывающегося списка рядом с полем Сумма_продаж_2 и выберите пункт Параметры поля значений.
-
В диалоговом окне Параметры поля значений выполните указанные ниже действия.
-
На вкладке Операция выберите пункт Количество.
-
В поле Пользовательское имя измените имя на Количество.
-
Нажмите кнопку ОК.
-
Сводная таблица отобразит количество записей для разделов «Гольф» и «Теннис» за кварталы 3 и 4, а также показатели продаж.
-
К началу страницы
Подсчет, если данные содержат пустые значения
С помощью функций можно подсчитать количество ячеек, содержащих данные или являющихся пустыми.
Подсчет непустых ячеек в диапазоне с помощью функции СЧЁТ
Функция СЧЁТС используется для подсчета только ячеек в диапазоне, который содержит значения.
Иногда при подсчете ячеек удобнее пропускать пустые ячейки, поскольку смысловую нагрузку несут только ячейки со значениями. Например, вы хотите подсчитать общее количество продавцов, которые сделали продажу (столбец D).
СчётА игнорирует пустые значения в ячейках D3, D4, D8 и D11 и подсчитывают только ячейки, содержащие значения в столбце D. Функция находит шесть ячеек в столбце D, содержащих значения, и выводит 6.
К началу страницы
Подсчет непанковых ячеек в списке с определенными условиями с помощью функции БДСУНТА
С помощью функции БСЧЁТА можно подсчитать количество непустых ячеек, которые удовлетворяют заданным условиям, в столбце записей в списке или базе данных.
В следующем примере функция БВАРУТА используется для подсчета количества записей в базе данных, содержащихся в диапазоне A1:B7, которые соответствуют условиям, заданным в диапазоне условий A9:B10. При этом значение «ИД товара» должно быть больше или равно 2000, а значение «Оценки» — больше или равно 50.
Округлта находит две строки, которые соответствуют условиям— строки 2 и 4, и отображает значение 2 в качестве результата.
К началу страницы
Подсчет пустых ячеек в смежном диапазоне с помощью функции СЧИТАТЬПУСТОТЫ
Функция СЧИТАТЬПУСТОТЫ возвращает количество пустых ячеек в смешаемом диапазоне (ячейки являются связанными, если они соединены в непрерывной последовательности). Если ячейка содержит формулу, которая возвращает пустой текст («»), эта ячейка включается в подсчет.
Иногда требуется включить в подсчет и пустые ячейки. В следующем примере таблица продаж продуктов. Предположим, вы хотите узнать, сколько ячеек не упомянуты в данных о продажах.
Примечание: Функция СЧИТАТЬПУСТОТЫ — это наиболее удобный способ определения количества пустых ячеек в диапазоне, но это не очень удобно, если интересующие вас ячейки находятся в закрытой книге или не образуют несоединимый диапазон. В статье базы знаний XL: использование функции СУММ(ЕСЛИ()) вместо функции Считатьblank() показывает, как в таких случаях использовать формулу массива СУММ(ЕСЛИ()).
К началу страницы
Подсчет пустых ячеек в несмежном диапазоне с помощью сочетания функций СУММ и ЕСЛИ
Используйте сочетание функций СУММ и ЕСЛИ. Как правило, это можно сделать с помощью функции ЕСЛИ в формуле массива, чтобы определить, содержит ли каждая ячейка значение, а затем суммирует количество значений ЛОЖЬ, возвращенных формулой.
См. несколько примеров комбинаций функций СУММ и ЕСЛИ из предыдущего раздела Подсчет количества ветвей нескольких текстовых или числового значений с помощью функций СУММ и ЕСЛИ.
К началу страницы
Подсчет частоты вхождения уникальных значений
Для подсчета уникальных значений в диапазоне можно использовать с помощью одновременной работы с помощью функций с помощью стебли с помощью стеблицы, функции СЧЁТЕФИЛЬТР, СУММи ЕСЛИ либо диалоговое окно Расширенный фильтр.
Подсчет количества уникальных значений в столбце списка с помощью расширенного фильтра
С помощью диалогового окна Расширенный фильтр можно найти уникальные значения в столбце данных. Эти значения можно отфильтровать на месте или извлечь их и вставить в другое место. Затем с помощью функции ЧСТРОК можно подсчитать количество элементов в новом диапазоне.
Чтобы использовать расширенный фильтр, на вкладке Данные в группе Сортировка & фильтр нажмите кнопку Дополнительные.
На рисунке ниже показано, как с помощью расширенного фильтра скопировать только уникальные записи в другое место на листе.
На рисунке ниже столбец E содержит значения, скопированные из диапазона в столбце D.
Примечания:
-
При фильтрации значений на месте они не удаляются с листа, просто одна или несколько строк могут быть скрыты. Чтобы снова отобразить эти значения, на вкладке Данные в группе Сортировка и фильтр нажмите кнопку Очистить.
-
Если вам нужно только быстро узнать количество уникальных значений, выделите данные после применения расширенного фильтра (фильтрованные или скопированные данные) и взгляните на строку состояния. Значение Количество, показанное в строке состояния, должно совпадать с количеством уникальных значений.
Дополнительные сведения см. в теме Фильтрация с помощью расширенных критериев.
К началу страницы
Подсчет количества уникальных значений в диапазоне, которые отвечают одному или несколько условиям, с помощью функций ЕСЛИ, СУММ, ЧАСТОТА, СОВПАДЕНИЕ и LEN
Используйте функции ЕСЛИ, СУММ, ЧАСТОТА, ПОИСКПОЗ и ДЛСТР в разных сочетаниях.
Дополнительные сведения и примеры см. в разделе «Подсчет количества уникальных значений с помощью функций» статьи Подсчет количества уникальных значений среди дубликатов.
К началу страницы
Особые случаи (подсчет всех ячеек, подсчет слов)
Используя разные сочетания функций, можно подсчитать количество ячеек или количество слов в диапазоне.
Подсчет общего количества ячеек в диапазоне с помощью функций ЧСТРОК и ЧИСЛСТОЛБ
Предположим, вам нужно определить размер большого листа, чтобы решить, как выполнять вычисления в книге: автоматически или вручную. Чтобы подсчитать количество всех ячеек в диапазоне, используйте формулу, которая умножает возвращаемые значения с помощью функций СТРОКИ и СТОЛБЦЫ. Пример:
К началу страницы
Подсчет слов в диапазоне с помощью сочетания функций СУММ, ЕСЛИ, LEN, TRIM и SUBSTITUTE
В формуле массива можно использовать сочетание функций СУММ,ЕСЛИ,LEN,TRIMи SUBSTITUTE. В следующем примере показан результат использования вложенной формулы для поиска количества слов в диапазоне из 7 ячеек (3 из них пустые). Некоторые ячейки содержат ведущие или концевую часть пробелов. Функции СРЕЗ и ПОДСТАВИТЬ удаляют эти лишние пробелы перед подсчетом. См. пример ниже.
Теперь для правильной работы формулы выше необходимо сделать ее формулой массива, иначе формула возвращает #VALUE! ошибку «#ВЫЧИС!». Для этого щелкните ячейку с формулой, а затем в панели формул нажмите CTRL+SHIFT+ВВОД. Excel добавляет фигурную скобку в начале и конце формулы, сделав ее формулой массива.
Дополнительные сведения о формулах массива см. в Excel и Создание формулы массива.
К началу страницы
Отображение вычислений и подсчетов в строке состояния
При выделении одной или нескольких ячеек информация о данных в них отображается в строке состояния Excel. Например, если на листе выделены четыре ячейки, которые содержат значения 2, 3, текстовую строку (например, «облако») и 4, то в строке состояния могут одновременно отображаться следующие значения: среднее значение, количество выделенных ячеек, количество ячеек с числовыми значениями, минимальное значение, максимальное значение и сумма. Чтобы отобразить или скрыть все или любые из этих значений, щелкните строку состояния правой кнопкой мыши. Эти значения показаны на приведенном ниже рисунке.
К началу страницы
Дополнительные сведения
Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.
Хитрости »
14 Май 2012 168019 просмотров
Как просуммировать данные с нескольких листов, в том числе по условию
Достаточно распространенная ситуация: в книге ведутся данные по продажам, разбивая каждый месяц на отдельный лист с именем месяца. Т.е. в листах Январь, Февраль и Март и т.д. расположены данные по продажам, а в ячейке C33 подводится общий итог за месяц. И на отдельном листе необходимо просуммировать все продажи по всем листам. Если структура всех таблиц одинакова (одинаковое кол-во строк, товар может различаться) и Итог расположен во всех таблицах в одной ячейке, то можно воспользоваться простой формулой:
=СУММ(Январь:Март!C33)
=SUM(Январь:Март!C33)
Как это сделать без указания имен листов вручную:
- вбиваем в итоговую ячейку функцию СУММ(SUM)
- для указания аргументов переходим на первый лист, данные которого необходимо суммировать
- далее зажимаем клавишу Shift и выделяем последний лист(если необходимо выделить несмежные листы – зажимаем клавишу Ctrl)
- указываем адрес ячейки для суммирования и жмем Enter
Подобная ссылка на диапазоны называется трехмерной ссылкой. Если между листом Январь и Март добавить еще какой-нибудь лист — то данные с него будут также автоматически включены в функцию суммирования, приведенную выше. Поэтому необходимо следить, чтобы указывались только нужные листы или диапазон листов ОТ и ДО. Если листов много и суммировать необходимо данные одной ячейки со всех листов, кроме того, в котором сама функция, то можно записать так:
=СУММ(‘*’!C33)
=SUM(‘*’!C33)
После того, как введет такую функцию в ячейку, Excel сам подставит в правильном виде имена всех листов для суммирования, даже если они идут не по порядку. Т.е. лист суммирования не обязательно должен быть в самом начале книги или в конце — он может быть и в середине — функция его автоматически уберет из суммирования в момент ввода функции.
Звездочка в данном случае является подстановочным символом, который заменяет собой любое количество любых символов. Т.е. в данном случае, как бы говорящим Excel: имя листа может быть любым. Поэтому, если надо суммировать только конкретные ячейки, но не со всех листов, а только с листов, начинающихся со слова «Отчет» — можно функцию записать так:
=СУММ(‘Отчет*’!C33)
=SUM(‘Отчет*’!C33)
Зная этот прием, можно заранее подготовить книгу, чтобы имена листов имели такие названия, по которым можно будет суммировать данные только с нужных в зависимости от ситуации(например, для каждой категории листов свое обозначение: «-год-«,»-месяц-«,»-квартал-» и т.п.).
К слову, подобное использование функции доступно и для родственных СУММ: СЧЁТ(COUNT), СРЗНАЧ(AVERAGE), МИН(MIN) и МАКС(MAX)
Минус такой функции в том, что таким образом можно просуммировать данные только ячеек листа, расположенных в одном и том же диапазоне(т.е. со всех листов будет взята сумма всех ячеек конкретного диапазона — в примере будут просуммированы данные из одной ячейки C33 всех листов). А использование функции ДВССЫЛ(INDIRECT) для динамического указания имен первого и последнего листа при этом не допускается.
А значит, если необходимо будет просуммировать данные по отдельным товарам со всех листов, а товары расположены в каждом листе в хаотичном порядке, разном для каждого листа и количество строк различается — такая формула не подойдет. Но можно воспользоваться чуть более сложной формулой:
=СУММПРОИЗВ(СУММЕСЛИ(ДВССЫЛ({«Январь»:»Февраль»:»Март»:»Апрель»:»Май»:»Июнь»}&»!B3:B100″);B3;ДВССЫЛ({«Январь»:»Февраль»:»Март»:»Апрель»:»Май»:»Июнь»}&»!C3:C100″)))
=SUMPRODUCT(SUMIF(INDIRECT({«Январь»;»Февраль»;»Март»;»Апрель»;»Май»;»Июнь»}&»!B3:B100″),B3,INDIRECT({«Январь»;»Февраль»;»Март»;»Апрель»;»Май»;»Июнь»}&»!C3:C100″)))
В данном случае названия товаров записаны в столбце B, а суммы — в столбце С
- «Январь»:»Февраль»:»Март»:»Апрель»:»Май»:»Июнь» — имена листов, с которых происходит суммирование. Важно помнить, что имена листов должны быть точь-в-точь как в книге(со всеми пробелами, точками и запятыми), иначе будет ошибка. Не буду останавливаться подробно на всех вложенных функциях. Про СУММЕСЛИ(SUMIF) можно прочитать в этой статье. ДВССЫЛ(INDIRECT) используется для создания ссылки на диапазон, состоящей из имени листа и адреса ячеек: Январь!B3:B100, Февраль!B3:B100, Март!B3:B100, Апрель!B3:B100, Май!B3:B100, Июнь!B3:B100. Т.е. мы в формуле перебираем все указанные листы, создаем диапазоны в каждом из них и суммируем на основании критерия при помощи СУММЕСЛИ. А при помощи СУММПРОИЗВ(SUMPRODUCT) суммируем полученные от СУММЕСЛИ результаты в единое число.
Важно: если в имени листа встречается пробел, либо иной знак препинания, то имя листа необходимо заключать в апострофы: «‘Январь 2014′»:»‘Февраль 2014′»:»Март»:»Апрель»:»Май»:»Июнь»
либо ставить апострофы заранее для всех листов:
ДВССЫЛ(«‘»&{«Январь»:»Февраль»:»Март»:»Апрель»:»Май»:»Июнь»}&»‘!C3:C100″) - B3:B100- диапазон в каждом листе, в котором искать критерий (при необходимости указать больше строк)
- B3- ссылка на ячейку в итоговом листе, содержащую критерий
- C3:C100 — диапазон в каждом листе, ячейки из которого надо суммировать (при необходимости указать больше строк)
В чем главное неудобство — необходимо так или иначе указывать листы, с которых суммировать. Если листов много, то перечислить их все в формуле будет не так-то просто. В таком случае можно записать имена листов в отдельный диапазон и ссылаться на него в формуле(формула в данном случае получается более универсальной и короткой):
=СУММПРОИЗВ(СУММЕСЛИ(ДВССЫЛ(«‘»&$H$3:$H$8&»‘!B3:B100»);B3;ДВССЫЛ(«‘»&$H$3:$H$8&»‘!C3:C100»)))
=SUMPRODUCT(SUMIF(INDIRECT(«‘»&$H$3:$H$8&»‘!B3:B100»),B3,INDIRECT(«‘»&$H$3:$H$8&»‘!C3:C100»)))
Но и она имеет свои недостатки:
- нельзя указать диапазон имен листов «с запасом». Т.е. если у нас имена листов записаны в диапазоне H3:H8, то нельзя в формуле указать H3:H10
- в диапазоне с перечислением листов не должно быть пустых ячеек
- в диапазоне с перечислением листов не должно быть имен листов, которые заведомо отсутствуют в книге. Например, если имя листа записано с опечаткой
Если хоть одно из этих условий не выполняется — формула вернет ошибку #ССЫЛКА!(#REF!)
Плюс иногда именно перечисление листов напрямую в формуле удобнее. Например, если нет возможности выделить для этого отдельный диапазон.
Поэтому во вложении ниже эта формула представлена в двух вариантах: со статичным перечислением имен листов и с использованием дополнительного столбца для перечисления листов. А какую именно использовать — придется решать по ситуации.
Так же в примере перечислены все варианты суммирования, включая разбираемые ниже с использованием Visual Basic for Applications
Скачать пример суммирования с листов формулой
Суммировать со всех листов.xls (134,0 KiB, 12 707 скачиваний)
Возможно, есть и иные способы суммирования формулой. Может даже есть способ суммировать, не указывая имена листов, но у меня не получилось так сделать без использования VBA. Поэтому я написал свою пользовательскую функцию:
'--------------------------------------------------------------------------------------- ' Function : СУММЕСЛИ_ВСЕ_ЛИСТЫ ' Purpose : Функция суммирует на основании критерия значения со всех листов, кроме листа с функцией ' Диапазон - ссылка на диапазон ячеек для поиска критерия ' Критерий - значение, на основании которого суммировать данные ' ДиапазонСуммирования - ссылка на диапазон ячеек, значения которых суммировать ' ВсеЛисты - 1(по умолчанию) - суммирование происходит со всех листов, кроме листа с функцией ' 0 - суммирование происходит только в листах, расположенных левее листа с функцией '--------------------------------------------------------------------------------------- Function СУММЕСЛИ_ВСЕ_ЛИСТЫ(Диапазон As Range, Критерий, ДиапазонСуммирования As Range, Optional ВсеЛисты As Boolean = True) Dim wsSh As Worksheet Dim wbFunc As Workbook Dim sRange As String, sSumRange As String Dim dblSum As Double Dim rRange As Range, rCriteria As Range, rSumRange As Range, bAllSh As Boolean Set rRange = Диапазон If IsObject(Критерий) Then Set rCriteria = Критерий Else rCriteria = Критерий End If Set rSumRange = ДиапазонСуммирования bAllSh = ВсеЛисты 'определяем книгу, в которой записана функция Set wbFunc = Application.Caller.Parent.Parent 'определяем адреса поиска критерия и суммирования sRange = rRange.Address sSumRange = rSumRange.Address 'цикл по всем листам книги с функцией For Each wsSh In wbFunc.Worksheets If bAllSh Then 'если это не лист с функцией If wsSh.Name <> Application.Caller.Parent.Name Then dblSum = dblSum + Application.SumIf(wsSh.Range(sRange), rCriteria, wsSh.Range(sSumRange)) End If Else 'если лист ДО листа с функцией If wsSh.Index < Application.Caller.Parent.Index Then dblSum = dblSum + Application.SumIf(wsSh.Range(sRange), rCriteria, wsSh.Range(sSumRange)) End If End If Next wsSh 'выводим результат СУММЕСЛИ_ВСЕ_ЛИСТЫ = dblSum End Function
Чтобы правильно использовать приведенный код, необходимо сначала ознакомиться со статьей Что такое функция пользователя(UDF)?. Вкратце: скопировать текст кода выше, перейти в редактор VBA(Alt+F11) -создать стандартный модуль(Insert —Module) и в него вставить скопированный текст. После чего функцию можно будет вызвать из Диспетчера функций(Shift+F3), отыскав её в категории Определенные пользователем (User Defined Functions).
Синтаксис функции:
суммируем со всех листов
=СУММЕСЛИ_ВСЕ_ЛИСТЫ(B3:B100;B3;C3:C100)
суммируем со всех листов ДО листа с функцией
=СУММЕСЛИ_ВСЕ_ЛИСТЫ(B3:B100;B3;C3:C100;0)
Аргументы функции аналогичны стандартной СУММЕСЛИ, только в конце добавлен еще один, необязательный. Принцип работы и все нюансы полностью совпадают с таковыми для функции СУММЕСЛИ(можно использовать подстановочные символы и операторы сравнения), т.к. внутри функции применяется непосредственно СУММЕСЛИ, применительно к каждому листу, а результаты затем суммируются в единое значение.
Диапазон — Ссылка на диапазон ячеек. Указывается диапазон значений, среди которых необходимо искать критерий(Критерий).
Критерий — Ссылка на ячейку или произвольное значение, на основании которого надо суммировать данные.
ДиапазонСуммирования — Ссылка на диапазон ячеек. Указывается диапазон ячеек, значения в которых необходимо просуммировать на основании критерия(Критерий).
ВсеЛисты — Необязательный аргумент. Если не указан, или указано значение 1 или ИСТИНА(TRUE), то будут суммироваться значения со всех листов, кроме листа, на котором записана функция. Если указано значение 0 или ЛОЖЬ(FALSE), то будут суммироваться значения с листов, расположенных до листа, на котором записана функция.
Применение всех функций вы найдете в примере к статье:
Скачать пример
Суммировать со всех листов.xls (134,0 KiB, 12 707 скачиваний)
Дополнил статью функцией, которая суммирует данные только с указанных листов, либо со всех, кроме листа с функцией:
'--------------------------------------------------------------------------------------- ' Function : СУММЕСЛИ_ЛИСТЫ ' Purpose : Функция суммирует на основании критерия значения с указанных листов, кроме листа с функцией ' Диапазон - ссылка на диапазон ячеек для поиска критерия ' Критерий - значение, на основании которого суммировать данные ' ДиапазонСуммирования - ссылка на диапазон ячеек, значения которых суммировать ' ИмяЛистов - Имена листов, записанные через вопр.знак(?), с которых суммировать данные ' Пример: "Январь?Февраль?Май" '--------------------------------------------------------------------------------------- Function СУММЕСЛИ_ЛИСТЫ(Диапазон As Range, Критерий, ДиапазонСуммирования As Range, Optional ИмяЛистов = "") Dim asSheets, li As Long Dim wsSh As Worksheet Dim wbFunc As Workbook Dim sRange As String, sSumRange As String Dim dblSum As Double Dim rRange As Range, rCriteria As Range, rSumRange As Range, sSheets As String Set rRange = Диапазон If IsObject(Критерий) Then Set rCriteria = Критерий Else rCriteria = Критерий End If Set rSumRange = ДиапазонСуммирования sSheets = ИмяЛистов 'определяем книгу, в которой записана функция Set wbFunc = Application.Caller.Parent.Parent 'определяем адреса поиска критерия и суммирования sRange = rRange.Address sSumRange = rSumRange.Address If sSheets = "" Then For Each wsSh In wbFunc.Worksheets If wsSh.Name <> Application.Caller.Parent.Name Then sSheets = sSheets & "?" & wsSh.Name End If Next wsSh sSheets = Mid$(sSheets, 2) End If asSheets = Split(sSheets, "?") 'цикл по всем листам книги For li = LBound(asSheets) To UBound(asSheets) Set wsSh = wbFunc.Sheets(asSheets(li)) If Not wsSh Is Nothing Then dblSum = dblSum + Application.SumIf(wsSh.Range(sRange), rCriteria, wsSh.Range(sSumRange)) End If Next li 'выводим результат СУММЕСЛИ_ЛИСТЫ = dblSum End Function
Синтаксис функции:
=СУММЕСЛИ_ЛИСТЫ($B$3:$B$100;$A3;$C$3:$C$100;»Январь?Март»)
Диапазон — Ссылка на диапазон ячеек. Указывается диапазон значений, среди которых необходимо искать критерий(Критерий).
Критерий — Ссылка на ячейку или произвольное значение, на основании которого надо суммировать данные.
ДиапазонСуммирования — Ссылка на диапазон ячеек. Указывается диапазон ячеек, значения в которых необходимо просуммировать на основании критерия(Критерий).
ИмяЛистов — Необязательный аргумент. Указываются имена листов книги, с которых надо суммировать данные. Имена листов должны быть записаны через вопросительный знак: Январь?Март. Если аргумент не указан или указана пустая ячейка, то будут суммироваться значения со всех листов, кроме листа, на котором записана функция.
Скачать пример с кодом функции:
Скачать пример
Суммировать со всех листов.xls (134,0 KiB, 12 707 скачиваний)
Очередное дополнение статьи — функция, в которой помимо перечисления листов можно указать книгу, в которой эти листы просматривать:
'--------------------------------------------------------------------------------------- ' Function : СУММЕСЛИ_ЛИСТЫ_В_КНИГЕ ' Purpose : Функция суммирует на основании критерия значения с указанных листов, кроме листа с функцией ' Диапазон - ссылка на диапазон ячеек для поиска критерия ' Критерий - значение, на основании которого суммировать данные ' ДиапазонСуммирования - ссылка на диапазон ячеек, значения которых суммировать ' ИмяЛистов - Имена листов, записанные через вопр.знак(?), с которых суммировать данные ' Пример: "Январь?Февраль?Май" ' ИмяКниги - имя книги, данные с которой необходимо суммировать '--------------------------------------------------------------------------------------- Function СУММЕСЛИ_ЛИСТЫ_В_КНИГЕ(Диапазон As Range, Критерий, ДиапазонСуммирования As Range, Optional ИмяЛистов = "", Optional ИмяКниги As String = "") Dim wsSh As Worksheet, sRange As String, sSumRange As String, asSheets, li As Long Dim wbB As Workbook Dim dblSum As Double Dim rRange As Range, rCriteria As Range, rSumRange As Range, sSheets As String, sWbName As String Set rRange = Диапазон If IsObject(Критерий) Then Set rCriteria = Критерий Else rCriteria = Критерий End If Set rSumRange = ДиапазонСуммирования sSheets = ИмяЛистов sWbName = ИмяКниги If sWbName = "" Then Set wbB = Application.Caller.Parent.Parent Else Set wbB = Application.Workbooks(sWbName) End If 'определяем адреса поиска критерия и суммирования sRange = rRange.Address sSumRange = rSumRange.Address If sSheets = "" Then For Each wsSh In wbB.Worksheets If wsSh.Name <> Application.Caller.Parent.Name Then sSheets = sSheets & "?" & wsSh.Name End If Next wsSh sSheets = Mid$(sSheets, 2) End If asSheets = Split(sSheets, "?") 'цикл по всем листам указанной книги On Error Resume Next For li = LBound(asSheets) To UBound(asSheets) Set wsSh = wbB.Sheets(asSheets(li)) If Not wsSh Is Nothing Then dblSum = dblSum + Application.SumIf(wsSh.Range(sRange), rCriteria, wsSh.Range(sSumRange)) End If Next li 'выводим результат СУММЕСЛИ_ЛИСТЫ_В_КНИГЕ = dblSum End Function
Синтаксис функции:
=СУММЕСЛИ_ЛИСТЫ_В_КНИГЕ($B$3:$B$100;$A3;$C$3:$C$100;»Январь?Март»;»Книга1.xlsx»)
Аргументы и их использование полностью совпадают с описанными выше для функции СУММЕСЛИ_ЛИСТЫ. Поэтому опишу только последний аргумент:
ИмяКниги — Необязательный аргумент. Указываются имя книги, в которой будут просматриваться листы, указанные параметром ИмяЛистов. Если аргумент ИмяКниги не указан — листы просматриваются в книге, в которой записана сама функция. Если какого-либо из указанных листов не будет в указанной книге — ошибка будет проигнорирована. Если среди открытых книг не будет книги с указанным именем — функция вернет ошибку #ЗНАЧ!(#VALUE!). Важно: имя книги необходимо указывать вместе с расширением: «Книга1.xlsx»
Скачать пример с кодом функций:
Скачать пример
Суммировать со всех листов.xls (134,0 KiB, 12 707 скачиваний)
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика