MyTetra Share
Делитесь знаниями!
имя листа формулой
16.03.2019
23:43
Текстовые метки: имя листа формулой
Раздел: !Закладки - VBA - Excel - Листы

имя листа формулой

Задача: записать в отдельной ячейке или внутри формулы имя текущего листа(т.е. того, в котором сама функция).

В принципе это очень легко сделать простейшей функцией пользователя:

'--------------------------------------------------------------------------------------- ' 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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

'---------------------------------------------------------------------------------------

' 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(A1) - данная запись равнозначна записи без ячейки, т.к. ячейка все равно в пределах листа с самой функцией
=GetShName(Лист2!A1)


Но бывают случаи, когда использование макросов весьма нежелательно. Тогда можно воспользоваться чуть более громоздкой и менее понятной формулой:
=ПСТР(ЯЧЕЙКА("filename";A2);ПОИСК("]";ЯЧЕЙКА("filename";A2))+1;31)
=MID(CELL("filename",A2),SEARCH("]",CELL("filename",A2))+1,31)
Однако эта формула вернет точно такой же результат, как функция пользователя выше и макросы совершенно не нужны.

Теперь разберем эту формулу поподробнее
Самая основная часть - ЯЧЕЙКА("filename";A2). Функция ЯЧЕЙКА (CELL) с записанным первым аргументом "filename" возвращает полный путь к книге, включая имя листа и адрес ячейки, в которой записана функция:
C:\Users\Дмитрий\Desktop\[Tips_All_GetShName.xls]Лист1
Т.к. нам нужно только имя листа - мы применяем ПСТР (MID), которая возвращает часть текста, начиная с указанной позиции символа. ПОИСК (SEARCH) ищет нам именно эту позицию - позицию символа "]".
Если по шагам просмотреть этапы работы формулы, то будет нечто вроде:
=ПСТР(ЯЧЕЙКА("filename";A2);ПОИСК("]";ЯЧЕЙКА("filename";A2))+1;31)
Шаг1 =>
=ПСТР(ЯЧЕЙКА("filename";A2);ПОИСК("]";C:\Users\Дмитрий\Desktop\[Tips_All_GetShName.xls]Лист1)+1;31)
Шаг2 =>
=ПСТР(ЯЧЕЙКА("filename";A2);49+1;31)
Шаг3 =>
=ПСТР(C:\Users\Дмитрий\Desktop\[Tips_All_GetShName.xls]Лист1;50;31)
Шаг4 =>
=Лист1
Первый момент: почему применяю цифру 31 последним аргументом ПСТР? По факту, там необходимо указывать точное количество символов, но если указать больше - то будут взяты все символы от указанного и до последнего. Т.е можно было бы указать и 99, но 31 - это максимальное количество символов, которое можно использовать в имени листа.
Второй момент: первым аргументом функции ЯЧЕЙКА указывается текст, обозначающий тип сведений. В русской локализации он доступен на русском - "имяфайла". Однако при открытии файла с этой функцией в другой локализации тип сведений не будет переведен и функция не сможет работать. Поэтому я указываю на английском, т.к. он является универсальным в данном случае и будет работать в любой локализации. Однако нет никакой ошибки, если указать на русском: ЯЧЕЙКА("имяфайла";A2)

Если вторым аргументом функции ЯЧЕЙКА ничего не указывать(=ЯЧЕЙКА("filename")), то функция вернет полный путь с именем того листа, который активен в данный момент(даже если это лист другой книги).

Для чего вообще может быть нужно записывать имя листа в ячейку? Ну, например, если имя листа периодически меняется, а в своих формулах вы используете функции вроде ДВССЫЛ со ссылкой на этот лист. Либо для создания более наглядного оглавления через гиперссылки.


Кто-то уже явно догадался, что подобным же образом можно получить не только имя листа - но и имя книги:
=ПСТР(ЯЧЕЙКА("filename");ПОИСК("[";ЯЧЕЙКА("filename"))+1;ПОИСК("]";ЯЧЕЙКА("filename"))-ПОИСК("[";ЯЧЕЙКА("filename"))-1)
так же как и для имени листа - можно указать ячейку из другой книги и тогда формула вернет имя той книги, из которой указана ячейка.
Если ячейка не указана - функция вернет имя активной в данный момент книги.

Так же можно получить полный путь к книге и имя книги(без квадратных скобок и имени листа):
=ПОДСТАВИТЬ(ПСТР(ЯЧЕЙКА("filename";A1);1;ПОИСК("]";ЯЧЕЙКА("filename";A1))-1);"[";"")

Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования