Я бы держал очень скрытый лист с формулой, которую вы использовали, ссылаясь на каждый лист.
Когда происходит событие Workbook_NewSheet
, создается формула, указывающая на новый лист:
- Создайте лист и присвойте ему Кодовое имя из
shtNames
. - Дайте листу имя вкладки из
SheetNames
. - В ячейку
A1
из shtNames
добавьте заголовок (я только что использовал "Список листов"), - В Свойства для смены листа Видимый на 2 - xlSheetVeryHidden .
Вы можете сделать это, только если есть хотя бы один видимыйлист слева.
- Добавьте этот код в модуль
ThisWorkbook
:
Private Sub Workbook_NewSheet(ByVal Sh As Object)
With shtNames
.Cells(.Rows.Count, 1).End(xlUp).Offset(1).Formula = _
"=RIGHT(CELL(""filename"",'" & Sh.Name & "'!$A$1), " & _
"LEN(CELL(""filename"",'" & Sh.Name & "'!$A$1))-" & _
"FIND(""]"",CELL(""filename"",'" & Sh.Name & "'!$A$1),1))"
End With
End Sub
Создайте именованный диапазон в NameМенеджер :
- Я назвал это
SheetList
. - Используйте эту формулу:
=SheetNames!$A$2:INDEX(SheetNames!$A:$A,COUNTA(SheetNames!$A:$A))
Затем можно использовать SheetList
в качестве источника для списков проверки данных и элементов управления списками.
Две потенциальные проблемы, которые я еще не рассмотрел, - это перестановка листов и удаление листов.
, поэтому, когда кто-то меняет имя листа, макрос продолжает работать
Как сказал @SNicolaou - используйте кодовое имя листа, которое пользователь не может изменить, и ваш код будет работать независимо от имени вкладки листа.