VBA. Определить существование листа с определенным именем
Пользователь
Сообщений: Регистрация: 01.01.1970
01.02.2012 09:32:29
Доброго всем форумчанам утра. надеюсь у всех машины завелись и никто ни куда не опоздал. Прошу подсказать, как с помощью VBA выявить отсутствие в книге листа с указанным именем. У меня такой код Есть некий текстбокс куда пользователь вводит нужную дату. переменной D присваивается значение этого текстбокса. Нужно, чтобы если не существует листа с именем, указанным пользователем, произвести дальнейшие действия.
D = Chislo.Value If Sheets(D) = Nothing Then MsgBox ("There is no Sheets" & D) Else ........... При компиляции ругается. Что тут не так?
Пользователь
Сообщений: Регистрация: 01.01.1970
01.02.2012 10:13:27
То есть можно написать вот так в моей ситуации?
D = Chislo.Value Set wsSh = Sheets(D) If wsSh Is Nothing Then MsgBox ("There is no Sheets" & D) Else
Так будет правильно?
Пользователь
Сообщений: Регистрация: 21.12.2012
01.02.2012 10:35:18
D = Значение из бокса ' это номер листа On Error Resume Next Set wsSheet = Sheets(D) If Err.Number <> 0 Then MsgBox ("There is no Sheets" & D)
Guest
Гость
01.02.2012 11:44:04
{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
Пользователь
Сообщений: Регистрация: 24.12.2012
01.02.2012 11:58:59
так попробуйте:
On Error Resume Next D = Chislo.Value Set wsSheet = Sheets(D) ...
Редко но метко ...
Пользователь
Сообщений: Регистрация: 01.01.1970
01.02.2012 12:00:09
А зачем делать пропуск ошибки?
Пользователь
Сообщений: Регистрация: 24.12.2012
01.02.2012 12:01:28
потому что без пропуска код остановит выполнение на строке генерирующей ошибку.
Редко но метко ...
Пользователь
Сообщений: Регистрация: 22.12.2012
01.02.2012 12:29:11
Chislo.Value - это что? Строка или число?
Пользователь
Сообщений: Регистрация: 01.01.1970
01.02.2012 13:17:17
Мне не надо пропускать ошибку. так как отсутствие листа и есть ошибка, которую нужно показать в виде MsgBox! Chislo - это название текстбокса, в который вводится дата. эта строка работает. у меня много ссылок в коде на значение D и все в порядке.
Пользователь
Сообщений: Регистрация: 01.01.1970
01.02.2012 13:18:00
Забыл указать, что дата водится в виде целого числа от 1 до 31
Пользователь
Сообщений: Регистрация: 22.12.2012
01.02.2012 13:26:33
Тогда следующий вопрос - как определена D? Лучше бы конечно пример в файле видеть...
Пользователь
Сообщений: Регистрация: 01.01.1970
01.02.2012 13:40:32
тип переменной variable. пробовал другие типы, но почему то возникает ошибка. D = Chislo.Value
строк в коде больше тысячи. все что связано с использованием переменной D работает.
Например If 1 > D > 31 Or D = "" Then MsgBox ("Укажите число месяца!!!") Else
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
Модератор
Сообщений: Регистрация: 14.09.2012
Контакты см. в профиле
01.02.2012 14:27:34
От Климова П.Ю. Вариант I. (без 'генерации' ошибки) Option Compare Text 'Если Вы не понимаете, зачем используется эта инструкция, то оставьте её в покое
Private Function WorksheetIsExist(iName$) As Boolean '***********************************************' ' Дата создания 01/01/2005 ' ' Автор Климов Павел Юрьевич ' ' ' '***********************************************' 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 ' ' Автор Климов Павел Юрьевич ' ' ' '***********************************************' 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 ' ' Автор Климов Павел Юрьевич ' ' ' '***********************************************' 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
Пользователь
Сообщений: Регистрация: 01.01.1970
01.02.2012 15:10:50
Юрий М, мне нужно привязать проверку к переменной D. так как D принимает нужное значение, то именно лист с именем равным значению переменной D должен искаться. в ваших примерах этого нет.
Попробую пример от Hugo и отпишусь
Пользователь
Сообщений: Регистрация: 01.01.1970
01.02.2012 15:13:09
Hugo, кстати D в данном случае не может быть boolean.
Пользователь
Сообщений: Регистрация: 22.12.2012
01.02.2012 15:19:36
Никто и не спорит, она Variant. Решил ей тип не задавать - чтоб как у Вас было :)
Пользователь
Сообщений: Регистрация: 22.12.2012
01.02.2012 15:21:55
Кстати, все примеры от Юры только это и проверяют - именно имя листа.
Пользователь
Сообщений: Регистрация: 01.01.1970
01.02.2012 15:23:28
Hugo, на объявление типа переменной sh ругается. Пишет "For each control variable must be Variant or Object". Получается что тип переменной неверно задан?
Модератор
Сообщений: Регистрация: 14.09.2012
Контакты см. в профиле
01.02.2012 15:23:35
{quote}{login=vovik_lmz}{date=01.02.2012 03:10}{thema=}{post}Юрий М, мне нужно привязать проверку к переменной D. так как D принимает нужное значение, то именно лист с именем равным значению переменной D должен искаться. в ваших примерах этого нет.{/post}{/quote}зато есть вот это: "Имя_Рабочего_Листа" - ставьте вместо ЭТОГО ТЕКСТА Вашу переменную.
Пользователь
Сообщений: Регистрация: 01.01.1970
01.02.2012 15:31:48
Сделал вот так. Выдает ошибку "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
Пользователь
Сообщений: Регистрация: 22.12.2012
01.02.2012 15:31:58
Значит У ВАС неверно задан... Ясно ведь написано: must be Variant or Object
Пользователь
Сообщений: Регистрация: 21.12.2012
01.02.2012 15:36:45
"Next Without For" Стандартный ответ при неверно написанной конструкции If...End If
Модератор
Сообщений: Регистрация: 14.09.2012
Контакты см. в профиле
01.02.2012 15:42:32
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
Пользователь
Сообщений: Регистрация: 22.12.2012
01.02.2012 15:46:46
Код с кракозябрами вообще не понял... Задумывалось вероятно так:
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
Пользователь
Сообщений: Регистрация: 01.01.1970
01.02.2012 15:56:55
Итак уважаемы форумчане. Вот этот вариант работает так как надо. Всем откликнувшимся большое спасибо!
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
Пользователь
Сообщений: Регистрация: 21.12.2012
02.02.2012 02:35:38
Послесловие. Без цикла: 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