Лоуренсу нужен способ определить номер рабочего листа, даже если он был переименован. Например, если рабочий лист называется Sheet11, достаточно легко определить, что это лист 11. Если он переименовывает лист в «Январь», Лоуренсу по-прежнему нужен способ узнать, что это лист 11.

Решение этой проблемы лучше всего делать с помощью пользовательской функции (макроса). На самом деле есть два числа, которые макрос может возвращать для каждого рабочего листа. Первый — это порядковый номер рабочего листа. Это число представляет собой индекс объекта Worksheet рабочего листа в коллекции Worksheets. Это значение может быть возвращено макросом, подобным следующему:

Function SheetNumber1(shtname As String)

Dim sht As Worksheet

Application.Volatile     For Each sht In ThisWorkbook.Worksheets          If LCase(sht.Name) = LCase(shtname) Then               SheetNumber1 = sht.Index               Exit Function          End If     Next     SheetNumber1 = -1 End Function

Эта функция, при использовании на листе, вернет порядковый номер любого рабочего листа, имя которого передается в функцию. Если имя, которое передается функции, не существует в коллекции рабочих листов, функция возвращает значение -1. Например, следующее, используемое в ячейке, вернет значение индекса для рабочего листа с именем «Январь» в коллекции:

=SheetNumber("January")

Проблема с этим подходом заключается в том, что порядок объектов Worksheet в коллекции Worksheets может со временем меняться. Таким образом, вы не всегда можете предположить, что одиннадцатый лист в коллекции — это лист, который изначально был Sheet11.

Более последовательный способ определения исходного имени рабочего листа (независимо от того, как он переименован) — использовать то, что Visual Basic называет «CodeName» листа. Это свойство рабочего листа, которое можно определить следующим образом:

Function SheetNumber2(shtname As String)

Dim sht As Worksheet     Dim sTemp As String

Application.Volatile     For Each sht In ThisWorkbook.Worksheets          If LCase(sht.Name) = LCase(shtname) Then               sTemp = sht.CodeName               SheetNumber2 = Val(Mid(sTemp, 6, 4))

Exit Function          End If     Next     SheetNumber2 = -1 End Function

Свойство CodeName в макросе доступно только для чтения. Он назначается во время создания рабочего листа, но его можно изменить вручную в редакторе Visual Basic. CodeName всегда представляет собой строку, представляющую самое первое имя, которое было применено к рабочему листу, поэтому это будет что-то вроде «Sheet11». После установки CodeName, даже если рабочий лист будет переименован (например, в «Январь»), он останется стабильным («Sheet11»).

В примере макроса (SheetNumber2) свойство CodeName присвоено переменной sTemp. В большинстве случаев это будет что-то вроде «Sheet3» или «Sheet11». Итак, макрос затем получает числовое значение того, что начинается с шестого символа (сразу после «Sheet»). Это значение, возвращаемое функцией.

_Примечание: _

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

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (3398) относится к Microsoft Excel 97, 2000, 2002 и 2003. Вы можете найти версию этого совета для ленточного интерфейса Excel (Excel 2007 и новее) здесь:

link: / excelribbon-Determining_a_Worksheets_Number [Определение номера рабочего листа].