Страницы: 1
RSS
Как правильно использовать CodeName?
 
Здравствуйте. Мною написан короткий и простой макрос, который проверяет соответствие 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
Изменено: Boris777 - 21.02.2019 22:14:48
 
Думаю никак. На то оно и Option Explicit чтоб сообщать о присутствии неизвестных объектов в коде.
 
Hugo, Можно тогда оставить так, как есть (без Option Explicit)? Дело в том, что в этот модуль с общей кнопкой мне необходимо засунуть еще пару макросов с объявлением переменных (эти макросы будут вызываться последовательно)  и первым будет выполняться вышеуказанный макрос наличия-переименовывания листа. То есть, иными словами, если все дополнительные макросы будут написаны правильно - можно ли обойтись без Option Explicit?
 
Я так делаю
Код
For Each sh In ThisWorkbook.Worksheets
If sh.CodeName = "Лист2" Then sh.Name = "2": Exit Sub
Next
 
RAN, Благодарю, но увы, ваш код тоже конфликтует с 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


Могу и файл без листа вернуть.  :D
Изменено: RAN - 21.02.2019 21:09:23
 
Boris777, код следует оформлять соответствующим тегом: ищите такую кнопку (см. скрин) и исправьте своё сообщение.
 
Цитата
RAN,
Забыл про "Dim")
Но все равно такой код не годится - мусор, как вы выразились, не является мусором - пользователь должен понимать, почему не происходит выполнение макроса (должен быть задействован On Error GoTo ErrorHandler или что-то иное).
При удалении листа просто ничего не происходит при вашем коде.
Изменено: Boris777 - 21.02.2019 21:22:29
 
Цитата
Boris777 написал:
должен быть задействован On Error GoTo ErrorHandler или что-то иное
Строку
Код
'MsgBox "Ошибка. Лист не найден!"

раскомментируйте.
 
RAN,
Неплохо, мой друг :)

А как мне быть, если надо проверить не один, а несколько листов на предмет соответствия имен и (или) их наличия в книге?
А то у меня макрос затыкается после первого листа
Изменено: Boris777 - 21.02.2019 21:33:54
 
Boris777, а какое отношение этот дополнительный вопрос имеет к заявленной теме?
 
Юрий М, Так вроде самое прямое отношение имеет - я выложил пример с одним листом для простоты восприятия. Нужно было в самом начале темы сразу про несколько листов задать вопрос?
 
Нет: вопрос о проверке наличия листа (листов) в книге следует задавать в другой теме. Или найти нужную тему - их было достаточно.
 
Юрий М, Эх, в этом-то и затык - я весь форум обшарил этот, и не только этот. И зарегистрировался тут. С этим CodeName реально не могу найти решения - по имени листов решений много, а по  нескольким CodeName не найду - подскажите, пожалуйста, куда копать. С несколькими листами по CodeName работает, но без  Option Explicit
Изменено: Boris777 - 21.02.2019 21:51:48
 
Нужно вместо двух слов Exit sub, написать три - else и end if
 
Boris777, Вы не понимаете. Попробую иначе: представьте, что на форум зашёл человек с проблемой - как проверить наличие листа в книге. Придёт ли ему в голову искать ответ на свой вопрос в теме про Конфликт Option Explicit и Codename? Ну посудите сами...
 
Благодарю всех. Надеюсь, что теперь получится. RAN, вам особенный респект!
 
Юрий М, В любом случае, благодарю за понимание и наводки :)  
 
Почистил.
 
Цитата
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 можно дополнять и изменять.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, Благодарю, полезный ликбез :)  
Страницы: 1
Наверх