Задача: записать в отдельной ячейке или внутри формулы имя текущего листа(т.е. того, в котором сама функция).
В принципе это очень легко сделать простейшей функцией пользователя:
'--------------------------------------------------------------------------------------- ' Procedure : GetShName ' DateTime : 04.03.2015 10:44 ' Author : The_Prist(Щербаков Дмитрий) ' http://www.excel-vba.ru ' Purpose : Функция возвращает в ячейку имя листа ' rCell - Необязательный аргумент. ' Если указан - функция вернет имя листа, на котором расположена эта ячейка ' Если не указан - функция вернет имя листа, в котором записана функция '--------------------------------------------------------------------------------------- Function GetShName(Optional rCell As Range) If Not rCell Is Nothing Then GetShName = rCell.Parent.Name Else GetShName = Application.Caller.Parent.Name End If End Function |
Синтаксис:
=GetShName()
получение имени листа, в котором расположена указанная ячейка
=GetShName(
=GetShName(
Но бывают случаи, когда использование макросов весьма нежелательно. Тогда можно воспользоваться чуть более громоздкой и менее понятной формулой:
Однако эта формула вернет точно такой же результат, как функция пользователя выше и макросы совершенно не нужны.
Самая основная часть - ЯЧЕЙКА("filename";A2). Функция ЯЧЕЙКА
Т.к. нам нужно только имя листа - мы применяем ПСТР
Если по шагам просмотреть этапы работы формулы, то будет нечто вроде:
=ПСТР(ЯЧЕЙКА("filename";
=ПСТР(ЯЧЕЙКА("filename";
=ПСТР(C:\Users\Дмитрий\Desktop\[Tips_All_GetShName.xls]Лист1;50;31)
=Лист1
Второй момент: первым аргументом функции ЯЧЕЙКА указывается текст, обозначающий тип сведений. В русской локализации он доступен на русском - "имяфайла". Однако при открытии файла с этой функцией в другой локализации тип сведений не будет переведен и функция не сможет работать. Поэтому я указываю на английском, т.к. он является универсальным в данном случае и будет работать в любой локализации. Однако нет никакой ошибки, если указать на русском: ЯЧЕЙКА("имяфайла";
Если
Правда, у этой формулы есть свои недостатки: обязательно необходимо, чтобы книга была сохранена на диске. Это означает, что формула не сработает для книги, которая была только что создана и не сохранена. Связано это с ограничениями возможностей параметра "filename" функции ЯЧЕЙКА(CELL). Она не может получить путь к файлу, который еще не сохранен.
Функция пользователя(UDF)GetShName (приведенная в самом начале статьи) лишена этого недостатка.
Для чего вообще может быть нужно записывать имя листа в ячейку? Ну, например, если имя листа периодически меняется, а в своих формулах вы используете функции вроде ДВССЫЛ со ссылкой на этот лист. Либо для создания более наглядного оглавления через гиперссылки.
Кто-то уже явно догадался, что подобным же образом можно получить не только имя листа - но и имя книги:
так же как и для имени листа - можно указать ячейку из другой книги и тогда формула вернет имя той книги, из которой указана ячейка.
Если ячейка не указана - функция вернет имя активной в данный момент книги.
Так же можно получить полный путь к книге и имя книги(без квадратных скобок и имени листа):
Так же см.:
Имя предыдущего листа
Можно выписать имя листа из ссылки на лист
=ЗАМЕНИТЬ(ЗАМЕНИТЬ(ТЕКСТ(Ф.ТЕКСТ(ссылка_на_лист);0);НАЙТИ("!";ТЕКСТ(Ф.ТЕКСТ(ссылка_на_лист);0);1);ДЛСТР(ТЕКСТ(Ф.ТЕКСТ(ссылка_на_лист);0));"");1;1;"")
Денис, с виду функция куда сложнее читается и при этом не на всех версиях будет работать, т.к.Ф.ТЕКСТ появилась только начиная с 2013 Excel, если мне не изменяет память.
Длинная, конечно, формула, но работает:
=ЛЕВСИМВ(ПРАВСИМВ(ЯЧЕЙКА("адрес";[ссылка_на_ячейку_нужного_листа]);ДЛСТР(ЯЧЕЙКА("адрес";[ссылка_на_ячейку_нужного_листа]))-ПОИСК("]";ЯЧЕЙКА("адрес";[ссылка_на_ячейку_нужного_листа])));ПОИСК("'";ПРАВСИМВ(ЯЧЕЙКА("адрес";[ссылка_на_ячейку_нужного_листа]);ДЛСТР(ЯЧЕЙКА("адрес";[ссылка_на_ячейку_нужного_листа]))-ПОИСК("]";ЯЧЕЙКА("адрес";[ссылка_на_ячейку_нужного_листа]))))-1)