Доброго всем форумчанам утра. надеюсь у всех машины завелись и никто ни куда не опоздал. Прошу подсказать, как с помощью VBA выявить отсутствие в книге листа с указанным именем. У меня такой код Есть некий текстбокс куда пользователь вводит нужную дату. переменной D присваивается значение этого текстбокса. Нужно, чтобы если не существует листа с именем, указанным пользователем, произвести дальнейшие действия.
D = Chislo.Value If Sheets(D) = Nothing Then MsgBox ("There is no Sheets" & D) Else ........... При компиляции ругается. Что тут не так?
{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
Мне не надо пропускать ошибку. так как отсутствие листа и есть ошибка, которую нужно показать в виде MsgBox! Chislo - это название текстбокса, в который вводится дата. эта строка работает. у меня много ссылок в коде на значение D и все в порядке.
От Климова П.Ю. Вариант 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, на объявление типа переменной 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
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) 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