Здравствуйте. Мною написан короткий и простой макрос, который проверяет соответствие Codename имени листа и, если найдено несоответствие, - переименовывает его. При Option Explicit макрос прекрасно работает, но если удалить тот лист, который переименовывается - то выпадает ошибка (Compile Error: Variable Not Defined).
Если закомментировать Option Explicit, то макрос отлично работает и при удалении переименовываемого листа - этот вариант неплох, но с Option Explicit как-то спокойнее. Как подружить Option Explicit с обращением к удаленному листу - надо переменную объявить? Что посоветуете?
Сам макрос:
Код
Option Explicit
Sub Кнопка1_Щелчок()
On Error GoTo ErrorHandler
'Проверка на соответствие codename листа имени листа
'Если codename листа не соответствует имени листа, то происходит принудительное переименование
If Лист2.Name <> "2" Then
Лист2.Name = "2"
End If
Exit Sub
GoTo Ends:
ErrorHandler:
On Error Resume Next
MsgBox "Ошибка. Лист не найден!", vbCritical, "Logistic information"
Ends:
End Sub
Hugo, Можно тогда оставить так, как есть (без Option Explicit)? Дело в том, что в этот модуль с общей кнопкой мне необходимо засунуть еще пару макросов с объявлением переменных (эти макросы будут вызываться последовательно) и первым будет выполняться вышеуказанный макрос наличия-переименовывания листа. То есть, иными словами, если все дополнительные макросы будут написаны правильно - можно ли обойтись без Option Explicit?
Boris777 написал: можно ли обойтись без Option Explicit?
Конечно. Я вообще ее никогда не использую. Эта штука полезна только на очень длинных листингах, где задействованы десятки переменных с заковыристыми названиями - на случай опечатки.
Option Explicit
Sub Кнопка1_Щелчок()
'On Error GoTo ErrorHandler
Dim sh As Worksheet
'Проверка на соответствие codename листа имени листа
'Если codename листа не соответствует имени листа, то происходит принудительное переименование
For Each sh In ThisWorkbook.Worksheets
If sh.CodeName = "Лист2" Then sh.Name = "2": Exit Sub
Next
'If Лист2.Name <> "2" Then
'Лист2.Name = "2"
'End If
''---------
'Exit Sub
'GoTo Ends:
'ErrorHandler:
'On Error Resume Next
'MsgBox "Ошибка. Лист не найден!", vbCritical, "Logistic information"
'
'Ends:
End Sub
Забыл про "Dim") Но все равно такой код не годится - мусор, как вы выразились, не является мусором - пользователь должен понимать, почему не происходит выполнение макроса (должен быть задействован On Error GoTo ErrorHandler или что-то иное). При удалении листа просто ничего не происходит при вашем коде.
А как мне быть, если надо проверить не один, а несколько листов на предмет соответствия имен и (или) их наличия в книге? А то у меня макрос затыкается после первого листа
Юрий М, Так вроде самое прямое отношение имеет - я выложил пример с одним листом для простоты восприятия. Нужно было в самом начале темы сразу про несколько листов задать вопрос?
Юрий М, Эх, в этом-то и затык - я весь форум обшарил этот, и не только этот. И зарегистрировался тут. С этим CodeName реально не могу найти решения - по имени листов решений много, а по нескольким CodeName не найду - подскажите, пожалуйста, куда копать. С несколькими листами по CodeName работает, но без Option Explicit
Boris777, Вы не понимаете. Попробую иначе: представьте, что на форум зашёл человек с проблемой - как проверить наличие листа в книге. Придёт ли ему в голову искать ответ на свой вопрос в теме про Конфликт Option Explicit и Codename? Ну посудите сами...
Boris777 написал: как мне быть, если надо проверить не один, а несколько листов на предмет соответствия имен и (или) их наличия в книге?
учить мат.часть, циклы и т.п. Для удобства можно создать функцию поиска листа по кодовому имени и вызывать её столько, сколько нужно. Можно даже создать массив из имен и проверять перед выполнением наличие их всех в целевой книге. Для самообразования можете почитать: Кодовое имя листа - что это и зачем нужно? Какие плюсы и минусы? Там, кстати, и функция поиска листа по кодовому имени тоже есть. И если надо проверить несколько - останется лишь создать массив с кодовыми именами для проверки:
Код
Sub Foo()
Dim aShts, x
aShts = Array("Лист1", "Лист4")
For each x in aShts
If FindSheetByCodeName(ActiveWorkbook, x) = False Then
MsgBox "Нет такого листа - " & x, vbCritical, "www.excel-vba.ru"
End If
next
End Sub
Вместо ActiveWorkbook можно использовать любую другую книгу, наличие листа в которой надо проверить, а массив aShts можно дополнять и изменять.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...