Оглавление книги Excel

Если в вашей рабочей книге Excel число листов перевалило за второй десяток, то навигация по листам начинает становится проблемой. Одним из красивых способов ее решения является создание листа-оглавления с гиперссылками, ведущими на соответствующие листы книги:

toc1.png

Есть несколько способов реализовать подобное.

Видео

Способ 1. Создаваемые вручную гиперссылки

Вставьте в книгу пустой лист и добавьте на него гиперссылки на нужные вам листы, используя команду Вставка - Гиперссылка (Insert - Hyperlink). В открывшемся окне нужно выбрать слева опцию Место в документе и задать внешнее текстовое отображение и адрес ячейки, куда приведет ссылка:

toc2.png

Для удобства можно создать также и обратные ссылки на всех листах вашей книги, которые будут вести назад в оглавление. Чтобы не заниматься ручным созданием гиперссылок и копированием их потом на каждый лист, лучше использовать другой метод - функцию ГИПЕРССЫЛКА (HYPERLINK). Выделяем все листы в книге, куда хотим добавить обратную ссылку (для массового выделения листов можно использовать клавиши Shift и/или Ctrl) и в любую подходящую ячейку вводим функцию следующего вида:

=ГИПЕРССЫЛКА("#Оглавление!A1";"Назад в оглавление")

Эта функция создаст в текущей ячейке на всех выделенных листах гиперссылку с текстом "Назад в оглавление", щелчок по которой будет возвращать пользователя к листу Оглавление.

Способ 2. Динамическое оглавление с помощью формул

Это хоть и слегка экзотический, но весьма красивый и удобный способ создания автоматического листа оглавления вашей книги. Экзотический – потому что в нем используется недокументированная XLM-функция ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ (GET.WORKBOOK), оставленная разработчиками для совместимости со старыми версиями Excel. Эта функция выгружает список всех листов текущей книги в заданную переменную, из которой мы потом можем их извлечь и использовать в нашем оглавлении.

Откройте Диспетчер Имен на вкладке Формулы (Formulas – Name Manager) и создайте новый именованный диапазон с именем, допустим, Оглавление. В поле Диапазон (Reference) введите вот такую формулу:

toc3.png

=ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1)
=GET.WORKBOOK(1)

Теперь в переменной Оглавление содержатся наши искомые имена. Чтобы извлечь их оттуда на лист, можно воспользоваться функцией ИНДЕКС (INDEX), которая «выдергивает» элементы из массива по их номеру:

=ИНДЕКС(Оглавление; СТРОКА())
=INDEX(Оглавление; ROW())

Функция СТРОКА (ROW) выдает номер текущей строки и, в данном случае, нужна только для того, чтобы вручную не создавать отдельный столбец с порядковыми номерами извлекаемых элементов (1,2,3…). Таким образом, в ячейке А1 у нас получится имя первого листа, в А2 – имя второго и т.д.

toc4.png

Неплохо. Однако, как можно заметить, функция выдает не только имя листа, но и имя книги, которое нам не нужно. Чтобы его убрать, воспользуемся функциями ЗАМЕНИТЬ (SUBST) и НАЙТИ (FIND), которые найдут символ закрывающей квадратной скобки ( ] ) и заменят весь текст до этого символа включительно на пустую строку (""). Откроем еще раз Диспетчер имен с вкладки Формулы (Formulas - Name Manager), двойным щелчком откроем созданный диапазон Оглавление и изменим его формулу:

=ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);1;НАЙТИ("]";ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));"")
=SUBST(GET.WORKBOOK(1);1;FIND("]";GET.WORKBOOK(1));"")

Теперь наш список листов будет выглядеть существенно лучше:

toc5.png

Небольшая побочная трудность заключается в том, что наша формула в именованном диапазоне Оглавление будет пересчитываться только при вводе, либо при принудительном пересчете книги нажатием на сочетание клавиш Ctrl+Alt+F9. Чтобы обойти этот неприятный момент, добавим к нашей формуле небольшой "хвост":

=ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);1;НАЙТИ("]";ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));"")&Т(ТДАТА())
=SUBST(GET.WORKBOOK(1);1;FIND("]";GET.WORKBOOK(1));"")&T(NOW())

Функция ТДАТА (NOW) выдает текущую дату (с временем), а функция Т превращает эту дату в пустую текстовую строку, которая затем приклеивается к нашему имени листа с помощью оператора склейки (&). Т.е. имя листа, фактически, не меняется, но поскольку функция ТДАТА пересчитывается и выдает новое время и дату при любом изменении листа, то и остальная часть нашей формулы вынуждена будет заново пересчитаться тоже и – как следствие – имена листов будут обновляться постоянно.

Для скрытия ошибок #ССЫЛКА (#REF), которые будут появляться, если скопировать нашу формулу с функцией ИНДЕКС на большее количество ячеек, чем у нас есть листов, можно использовать функцию ЕСЛИОШИБКА (IFERROR), которая  перехватывает любые ошибки и заменяет их на пустую строку (""):

toc6.png

И, наконец, для добавления к именам листов "живых" гиперссылок для быстрой навигации, можно использовать все ту же функцию ГИПЕРССЫЛКА (HYPERLINK), которая будет формировать адрес для перехода из имени листа:

toc7.png

Способ 3. Макрос

И, наконец, для создания оглавления можно использовать и несложный макрос. Правда, запускать его придется каждый раз при изменении структуры книги - в отличие от Способа 2, макрос их сам не отслеживает.

Откройте редактор Visual Basic, нажав Alt+F11 или выбрав (в старых версиях Excel) в меню Сервис - Макрос - Редактор Visual Basic (Tools - Macro - Visual Basic Editor). В открывшемся окне редактора создайте новый пустой модуль (меню Insert - Module) и скопируйте туда текст этого макроса:

Sub SheetList()
   Dim sheet As Worksheet
   Dim cell As Range
   With ActiveWorkbook
      For Each sheet In ActiveWorkbook.Worksheets
         Set cell = Worksheets(1).Cells(sheet.Index, 1)
         .Worksheets(1).Hyperlinks.Add anchor:=cell, Address:="", SubAddress:="'" & sheet.Name & "'" & "!A1"
         cell.Formula = sheet.Name
      Next
   End With
End Sub

Закройте редактор Visual Basic и вернитесь  в Excel. Добавьте в книгу чистый лист и поместите его на первое место. Затем нажмите Alt+F8 или откройте меню Сервис - Макрос - Макросы (Tools - Macro - Macros). Найдите там созданный макрос SheetList и запустите его на выполнение. Макрос создаст на первом листе книги список гиперссылок с названиями листов. Щелчок по любой из них переместит Вас на нужный лист.

Для удобства можно создать также и обратные ссылки на всех листах вашей книги, которые будут вести назад в оглавление, как это было описано в Способе 1.

Ссылки по теме

 


Страницы: 1  2  
26.03.2015 15:44:35
Здравствуйте!

Очень полезная статья. Спасибо!

Попробовал на основе этого оглавления посчитать кол-во заполненных ячеек в первом столбце каждого листа с помощью формулы, но почему-то происходит ошибка формулы :(
=СЧЁТЗ("#"&A3&"!A:A)
P.S.
Хочется растянуть формулу и вуаля, вместо работы руками...
06.10.2017 09:56:44
Не хватает функции ДВССЫЛ (INDIRECT)
14.03.2016 12:09:54
Здравствуйте!
очень хорошая статья!
помогите решить проблему.
у меня книга состоит из нескольких одинаковых по формату листов, причём их кол-во постоянно меняется, и сводного листа (куда собирается инфа из промежуточных).
можно ли как нибудь формулой прописать заполнение сводного листа? я чувствую, что предложенный вариант 2 + функция ДВССЫЛ может решить проблему, но что-то не получается.
заранее благодарен.
05.08.2016 07:57:31
Уважаемый Николай Павлов.
Попробовал создать свое оглавление по Вашему фильму, но столкнулся со следующей проблемой.
функция  =ЗАМЕНИТЬ(), требует наличия еще одного аргумента, а именно числа знаков, но число знаков она берет с названий листов.
Без этого аргумента Excel выдает ошибку, если же он будет иметь значение  
В результате получается, что если значение этого аргумента будет 0, но ничего не изменится, а если больше нуля,то обрезаются название листов .
В общем как то так пока:
=ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);НАЙТИ("]";ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));0;"";)
Тут спрашивали как быть с гиперссылками на листы, в имени которых есть пробелы. В способе 2 можно немного доделать формулу ГИПЕРССЫЛКА для универсальности:

=ГИПЕРССЫЛКА("#"&"'"&A2&"'!A1";">>>>>")
30.01.2017 07:45:00
Здравствуйте!
Скажите пожалуйста, второй способ - тоже подразумевает макрос, функция в листах, без поддержания макросов не работает.
Чистого способа на формулах нет?
28.02.2017 16:42:52
Спасибо. БОЛЬШОЕ СПАСИБО, за вашу работу и помощь всем нам :D:D:D
25.04.2017 14:12:21
Как изменить макрос для создания ссылки перехода на последнюю заполненную ячейку в определенном столбце, вместо А1, с обновлением при каждом открытии документа.
17.09.2017 13:40:21
Здравствуйте.

Проблема такая создал новое имя (Вставка -> Имя -> Присвоить) [EXEL 2003].
При создании нового имени exel работал нормально пару дней.
Потом после двух дней при открытии файла стал выдавать:
Эта книга содержит макросы Microsoft Excel 4.0. Эти макросы могут создавать вирусы или другой вредоносный код.
Эти макросы будут отключены.
Все началось после копирования листа книги.
При удалении имени предупреждение не выдавалось. При повторном создании имени предупреждение стало выскакивать опять.
Разве эти имена считаются макросами? И почему первые два дня exel ни как не реагировал на них? (Уровни безопасности я не переключал).

ЧТО ДЕЛАТЬ?

P.S.  Ниже описал какое имя и формулу вводил.

Вставка -> Имя -> Присвоить
Добавляю:
- Имя: ОГЛ
- Формула: =ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1)&Т(ТДАТА())
06.10.2017 09:54:21
Формально, это команды старого макроязыка XL4 и система безопасности на них реагирует. Понизьте уровень безопасности и все будет ОК.
05.10.2017 14:36:22
Николай,
Интересует вопрос: как можно сделать связь между оглавлением и листами книги, чтобы при фильтрации ячеек оглавления, соответствующие листы скрывались/отображались автоматически?
06.10.2017 09:52:53
Такое только макросом.
13.12.2017 14:48:48
Николай, а возможно ли как-то проставить номера страниц с других листов на первом листе? Т.е. нужно оглавление (оно постоянно), в котором не приходилось бы менять номера страниц "вручную", т.к. другие листы книги периодически меняются по объему своего содержания...
21.12.2017 13:05:33
Добрый день, есть простой вопрос с которым не могу справится, гугл что то толком не смог помочь

Надо сделать оглавление на первом листе с ссылками на определенные ячейки на втором листе.
И реализовать это так что бы при смещении ячейки на которую вела ссылка, ссылка перепривязывалась к изначальной ячейки ?
04.04.2018 21:44:04
Здравствуйте, уважаемый Николай! Я полный чайник в компьютерной технологии. Так в 56 лет пытаюсь что-то освоить. У меня вот в чём проблема.
Создаю лист оглавление... (создавал 1 и 3 способом), всё получается. Но при попытке открыть гиперссылки выскакивает окно (это действие запрещено политикой организации). Что я делаю не так? XL2013
30.09.2018 11:48:19
Добрый день.
Не работают две гиперссылки "Оформление на работу" и "Аудит" в документе.

Подскажите, пожалуйста, в чем ошибка.

Пример
12.10.2018 11:52:13
Добрый день, Николай! Оглавление выпадает с А1 и вниз по первому столбцу. Как сделать, чтобы оглавление выпадало в определенном диапазоне? К примеру с А1 до А40 и продолжалось с В2 до В40 , С2 до С40 и т.д. в зависимости от количества листов. Заранее спасибо!
17.01.2019 13:33:54
С Новым годом! Успехов, новых решений и благодарных пользователей Ваших продуктов! Всем пользователям удачи в освоении материала сайта!
Вопрос: Сделал оглавление с переходом по гиперссылке. Но при закрытии сайта требует сохранения в формате .xlsm, то есть с поддержкой макросов. В файле никаких макросов нет, проверил по всем Листам. При сохранении в .xlsx пропадает именованный диапазон и, естественно, по ошибке выполнения формулы ИНДЕКС не выгружается список Листов Книги. Винда 10ая, офис 365. PLEX - обновленный в конце года.
Самое интересное, что при сохранении в формате .xlsx пропадает именованный диапазон, созданный для заполнения таблицы именами листов. В формате с поддержкой макросов все работает нормально.
14.02.2019 12:38:31
Здравствуйте! Спасибо за полезный материал!

При попытке сделать интерактивное оглавление 2-м способом с колонкой названий листов всё прошло гладко, а вот гиперссылки из второй колонки заработали только некоторые, а большинство при попытке перехода стали выдавать ошибку "Неверная ссылка."

Немножко экспериментов и мне удалось подтвердить догадку, что проблема вызвана в наличием пробелов в названиях листов.

В общем, есть следующее решение проблемы. Формулу гиперссылки нужно писать в следующем виде:

=ГИПЕРССЫЛКА("#'"&A3&"'!A1";">>>") 

или
 =HYPERLINK("#'"&A3&"'!A1";">>>")


Сами формулы равнозначны. Существенно использование апострофа (одинарной кавычки) после "#" и перед "!" - это нужно для экранирования листов с пробелами в имени листа.


Если кто-то сможет подробнее рассказать что и как в формуле с гиперссылкой и по какому принципу определяется место апострофов - было бы здорово. Я же здесь просто добавил апострофы по аналогии с примером. У меня всё заработало. Формула действует и для листов в именах которых есть пробелы, и в которых таковых нет. Во всяком случае в Excel 2010 русскоязычную ссылку я на целевом файле проверил.

Также было бы неплохо, если бы кто-то предложил способ как можно сделать автоматическую замену пробела в названии листов (например, на знак подчеркивания)?

Думаю, что если автор внесет соответствующие дополнения и уточнения в основную статью - это было бы полезным для всех читателей.
16.03.2019 23:53:44
Всем добрый день. Во 2 способе используется гипер ссылка для перехода на другой лист . Помогите как это можно это сделать через макрос привязанный к кнопке . т.е. в меню всего одна кнопка при нажатии переход на любой лист а имя листа берется из  под активного курсора.  
02.05.2019 21:47:07
Добрый вечер! Подскажите как сделать , чтобы при формировании оглавления по способу  2 добавление листов не обрезало их количество на странице оглавления. В вашем примере при добавлении листа с городом последний город в списке оглавления пропадает. Спасибо.
16.12.2019 12:25:11
Здравствуйте. Никак не могу найти решение простой, как мне кажется, задачи.

Как с помощью макроса перейти на лист, который был создан по времени последним. (при этом он может располагаться и первым, и в середине, и крайним среди множества листов)

или
Перейти на лист, название которого совпадает со значением в активной ячейке ...

Заранее благодарю.
24.12.2019 01:09:15
Спасибо)) очень интересная информация, завтра применю.

Однако рассматривая видео появился вопрос: Если перешел по гиперссылке и оказался в конце листов, как бытро вернутся на заголовки не перелистывая? нельзя как-то закрепить лист с заголовками?
21.05.2020 15:50:11
Добрый день!

На основе Способа 3 и комментариев смастерил такой код создания оглавления из двух списков "Регионы" и "Города":
Private Sub Worksheet_Activate() 'макрос создания оглавления
    Worksheets(1).Range("A3:A1000").Clear 'очистка списка "Регионы"
    Worksheets(1).Range("B3:B1000").Clear 'очистка списка "Города"
    Dim sheet As Worksheet
    Dim cell As Range
    With ActiveWorkbook 'создание оглавления "Регионы" из значения ячейки B1 каждого листа
        For Each sheet In ActiveWorkbook.Worksheets
            Set cell = Worksheets(1).Cells(sheet.Index + 2, 1)
            .Worksheets(1).Hyperlinks.Add anchor:=cell, Address:="", SubAddress:="'" & sheet.Name & "'" & "!B1"
            cell.Formula = sheet.Cells(1, 2).Value
        Next
    End With
    With ActiveWorkbook 'создание оглавления "Города" из значений ячеек K14:K70 каждого листа
        For Each sheet In ActiveWorkbook.Worksheets
            Set cell = Worksheets(1).Cells(sheet.Index + 2, 2)
            .Worksheets(1).Hyperlinks.Add anchor:=cell, Address:="", SubAddress:="'" & sheet.Name & "'" & "!B1"
            cell.Formula = sheet.Cells(14, 11).Value
        Next
    End With
    Worksheets(1).Range("A3:A1000").Sort Worksheets(1).Range("A3"), xlAscending 'сортировка по алфавиту списка "Регионы"
    Worksheets(1).Range("B3:B1000").Sort Worksheets(1).Range("B3"), xlAscending 'сортировка по алфавиту списка "Города"
End Sub
 

Подскажите, пожалуйста:

1) Лист "Оглавление" всегда первый и ссылка на нем на него же самого не нужна. Что нужно изменить/добавить в коде, чтобы лист "Оглавление" всегда игнорировался при создании оглавления?

2) Список "Города" должен формироваться из значений нескольких ячеек (определенного диапазона) каждого листа.
 cell.Formula = sheet.Cells(14, 11).Value
Что нужно изменить/добавить в коде, чтобы брались значения не только ячейки K14, а каждой из ячеек диапазона "K14:K70" каждого листа со ссылкой на ячейку B1 того листа, с которого берется значение (в ячейках диапазона формулы с возможным пустым значением, т.е. "" ) ?

Спасибо большое!
07.10.2020 09:38:48
Николай, большое спасибо за отличный способ сделать оглавление. Я хочу сделать подобие сводной таблицы, оглавление успешно создал с помощью 2го способа, все отлично работает, автоматически обновляется. Хочу использовать из оглавления из столбца А имя листа в формуле такого типа ='ИМЯ_ЛИСТА'!$C$2 но прямая ссылка на ячейку из оглавления не работает, нагуглил вариант с ДВССЫЛ, но с транскрипцией видимо что то не так делаю. Буду благодарен за варианты решения данной проблемы
02.05.2021 19:46:17
Здравствуйте Николай! Почему то на функцию "ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ" пишет неверная функция. Microsoft 365 версия 2008 (сборка 13127.21506)
11.03.2022 13:04:50
Здравствуйте, Николай! В способе с функцией "ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ" стало писать #Н/Д
как результат выполнения функции =ИНДЕКС(Оглавление;СТРОКА())
Office Stadndart 2019  
14.03.2023 14:56:56
Работала формула =ИНДЕКС(Оглавление; СТРОКА()) прекрасно, пока не открыл ее на macbook
Почему-то там не возвращает имя листа
=SUBST(GET.WORKBOOK(1);1;FIND("]";GET.WORKBOOK(1));"")&T(NOW()) указано верно
В чем может быть дело?
03.05.2023 18:17:53
Не работает потому что нет такого оператора SUBST.  Есть оператор SUBSTITUTION, но и он не подходит. ЗАМЕНИТЬ это оператор REPLACE.
Кроме того, иногда вместо точки с запятой нужно использовать запятую. (зависит от установок в операционной системе)
=REPLACE(GET.WORKBOOK(1),1,FIND("]",GET.WORKBOOK(1)),"")&T(NOW()) 
Кроме того, ссылку можно сделать в одной ячейке, а не в двух - без использования знаков ">>>"

=HYPERLINK("#"&IFERROR(INDEX(Content, ROW()),"")&"!a1",IFERROR(INDEX(Content, ROW()),""))
 
Страницы: 1  2  
Наверх