Определение номера рабочего листа (Microsoft Excel)
Лоуренсу нужен способ определить номер рабочего листа, даже если он был переименован. Например, если рабочий лист называется 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 [Определение номера рабочего листа]
.