Страницы: 1
RSS
VBA. Определить существование листа с определенным именем
 
Доброго всем форумчанам утра. надеюсь у всех машины завелись и никто ни куда не опоздал.  
Прошу подсказать, как с помощью VBA выявить отсутствие в книге листа с указанным именем.  
У меня такой код  
Есть некий текстбокс куда пользователь вводит нужную дату.  
переменной D присваивается значение этого текстбокса. Нужно, чтобы если не существует листа с именем, указанным пользователем, произвести дальнейшие действия.  
 
D = Chislo.Value  
If Sheets(D) = Nothing Then  
MsgBox ("There is no Sheets" & D)  
Else  
...........  
При компиляции ругается.  
Что тут не так?
 
То есть можно написать вот так в моей ситуации?  
 
D = Chislo.Value  
Set wsSh = Sheets(D)  
If wsSh Is Nothing Then  
MsgBox ("There is no Sheets" & D)  
Else  
 
Так будет правильно?
 
D = Значение из бокса ' это номер листа  
On Error Resume Next  
Set wsSheet = Sheets(D)  
If Err.Number <> 0 Then MsgBox ("There is no Sheets" & D)
 
{quote}{login=k61}{date=01.02.2012 10:35}{thema=так будет работать:}{post}D = Значение из бокса ' это номер листа  
On Error Resume Next  
Set wsSheet = Sheets(D)  
If Err.Number <> 0 Then MsgBox ("There is no Sheets" & D){/post}{/quote}  
 
сделал так.  
не работает  
D = Chislo.Value  
Set wsSheet = Sheets(D)  
If Err.Number <> 0 Then  
MsgBox ("Текст сообщения")  
Else
 
так попробуйте:  
 
On Error Resume Next  
D = Chislo.Value  
Set wsSheet = Sheets(D) ...
Редко но метко ...
 
А зачем делать пропуск ошибки?
 
потому что без пропуска код остановит выполнение на строке генерирующей ошибку.
Редко но метко ...
 
Chislo.Value - это что?  
Строка или число?
 
Мне не надо пропускать ошибку. так как отсутствие листа и есть ошибка, которую нужно показать в виде MsgBox!  
Chislo - это название текстбокса, в который вводится дата.    
эта строка работает. у меня много ссылок в коде на значение D  и все в порядке.
 
Забыл указать, что дата водится в виде целого числа от 1 до 31
 
Тогда следующий вопрос - как определена D?  
Лучше бы конечно пример в файле видеть...
 
тип переменной variable. пробовал другие типы, но почему то возникает ошибка.  
D = Chislo.Value  
 
строк в коде больше тысячи. все что связано с использованием переменной D работает.  
 
Например  
If 1 > D > 31 Or D = "" Then  
MsgBox ("Укажите число месяца!!!")  
Else  
 
Или еще пример  
 
PE = Sheets(D).Range("C" & Cells.Rows.Count).End(xlUp).Row + 1  
   Sheets(D).Cells(PE, 3) = "Точки"  
   Sheets(D).Cells(PE, 4) = "Центр затрат"  
   Sheets(D).Cells(PE, 5) = "Сумма, руб"  
    Sheets(D).Cells(PE, 6) = "Статьи затрат"  
   Sheets(D).Cells(PE, 7) = "Комментарии"  
   Sheets(D).Range("C" & PE & ":G" & PE).Font.Bold = True  
   Sheets(D).Range("C" & PE & ":G" & PE).Font.Size = 12
 
По мотивам кода рядом :)  
 
Sub test()  
   Dim D, sh, y As Boolean  
 
   D = "Sheet3"  
 
   For Each sh In Sheets  
       If D = sh.Name Then y = True: Exit For  
   Next  
 
   If y Then  
       MsgBox "Есть!"  
   Else  
       MsgBox "Нет!"  
   End If  
 
End Sub
 
От Климова П.Ю.  
Вариант I. (без 'генерации' ошибки)    
Option Compare Text  'Если Вы не  
понимаете, зачем используется эта инструкция, то оставьте её в покое  
 
Private Function WorksheetIsExist(iName$) As Boolean  
'***********************************************'  
'   Дата создания 01/01/2005                    '  
'   Автор Климов Павел Юрьевич                  '  
'   http://www.msoffice.nm.ru                   '  
'***********************************************'    
   Dim iList As Worksheet    
   For Each iList In Worksheets    
       If iList.Name = iName$ Then    
          WorksheetIsExist = True    
          Exit Function    
       End If    
   Next    
   WorksheetIsExist = False    
End Function  
 
Private Function WorksheetIsExist(iName$) As Boolean  
'***********************************************'  
'   Дата создания 01/01/2005                    '  
'   Автор Климов Павел Юрьевич                  '  
'   http://www.msoffice.nm.ru                   '  
'***********************************************'    
   Dim iList As Worksheet    
   For Each iList In Worksheets    
       If StrComp(iList.Name, iName$, vbTextCompare) = 0 Then  
          WorksheetIsExist = True  
          Exit Function  
       End If  
   Next  
   WorksheetIsExist = False  
End Function  
 
Вариант II.    
Private Function WorksheetIsExist(iName$) As Boolean  
'***********************************************'  
'   Дата создания 01/01/2005                    '  
'   Автор Климов Павел Юрьевич                  '  
'   http://www.msoffice.nm.ru                   '  
'***********************************************'    
   On Error Resume Next  
   WorksheetIsExist = IsObject(Worksheets(iName$))  
End Function  
 
Private Function WorksheetIsExist(iName$) As Boolean  
   On Error Resume Next  
   WorksheetIsExist = (TypeOf Worksheets(iName$) Is Worksheet)  
End Function  
 
Private Function WorksheetIsExist(iName$) As Boolean  
   On Error Resume Next  
   WorksheetIsExist = (TypeName(Worksheets(iName$)) = "Worksheet")  
End Function  
 
Private Function WorksheetIsExist(iName$) As Boolean  
   On Error Resume Next  
   WorksheetIsExist = (VarType(Worksheets(iName$)) = vbObject)  
End Function  
 
Private Function WorksheetIsExist(iName$) As Boolean  
   On Error Resume Next  
   WorksheetIsExist = Len(Worksheets(iName$).Name) > 0  
End Function  
 
Private Function WorksheetIsExist(iName$) As Boolean  
   On Error Resume Next  
   WorksheetIsExist = Worksheets(iName$).Index > 0  
End Function  
Пример вызова любой из вышеопубликованных авторских функций :    
Private Sub Test()  
   MsgBox WorksheetIsExist("Имя_Рабочего_Листа")  
End Sub
 
Юрий М, мне нужно привязать проверку к переменной D.  
так как D принимает нужное значение, то именно лист с именем равным значению переменной D должен искаться.  
в ваших примерах этого нет.  
 
Попробую пример от Hugo и отпишусь
 
Hugo, кстати D в данном случае не может быть boolean.
 
Никто и не спорит, она Variant.  
Решил ей тип не задавать - чтоб как у Вас было :)
 
Кстати, все примеры от Юры только это и проверяют - именно имя листа.
 
Hugo, на объявление типа переменной sh ругается.  
Пишет "For each control variable must be Variant or Object".  
Получается что тип переменной неверно задан?
 
{quote}{login=vovik_lmz}{date=01.02.2012 03:10}{thema=}{post}Юрий М, мне нужно привязать проверку к переменной D. так как D принимает нужное значение, то именно лист с именем равным значению переменной D должен искаться.  
в ваших примерах этого нет.{/post}{/quote}зато есть вот это:  
"Имя_Рабочего_Листа" - ставьте вместо ЭТОГО ТЕКСТА Вашу переменную.
 
Сделал вот так.  
Выдает ошибку "Next Without For"  
Но For же есть!!! не пойму никак.  
D = Chislo.Value  
 
For Each sh In Sheets  
If D = sh.Name Then  
y = True: Exit For  
Next  
Else: y = False  
If y = False Then  
MsgBox ("Ëèñò íà óêàçàííóþ âàìè äàòó íå ñóùåñòâóåò. Ïîæàëóéñòà ñîçäàéòå ëèñò ñ èìåíåì" & D)  
 End If
 
Значит У ВАС неверно задан...  
Ясно ведь написано: must be Variant or Object
 
"Next Without For"  
Стандартный ответ при неверно написанной конструкции If...End If
 
vovik_lmz, у Вас есть куча работоспособных вариантов. В чём проблема?  
Скопируйте в модуль две процедуры, и выполните Sub Test  
 
Private Function WorksheetIsExist(iName$) As Boolean  
On Error Resume Next  
WorksheetIsExist = Len(Worksheets(iName$).Name) > 0  
End Function  
Private Sub Test()  
Dim D As String  
D = "Лист4"' Здесь поставьте нужное имя  
MsgBox WorksheetIsExist(D)  
End Sub
 
Код с кракозябрами вообще не понял...  
Задумывалось вероятно так:  
 
   D = Chislo.Value  
 
   For Each sh In Sheets  
       If D = sh.Name Then y = True: Exit For  
   Next  
 
   If y = False Then  
       MsgBox ("Нет Листа" & D)  
   End If
 
Итак уважаемы форумчане.  
Вот этот вариант работает так как надо.  
Всем откликнувшимся большое спасибо!  
 
D = Chislo.Value  
For Each sh In Sheets  
 If D = sh.Name Then y = True: Exit For  
Next  
If y = False Then  
MsgBox ("Лист не существует. Создайте лист с именем " & D)  
Else  
...  
...  
...  
End if
 
Послесловие. Без цикла:  
Sub test()  
D = Application.InputBox("Введите имя листа:", "Проверка.", "Лист1", Type:=2)  
On Error Resume Next  
Set wsSheet = Sheets(D)  
If Err.Number <> 0 Then  
MsgBox ("Нет листа Sheets" & D)  
Else  
MsgBox ("Есть лист Sheets" & D)  
End If  
End Sub
Страницы: 1
Наверх