Почему стандартные методы не показывают все листы — и что с этим делать
Вы когда-нибудь теряли важный лист в огромной книге Excel, потому что его название скрыто за сотнями других вкладок? Или пытались автоматизировать отчёт, но скрипт упорно игнорировал половину данных? Проблема в том, что Excel по умолчанию не показывает полный список листов — ни в интерфейсе, ни в стандартных функциях. Даже опытные пользователи часто упускают, что скрытые листы (ОченьСкрытый тип) или листы с нестандартными символами в названиях могут "прятаться" от глаз.
В этой статье мы разберём 5 рабочих способов вытащить список всех листов — от элементарных (подойдёт даже для Excel 2010) до продвинутых (с использованием Power Query и VBA). Особое внимание уделим "подводным камням": например, почему функция SHEETS() иногда врёт, или как обойти ограничение на 255 символов в названиях листов при экспорте. Готовы? Начнём с самого простого.
Способ 1: Ручной просмотр через панель вкладок (для маленьких файлов)
Если ваша книга содержит не больше 20-30 листов, самый быстрый способ — визуальный осмотр. Внизу окна Excel есть горизонтальная панель с названиями листов. Здесь можно:
- 🔍 Прокручивать вкладки колесиком мыши или ползунком справа (если листов много, появится стрелка навигации).
- 📌 Закреплять важные листы правой кнопкой →
Закрепить вкладку(в Excel 2016+). - 👁️ Показывать скрытые: правый клик по стрелкам навигации →
Показать все листы(работает не во всех версиях!).
⚠️ Внимание: Этот метод не покажет листы, скрытые через VBA (xlSheetVeryHidden). Их можно обнаружить только программно (см. Способ 5). Также будьте осторожны с книгами, где названия листов начинаются на ' (апостроф) — они могут отображаться некорректно в панели.
Способ 2: Функция SHEETS() — почему она не всегда работает
Функция =SHEETS() возвращает количество листов в книге, но имеет критические ограничения:
- Считает только видимые листы (скрытые игнорирует).
- Возвращает ошибку
#N/A, если вызвана из другой книги. - Не показывает имена листов — только их количество.
Чтобы получить список имён, придётся комбинировать её с другими функциями. Например, так:
=INDEX(GET.WORKBOOK(1), ROW(A1)) & T(NOW())
Но этот метод требует надстройки "Анализ данных" и работает нестабильно в новых версиях Excel. Гораздо надёжнее использовать Power Query (см. следующий раздел).
Почему SHEETS() игнорирует скрытые листы?
Функция была разработана для совместимости с Lotus 1-2-3 в 1990-х, где скрытые листы считались "внутренними" и не предназначались для пользовательских вычислений. Microsoft сохранила это поведение для обратной совместимости.
| Метод | Показывает скрытые? | Требует VBA? | Работает в Excel Online? |
|---|---|---|---|
| Ручной просмотр | ❌ Нет | ❌ Нет | ✅ Да |
SHEETS() |
❌ Нет | ❌ Нет | ✅ Да |
| Power Query | ✅ Да | ❌ Нет | ❌ Нет |
| VBA | ✅ Да (включая VeryHidden) |
✅ Да | ❌ Нет |
Способ 3: Power Query — автоматический экспорт списка листов
Power Query (или Get & Transform в новых версиях) — самый мощный инструмент для работы с метаданными книги. Он позволяет экспортировать список всех листов, включая скрытые, в отдельную таблицу. Вот пошаговая инструкция:
Откройте Данные → Получить данные → Из других источников → Пустая запрос|
В редакторе Power Query введите в строку формул: =Excel.CurrentWorkbook()|
Нажмите Домой → Закрыть и загрузить → Закрыть и загрузить в...|
Выберите Только создать соединение и назовите запрос "СписокЛистов"|
Создайте новую таблицу на листе и свяжите её с запросом через Данные → Существующие подключения-->
⚠️ Внимание: Power Query не покажет листы, защищённые паролем, а также листы с названиями длинее 255 символов (они обрежутся). Чтобы обойти это ограничение, используйте VBA (см. следующий раздел).
Преимущество этого метода — динамическое обновление. Если вы добавите новый лист в книгу, достаточно обновить запрос (Данные → Обновить все), и список автоматически синхронизируется.
Способ 4: Формулы массива для продвинутых пользователей
Если вы не хотите использовать Power Query или VBA, можно обойтись формулами. Этот метод сложнее, но работает во всех версиях Excel (начиная с 2007). Мы будем использовать комбинацию функций INDIRECT, CELL и GET.WORKBOOK.
Создайте новый лист и введите в ячейку A1:
=IFERROR(INDEX(GET.WORKBOOK(1), ROW(A1)), "")
Затем протяните формулу вниз до тех пор, пока не появится пустая строка. Чтобы отфильтровать только имена листов (без служебной информации), добавьте столбец с формулой:
=IF(ISERROR(FIND("]", A1)), "", MID(A1, FIND("]", A1)+1, 255))
⚠️ Внимание: Функция GET.WORKBOOK считается "недокументированной" и может перестать работать в будущих версиях Excel. Microsoft не гарантирует её поддержку. Для критически важных задач используйте VBA.
Способ 5: VBA — универсальное решение для любых задач
Если вам нужно 100% надёжное решение, которое работает со всеми типами листов (включая VeryHidden), используйте VBA. Этот код создаст новый лист со списком всех листов книги, включая их статус (видимый/скрытый/очень скрытый):
Sub ExportSheetList()
Dim ws As Worksheet, newWs As Worksheet
Dim i As Integer, lastRow As Integer
' Создаём новый лист для результата
Set newWs = Worksheets.Add(After:=Worksheets(Worksheets.Count))
newWs.Name = "СписокЛистов"
' Заголовки таблицы
newWs.Cells(1, 1).Value = "№"
newWs.Cells(1, 2).Value = "Имя листа"
newWs.Cells(1, 3).Value = "Статус"
newWs.Cells(1, 4).Value = "Индекс"
' Перебираем все листы
i = 2
For Each ws In ThisWorkbook.Worksheets
newWs.Cells(i, 1).Value = i - 1
newWs.Cells(i, 2).Value = ws.Name
newWs.Cells(i, 4).Value = ws.Index
' Определяем статус листа
If ws.Visible = xlSheetVisible Then
newWs.Cells(i, 3).Value = "Видимый"
ElseIf ws.Visible = xlSheetHidden Then
newWs.Cells(i, 3).Value = "Скрытый"
ElseIf ws.Visible = xlSheetVeryHidden Then
newWs.Cells(i, 3).Value = "Очень скрытый (VBA)"
End If
i = i + 1
Next ws
' Форматируем таблицу
newWs.Range("A1:D1").Font.Bold = True
newWs.Columns("A:D").AutoFit
End Sub
Чтобы запустить макрос:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - Вставьте код в модуль (
Insert → Module). - Закройте редактор и запустите макрос через
Разработчик → Макросы(илиAlt + F8).
⚠️ Внимание: В книгах с очень большим количеством листов (500+) выполнение макроса может занять несколько секунд. Чтобы ускорить работу, отключите обновление экрана в начале кода, добавив строку Application.ScreenUpdating = False, и включите обратно в конце (Application.ScreenUpdating = True).
Бонус: Как экспортировать список листов в текстовый файл
Если вам нужно сохранить список листов вне книги Excel (например, для документации или передачи коллегам), используйте этот VBA-скрипт. Он создаст файл SheetList.txt на рабочем столе:
Sub ExportSheetListToFile()
Dim ws As Worksheet
Dim filePath As String
Dim fileNum As Integer
Dim content As String
filePath = Environ("USERPROFILE") & "\Desktop\SheetList.txt"
fileNum = FreeFile()
' Заголовок файла
content = "СПИСОК ЛИСТОВ КНИГИ: " & ThisWorkbook.Name & vbCrLf & vbCrLf
content = content & "№" & Tab(10) & "Имя листа" & Tab(30) & "Статус" & Tab(50) & "Индекс" & vbCrLf
content = content & String(70, "-") & vbCrLf
' Данные по каждому листу
Dim i As Integer: i = 1
For Each ws In ThisWorkbook.Worksheets
content = content & i & Tab(10) & ws.Name & Tab(30)
If ws.Visible = xlSheetVisible Then
content = content & "Видимый" & Tab(50)
ElseIf ws.Visible = xlSheetHidden Then
content = content & "Скрытый" & Tab(50)
Else
content = content & "Очень скрытый" & Tab(50)
End If
content = content & ws.Index & vbCrLf
i = i + 1
Next ws
' Сохраняем файл
Open filePath For Output As #fileNum
Print #fileNum, content
Close #fileNum
MsgBox "Список листов сохранён по пути: " & filePath, vbInformation
End Sub
Файл будет иметь табличный формат с выравниванием по колонкам. Если вам нужно экспортировать список в CSV для дальнейшей обработки, замените Tab() на запятые, а vbCrLf — на vbCr.
FAQ: Ответы на частые вопросы
Можно ли получить список листов из другой закрытой книги?
Да, но с ограничениями. Если книга закрыта, вы можете использовать формулу:
=EXTERNAL.DOCUMENT("C:\Путь\Книга.xlsx!-1")
Однако этот метод покажет только имена листов, без статуса видимости, и требует, чтобы путь к файлу был указан абсолютно (без ошибок). В Excel 2016+ для этой задачи лучше использовать Power Query с подключением к файлу как к внешнему источнику данных.
Почему в моём Excel нет функции GET.WORKBOOK?
Функция GET.WORKBOOK относится к категории "недокументированных" и по умолчанию отключена. Чтобы её активировать:
- Откройте
Файл → Параметры → Формулы. - В разделе
Работа с формуламипоставьте галочкуВключить недокументированные функции(в некоторых версиях этот пункт может называтьсяРазрешить legacy-функции). - Перезапустите Excel.
Если пункта нет в настройках, значит ваша версия Excel его не поддерживает (например, Excel Online или Excel для Mac).
Как узнать, какие листы защищены паролем?
Стандартными средствами Excel это невозможно. Однако с помощью VBA можно проверить защиту листа:
Sub CheckProtectedSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.ProtectContents Then
MsgBox "Лист '" & ws.Name & "' защищён паролем!", vbExclamation
End If
Next ws
End Sub
Обратите внимание: этот код не покажет сам пароль, а только факт защиты. Взлом паролей листов нарушает лицензионное соглашение Microsoft.
Можно ли получить список листов в Google Sheets?
Да, в Google Таблицах для этого есть специальная функция:
=ARRAYFORMULA(TO_TEXT(SORT(UNIQUE({Sheet1!A1:Z; Sheet2!A1:Z; ...}))))
Однако проще использовать скрипт Google Apps Script:
function listSheets() {
const ss = SpreadsheetApp.getActive();
const sheets = ss.getSheets();
let result = ["Список листов:", "Имя;Индекс;ID"];
sheets.forEach((sheet, i) => {
result.push(`${sheet.getName()};${i};${sheet.getSheetId()}`);
});
return result.join("\n");
}
Запустите его через Расширения → Apps Script, и результат отобразится в логе выполнения.
Почему после обновления Excel перестали работать мои макросы для списка листов?
Скорее всего, проблема в настройках безопасности макросов. После обновлений Excel (особенно в 2023-2026 годах) Microsoft ужесточила политику выполнения VBA. Проверьте:
- Откройте
Файл → Параметры → Центр управления безопасностью → Параметры центра.... - В разделе
Параметры макросоввыберитеВключить все макросы(не рекомендуется для недоверенных файлов!) илиОтключить макросы с уведомлением. - Если макросы подписаны цифровой подписью, добавьте издателя в
Надёжные издатели.
Также убедитесь, что в книге включён доступ к объектной модели (Файл → Сведения → Разрешить редактирование).