Страницы: 1
RSS
Остановить выполнения макроса если ошибка
 
Добрый день. Уменя маленькая проблема с макросом.  
 
Sub Макрос  
   Sheets(2).Copy After:=Sheets(2)  
   Sheets(1).Select  
   Sheets(3).Name = Cells(1, 2)  
   End Sub  
 
Этот макрос копирует лист2 и присваивает  имя из лист1 ячейка В1. Макрос работает, но если лист с таким именем уже существует, выбивает ошибку. Мне надо чтоб при возникновении ошибки робота макроса останавливалась, и всплывало сообщение "Лист с таким именем существует".
 
Да нет, лучше перед копированием проверить, нет ли такого листа. И если есть - не копировать.
Я сам - дурнее всякого примера! ...
 
Sub Макрос2()  
On Error Resume Next  
Set wsSh = Sheets(Как указать чтоб имя листа сверялось с Лист1 ячейка В1?)  
If wsSh Is Nothing Then MsgBox "Листа нет"  
End Sub
 
Set wsSh = Sheets(Sheets("Лист1").[B1])
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Function WorksheetExist(wsname As String) As Boolean  
'Возвращает ИСТИНА, если лист существует  
   Dim x As Worksheet  
   On Error Resume Next  
   Set x = Worksheets(wsname)  
   WorksheetExist = (Err = 0)  
End Function
Я сам - дурнее всякого примера! ...
 
Что-то ничего не получается
 
Sub Макрос2()  
On Error Resume Next  
Set wsSh = Sheets(Как указать чтоб имя листа бралось из Лист1 ячейка В1?)  
If wsSh Is Nothing Then MsgBox "Листа нет"  
End Sub  
 
Ответ предложенный ikki н работает
 
Set wsSh = Sheets(Sheets("Лист1").[B1].VALUE)
Я сам - дурнее всякого примера! ...
 
Огромное спасибо за помощь. Все работает.
 
а ведь я проверял... работало :(
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
мда... понял: не находило несуществующий лист, но существующий тоже не находило.  
а "проверял" я только первый вариант :(  
 
DimaLulchuk, прошу прощения.    
 
 
пс. и всё-таки... немножко странно - разве свойство Value не является "умолчальным"?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
(заставь дурака богу молиться... :)  
я дальше полез  
 
Sheets(...) - это ведь короткая форма записи для Sheets.Item(...), да?  
всё-таки Sheets() - это не массив, а коллекшн.  
 
а для Item в справке написано:  
 
Returns a single object from a collection.  
 
expression.Item(Index)  
expression -   Required. An expression that returns all other objects in the Applies To list.  
 
Index -  Required Variant. The name {!!!} or index number {!!!} for the object.  
 
фигурные скобки - мои, конечно :)  
 
так что объект-то Item() принять может (т.к. объект - это подтип для Variant). но почему такой вариант для него предпочтительный - всё же непонятно.    
 
впрочем, это не страшно и не сложно дописать пяток символов в коде.  
но - когда знаешь.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Мож так понятней:  
Set Statement  
Assigns an object reference to a variable or property.  
Syntax  
Set objectvar = {[New] objectexpression | Nothing}
То есть из-за ключевого слов Set компилятор ожидает именно объект. А  
Sheets("Лист1").[B1] и есть объект range. Если явно не указать его свойство - value.
Я сам - дурнее всякого примера! ...
 
а разве Set ждет объекты от ЛЮБОЙ части того что справа? :)  
 
set x=sheets(...) - да, конечно.  
но sheets(...) и вернет объект - указанный по имени или индексу элемент коллекции.  
это понятно. вопросов нет.  
но это же не означает, что "..." - тоже должен быть объект?  
это непонятно.  
 
Дмитрий, Сергей, большое спасибо за разъяснения.    
у меня вопросов больше нет. буду знать и пользоваться так, как требует Excel.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ikki, можно проверить, отключив On Error Resume Next. Получим неверный тип данных. Не вилит Экс в range строку, видит объект.
Я сам - дурнее всякого примера! ...
Страницы: 1
Читают тему
Наверх