Оглавление книги Excel
Если в вашей рабочей книге Excel число листов перевалило за второй десяток, то навигация по листам начинает становится проблемой. Одним из красивых способов ее решения является создание листа-оглавления с гиперссылками, ведущими на соответствующие листы книги:
Есть несколько способов реализовать подобное.
Видео
Способ 1. Создаваемые вручную гиперссылки
Вставьте в книгу пустой лист и добавьте на него гиперссылки на нужные вам листы, используя команду Вставка - Гиперссылка (Insert - Hyperlink). В открывшемся окне нужно выбрать слева опцию Место в документе и задать внешнее текстовое отображение и адрес ячейки, куда приведет ссылка:
Для удобства можно создать также и обратные ссылки на всех листах вашей книги, которые будут вести назад в оглавление. Чтобы не заниматься ручным созданием гиперссылок и копированием их потом на каждый лист, лучше использовать другой метод - функцию ГИПЕРССЫЛКА (HYPERLINK). Выделяем все листы в книге, куда хотим добавить обратную ссылку (для массового выделения листов можно использовать клавиши Shift и/или Ctrl) и в любую подходящую ячейку вводим функцию следующего вида:
=ГИПЕРССЫЛКА("#Оглавление!A1";"Назад в оглавление")
Эта функция создаст в текущей ячейке на всех выделенных листах гиперссылку с текстом "Назад в оглавление", щелчок по которой будет возвращать пользователя к листу Оглавление.
Способ 2. Динамическое оглавление с помощью формул
Это хоть и слегка экзотический, но весьма красивый и удобный способ создания автоматического листа оглавления вашей книги. Экзотический – потому что в нем используется недокументированная XLM-функция ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ (GET.WORKBOOK), оставленная разработчиками для совместимости со старыми версиями Excel. Эта функция выгружает список всех листов текущей книги в заданную переменную, из которой мы потом можем их извлечь и использовать в нашем оглавлении.
Откройте Диспетчер Имен на вкладке Формулы (Formulas – Name Manager) и создайте новый именованный диапазон с именем, допустим, Оглавление. В поле Диапазон (Reference) введите вот такую формулу:
=ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1)
=GET.WORKBOOK(1)
Теперь в переменной Оглавление содержатся наши искомые имена. Чтобы извлечь их оттуда на лист, можно воспользоваться функцией ИНДЕКС (INDEX), которая «выдергивает» элементы из массива по их номеру:
=ИНДЕКС(Оглавление; СТРОКА())
=INDEX(Оглавление; ROW())
Функция СТРОКА (ROW) выдает номер текущей строки и, в данном случае, нужна только для того, чтобы вручную не создавать отдельный столбец с порядковыми номерами извлекаемых элементов (1,2,3…). Таким образом, в ячейке А1 у нас получится имя первого листа, в А2 – имя второго и т.д.
Неплохо. Однако, как можно заметить, функция выдает не только имя листа, но и имя книги, которое нам не нужно. Чтобы его убрать, воспользуемся функциями ЗАМЕНИТЬ (SUBST) и НАЙТИ (FIND), которые найдут символ закрывающей квадратной скобки ( ] ) и заменят весь текст до этого символа включительно на пустую строку (""). Откроем еще раз Диспетчер имен с вкладки Формулы (Formulas - Name Manager), двойным щелчком откроем созданный диапазон Оглавление и изменим его формулу:
=ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);1;НАЙТИ("]";ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));"")
=SUBST(GET.WORKBOOK(1);1;FIND("]";GET.WORKBOOK(1));"")
Теперь наш список листов будет выглядеть существенно лучше:
Небольшая побочная трудность заключается в том, что наша формула в именованном диапазоне Оглавление будет пересчитываться только при вводе, либо при принудительном пересчете книги нажатием на сочетание клавиш Ctrl+Alt+F9. Чтобы обойти этот неприятный момент, добавим к нашей формуле небольшой "хвост":
=ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);1;НАЙТИ("]";ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));"")&Т(ТДАТА())
=SUBST(GET.WORKBOOK(1);1;FIND("]";GET.WORKBOOK(1));"")&T(NOW())
Функция ТДАТА (NOW) выдает текущую дату (с временем), а функция Т превращает эту дату в пустую текстовую строку, которая затем приклеивается к нашему имени листа с помощью оператора склейки (&). Т.е. имя листа, фактически, не меняется, но поскольку функция ТДАТА пересчитывается и выдает новое время и дату при любом изменении листа, то и остальная часть нашей формулы вынуждена будет заново пересчитаться тоже и – как следствие – имена листов будут обновляться постоянно.
Для скрытия ошибок #ССЫЛКА (#REF), которые будут появляться, если скопировать нашу формулу с функцией ИНДЕКС на большее количество ячеек, чем у нас есть листов, можно использовать функцию ЕСЛИОШИБКА (IFERROR), которая перехватывает любые ошибки и заменяет их на пустую строку (""):
И, наконец, для добавления к именам листов "живых" гиперссылок для быстрой навигации, можно использовать все ту же функцию ГИПЕРССЫЛКА (HYPERLINK), которая будет формировать адрес для перехода из имени листа:
Способ 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.
Ссылки по теме
- Что такое макрос, как его создать, куда копировать текст макроса, как запустить макрос?
- Автоматическое создание оглавления книги одной кнопкой (надстройка PLEX)
- Отправка писем с помощью функции ГИПЕРССЫЛКА
- Быстрый переход между листами книги Excel
очень хорошая статья!
помогите решить проблему.
у меня книга состоит из нескольких одинаковых по формату листов, причём их кол-во постоянно меняется, и сводного листа (куда собирается инфа из промежуточных).
можно ли как нибудь формулой прописать заполнение сводного листа? я чувствую, что предложенный вариант 2 + функция ДВССЫЛ может решить проблему, но что-то не получается.
заранее благодарен.
Попробовал создать свое оглавление по Вашему фильму, но столкнулся со следующей проблемой.
функция =ЗАМЕНИТЬ(), требует наличия еще одного аргумента, а именно числа знаков, но число знаков она берет с названий листов.
Без этого аргумента Excel выдает ошибку, если же он будет иметь значение
В результате получается, что если значение этого аргумента будет 0, но ничего не изменится, а если больше нуля,то обрезаются название листов .
В общем как то так пока:
=ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);НАЙТИ("]";ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));0;"";)
=ГИПЕРССЫЛКА("#"&"'"&A2&"'!A1";">>>>>")
Скажите пожалуйста, второй способ - тоже подразумевает макрос, функция в листах, без поддержания макросов не работает.
Чистого способа на формулах нет?
Проблема такая создал новое имя (Вставка -> Имя -> Присвоить) [EXEL 2003].
При создании нового имени exel работал нормально пару дней.
Потом после двух дней при открытии файла стал выдавать:
Эти макросы будут отключены.
При удалении имени предупреждение не выдавалось. При повторном создании имени предупреждение стало выскакивать опять.
Разве эти имена считаются макросами? И почему первые два дня exel ни как не реагировал на них? (Уровни безопасности я не переключал).
ЧТО ДЕЛАТЬ?
P.S. Ниже описал какое имя и формулу вводил.
Вставка -> Имя -> Присвоить
Добавляю:
- Имя: ОГЛ
- Формула: =ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1)&Т(ТДАТА())
Интересует вопрос: как можно сделать связь между оглавлением и листами книги, чтобы при фильтрации ячеек оглавления, соответствующие листы скрывались/отображались автоматически?
Надо сделать оглавление на первом листе с ссылками на определенные ячейки на втором листе.
И реализовать это так что бы при смещении ячейки на которую вела ссылка, ссылка перепривязывалась к изначальной ячейки ?
Создаю лист оглавление... (создавал 1 и 3 способом), всё получается. Но при попытке открыть гиперссылки выскакивает окно (это действие запрещено политикой организации). Что я делаю не так? XL2013
Не работают две гиперссылки "Оформление на работу" и "Аудит" в документе.
Подскажите, пожалуйста, в чем ошибка.
Вопрос: Сделал оглавление с переходом по гиперссылке. Но при закрытии сайта требует сохранения в формате .xlsm, то есть с поддержкой макросов. В файле никаких макросов нет, проверил по всем Листам. При сохранении в .xlsx пропадает именованный диапазон и, естественно, по ошибке выполнения формулы ИНДЕКС не выгружается список Листов Книги. Винда 10ая, офис 365. PLEX - обновленный в конце года.
Самое интересное, что при сохранении в формате .xlsx пропадает именованный диапазон, созданный для заполнения таблицы именами листов. В формате с поддержкой макросов все работает нормально.
При попытке сделать интерактивное оглавление 2-м способом с колонкой названий листов всё прошло гладко, а вот гиперссылки из второй колонки заработали только некоторые, а большинство при попытке перехода стали выдавать ошибку "Неверная ссылка."
Немножко экспериментов и мне удалось подтвердить догадку, что проблема вызвана в наличием пробелов в названиях листов.
В общем, есть следующее решение проблемы. Формулу гиперссылки нужно писать в следующем виде:
или
Сами формулы равнозначны. Существенно использование апострофа (одинарной кавычки) после "#" и перед "!" - это нужно для экранирования листов с пробелами в имени листа.
Если кто-то сможет подробнее рассказать что и как в формуле с гиперссылкой и по какому принципу определяется место апострофов - было бы здорово. Я же здесь просто добавил апострофы по аналогии с примером. У меня всё заработало. Формула действует и для листов в именах которых есть пробелы, и в которых таковых нет. Во всяком случае в Excel 2010 русскоязычную ссылку я на целевом файле проверил.
Также было бы неплохо, если бы кто-то предложил способ как можно сделать автоматическую замену пробела в названии листов (например, на знак подчеркивания)?
Думаю, что если автор внесет соответствующие дополнения и уточнения в основную статью - это было бы полезным для всех читателей.
Как с помощью макроса перейти на лист, который был создан по времени последним. (при этом он может располагаться и первым, и в середине, и крайним среди множества листов)
или
Перейти на лист, название которого совпадает со значением в активной ячейке ...
Заранее благодарю.
Однако рассматривая видео появился вопрос: Если перешел по гиперссылке и оказался в конце листов, как бытро вернутся на заголовки не перелистывая? нельзя как-то закрепить лист с заголовками?
На основе Способа 3 и комментариев смастерил такой код создания оглавления из двух списков "Регионы" и "Города":
Подскажите, пожалуйста:
1) Лист "Оглавление" всегда первый и ссылка на нем на него же самого не нужна. Что нужно изменить/добавить в коде, чтобы лист "Оглавление" всегда игнорировался при создании оглавления?
2) Список "Города" должен формироваться из значений нескольких ячеек (определенного диапазона) каждого листа.
Спасибо большое!
как результат выполнения функции =ИНДЕКС(Оглавление;СТРОКА())
Office Stadndart 2019
Почему-то там не возвращает имя листа
=SUBST(GET.WORKBOOK(1);1;FIND("]";GET.WORKBOOK(1));"")&T(NOW()) указано верно
В чем может быть дело?
Кроме того, иногда вместо точки с запятой нужно использовать запятую. (зависит от установок в операционной системе)
Преимущество метода: можно протянуть табличку вниз на N-строк, и, если листов нет, строки будут пустыми.
Обновление листа с Оглавлением возможно 2-мя путями:
1) банальным нажатием F9 (книга пересчитается и таблица обновится)
2) Если в код страницы (правой мыши по листу "Оглавление" -> "Просмотреть код" ) добавить макрос автоматического пересчета листа при любом изменении (переходе на др. ячейку и любые др. действия)
Всё это работает в офисе 2021