Работа с большими книгами Microsoft Excel часто требует контроля над структурой документа — особенно когда речь идёт о десятках или даже сотнях листов. Опытные пользователи знают, что потерять счет в многостраничной таблице так же легко, как забыть сохраненный файл. Но как быстро посчитать количество листов без ручного перелистывания каждого? Спойлер: способов больше, чем кажется на первый взгляд.
В этой статье мы разберём все актуальные методы — от базовых (доступных даже новичкам) до продвинутых (с использованием VBA и формул). Вы узнаете, как получить точный подсчёт за 2 клика, почему иногда Excel показывает неверное число листов, и как автоматизировать процесс для регулярного использования. А ещё — уникальный лайфхак для скрытых листов, о котором не пишут в стандартных гайдах.
1. Самый простой способ: визуальный подсчёт в панели листов
Если книга содержит не более 20-30 листов, самый очевидный метод — использовать встроенную панель навигации в нижней части окна Excel. Здесь отображаются ярлычки всех листов с возможностью прокрутки. Достаточно посчитать их количество вручную или воспользоваться скроллом, чтобы дойти до последнего.
Однако у этого метода есть существенные ограничения:
- 🔹 Не работает для скрытых листов (их просто не видно в панели)
- 🔹 При большом количестве листов (50+) легко сбиться со счёта
- 🔹 Нет возможности быстро обновить число при добавлении/удалении листов
Чтобы ускорить процесс, используйте сочетание клавиш:
- 🔼
Ctrl + PageUp— переключение на предыдущий лист - 🔽
Ctrl + PageDown— переключение на следующий лист
⚠️ Внимание: В Excel Online и мобильной версии приложения клавиатурные сочетания могут не работать. В этом случае используйте свайпы по панели листов (на телефоне) или кнопки навигации в веб-интерфейсе.
2. Использование строки состояния (Status Bar)
Малоизвестный трюк: Excel может показывать количество листов прямо в строке состояния (внизу окна). Для этого:
- Выделите любой лист в книге (кликните по его ярлычку)
- Удерживайте клавишу
Ctrlи кликните по другим листам, чтобы выбрать их все - В правом нижнем углу окна появится надпись
"Листов: X", где X — общее количество
Этот метод работает во всех версиях Excel (начиная с 2007) и не требует установки дополнительных надстроек. Главный плюс — мгновенный результат без необходимости прокручивать все листы. Однако он тоже не учитывает скрытые листы.
3. Формула для подсчёта листов (без VBA)
Для тех, кто предпочитает автоматизацию, есть решение с использованием формулы. К сожалению, в Excel нет встроенной функции вроде COUNT_SHEETS(), но мы можем обойти это ограничение с помощью динамического массива и функции GET.WORKBOOK().
Вставьте этот код в любую ячейку:
=LET(
данные; GET.WORKBOOK(1);
фильтр; FILTER(данные; LEFT(данные; 1) = "[");
COUNT(фильтр)
)
Как это работает:
GET.WORKBOOK(1)— возвращает массив с информацией о всех листах книгиFILTER— оставляет только строки, начинающиеся с "[", которые соответствуют листамCOUNT— подсчитывает количество отфильтрованных элементов
⚠️ Внимание: Функция GET.WORKBOOK() доступна только в Excel 365 и Excel 2021. В более старых версиях (2019 и ниже) этот метод не сработает.
Альтернатива для Excel 2019 и ниже
Используйте надстройку Power Query: перейдите в Данные → Получить данные → Из других источников → Пустая запрос и введите в редакторе код:
= Excel.CurrentWorkbook(){[Name="SheetNames"]}[Content]
Затем создайте таблицу на основе этого запроса и используйте COUNTA() для подсчёта строк.
4. VBA-скрипт для точного подсчёта (включая скрытые листы)
Если вам нужно учитывать все листы (включая скрытые), или автоматизировать процесс для регулярного использования, лучшее решение — макрос на VBA. Вот готовый скрипт:
Function CountAllSheets() As Integer
Dim ws As Worksheet
Dim hiddenCount As Integer
hiddenCount = 0
For Each ws In ThisWorkbook.Worksheets
If ws.Visible = xlSheetVeryHidden Or ws.Visible = xlSheetHidden Then
hiddenCount = hiddenCount + 1
End If
Next ws
CountAllSheets = ThisWorkbook.Worksheets.Count + hiddenCount
End Function
Как использовать:
- Нажмите
Alt + F11, чтобы открыть редактор VBA - Вставьте код в модуль (вставка → модуль)
- Вернитесь в Excel и в любой ячейке введите
=CountAllSheets()
Преимущества этого метода:
- 📊 Учитывает все типы листов, включая скрытые (
xlSheetHidden) и очень скрытые (xlSheetVeryHidden) - 🔄 Обновляется автоматически при изменении книги
- 📌 Можно интегрировать в другие макросы для комплексных отчётов
Включить поддержку макросов в настройках Excel|Проверить, что книга сохранена в формате .xlsm|Открыть редактор VBA через Alt+F11|Создать новый модуль для кода|Запустить макрос через F5 или из меню-->
5. Сравнение методов: какой выбрать?
Выбор оптимального способа зависит от ваших задач и версии Excel. Ниже таблица сравнения всех рассмотренных методов:
| Метод | Учитывает скрытые листы | Работает в Excel 2010-2019 | Требует навыков программирования | Автоматическое обновление |
|---|---|---|---|---|
| Визуальный подсчёт | ❌ Нет | ✅ Да | ❌ Нет | ❌ Нет |
| Строка состояния | ❌ Нет | ✅ Да | ❌ Нет | ❌ Нет |
Формула с GET.WORKBOOK |
❌ Нет | ❌ Только 2021/365 | ⚠️ Базовые знания | ✅ Да |
| VBA-скрипт | ✅ Да | ✅ Да | ⚠️ Средние знания | ✅ Да |
| Power Query (альтернатива) | ✅ Да | ✅ Да (с 2016) | ⚠️ Базовые знания | ✅ Да |
Для большинства пользователей оптимальным решением будет комбинация строки состояния (для быстрого просмотра) и VBA-скрипта (для точного подсчёта со скрытыми листами). Если вы работаете в Excel 365, формула с GET.WORKBOOK станет отличной альтернативой без необходимости включать макросы.
6. Частые ошибки и как их избежать
Даже опытные пользователи сталкиваются с проблемами при подсчёте листов. Вот самые распространённые ошибки и их решения:
1. Формула возвращает #NAME?
Причина: функция GET.WORKBOOK недоступна в вашей версии Excel. Решение — используйте VBA или обновите программу до Excel 365.
2. VBA-скрипт считает листы неверно
Причина: в книге есть листы-диаграммы (Chart Sheets), которые не учитываются по умолчанию. Исправленный код:
Function CountAllSheets() As Integer
Dim sh As Object
CountAllSheets = 0
For Each sh In ThisWorkbook.Sheets
CountAllSheets = CountAllSheets + 1
Next sh
End Function
3. Скрытые листы не отображаются в строке состояния
Это не ошибка, а особенность Excel. Чтобы увидеть скрытые листы, используйте VBA или перейдите в Вид → Показать → Показать лист (но это придётся делать для каждого скрытого листа отдельно).
4. Макрос не запускается
Убедитесь, что:
- 🔹 Книга сохранена в формате
.xlsm(с поддержкой макросов) - 🔹 В настройках безопасности разрешены макросы (
Файл → Параметры → Центр управления безопасностью) - 🔹 Код вставлен в стандартный модуль, а не в лист или книгу
7. Продвинутые сценарии: автоматизация для регулярных отчётов
Если вам нужно ежедневно обрабатывать книги с сотнями листов, ручные методы станут тормозить работу. Рассмотрим два сценария автоматизации:
Сценарий 1: Еженедельный отчёт по количеству листов в папке
Создайте макрос, который:
- Сканирует указанную папку на наличие
.xlsx/.xlsmфайлов - Для каждого файла подсчитывает листы (включая скрытые)
- Сохраняет результаты в отдельную сводную таблицу
Пример кода:
Sub CountSheetsInFolder()
Dim fso As Object, folder As Object, file As Object
Dim wb As Workbook, ws As Worksheet
Dim folderPath As String, resultSheet As Worksheet
folderPath = "C:\YourFolderPath\" ' Укажите путь к папке
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(folderPath)
Set resultSheet = ThisWorkbook.Sheets.Add
resultSheet.Cells(1, 1).Value = "Файл"
resultSheet.Cells(1, 2).Value = "Количество листов"
Dim rowNum As Integer: rowNum = 2
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = "xlsx" Or _
LCase(fso.GetExtensionName(file.Name)) = "xlsm" Then
Set wb = Workbooks.Open(file.Path)
resultSheet.Cells(rowNum, 1).Value = file.Name
resultSheet.Cells(rowNum, 2).Value = wb.Sheets.Count
wb.Close SaveChanges:=False
rowNum = rowNum + 1
End If
Next file
End Sub
Сценарий 2: Уведомление при превышении лимита листов
Если в вашей компании есть правило "не более 50 листов в одной книге", можно создать макрос, который:
- 🔔 Проверяет количество листов при открытии файла
- 📢 Выводит предупреждение, если лимит превышен
- 📤 Автоматически отправляет уведомление на email ответственному лицу
Для этого используйте событие Workbook_Open() в модуле ThisWorkbook:
Private Sub Workbook_Open()
Const MAX_SHEETS As Integer = 50
If ThisWorkbook.Sheets.Count > MAX_SHEETS Then
MsgBox "Внимание! Количество листов (" & ThisWorkbook.Sheets.Count & ") превышает допустимый лимит (" & MAX_SHEETS & ")." & vbCrLf & _
"Рекомендуется разделить книгу на несколько файлов.", vbExclamation, "Предупреждение"
End If
End Sub
FAQ: Ответы на частые вопросы
Можно ли посчитать листы в Excel Online?
В веб-версии Excel функционал ограничен. Вы можете:
- Использовать визуальный подсчёт в панели листов (но без клавиатурных сочетаний)
- Применить строку состояния (правый клик → "Число")
Макросы и формулы типа GET.WORKBOOK в Excel Online не работают.
Почему формула =SHEETS() не работает?
Функция =SHEETS() существует, но она возвращает количество листов в ссылке, а не в текущей книге. Например, =SHEETS(A1:D5) вернёт 1, потому что ссылка относится к одному листу. Для подсчёта всех листов книги эта функция не подходит.
Как посчитать листы в защищённой книге?
Если книга защищена паролем, большинство методов (включая VBA) не сработают без ввода пароля. Обходные пути:
- 🔓 Попросите владельца файла временно снять защиту
- 📂 Создайте копию книги и удалите защиту (если у вас есть права)
- 👁️ Используйте визуальный подсчёт (если листы не скрыты)
Внимание: попытка взлома защиты книги нарушает лицензионное соглашение Microsoft.
Можно ли посчитать листы в закрытой книге?
Да, но только с помощью VBA. Пример кода для подсчёта листов в закрытом файле:
Function CountSheetsInClosedWorkbook(filePath As String) As Integer
Dim wb As Workbook
Set wb = Workbooks.Open(filePath, UpdateLinks:=0, ReadOnly:=True)
CountSheetsInClosedWorkbook = wb.Sheets.Count
wb.Close SaveChanges:=False
End Function
Используйте так: =CountSheetsInClosedWorkbook("C:\Path\To\Your\File.xlsx").
Как посчитать листы определённого типа (например, только таблицы)?
Модифицируйте VBA-скрипт, чтобы учитывать только нужные типы. Например, для подсчёта только листов с данными (Worksheets, исключая диаграммы):
Function CountWorksheetsOnly() As Integer
Dim ws As Worksheet
CountWorksheetsOnly = 0
For Each ws In ThisWorkbook.Worksheets
CountWorksheetsOnly = CountWorksheetsOnly + 1
Next ws
End Function
Для подсчёта диаграмм используйте ThisWorkbook.Charts.Count.