Страницы: 1 2 След.
RSS
Как определить отсутствие листа в книге без on error?
 
Здравствуйте. Возможно ли без перебора названий листов через for each и без on error как-то проверить наличие\отсутствие листа в книге?
Причина вопроса в том, что on error по каким то причинам иногда на коде типа  Set А = Workbooks(B).Worksheets(D)
не отрабатывает и код вылетает с ошибкой "9" - Subсkript out of range. (break on unhandles error -стоит опция в редакторе кода)

Это происходит, когда нужного листа в книге нет.
Собственно код пишется с целью проверки наличия листа. И далее идет:
if A is nothing then
собственно ветвление по наличию или отсутствию листа.
Есть способ еще как-то проверить присутствие листа в книге?
Изменено: Neufazendnik - 12.07.2018 18:26:01
 
Цитата
on error по каким то причинам иногда... не отрабатывает
Неопределенная ошибка - плохо. С причиной бы разобраться.
 
Глючит эксель иногда. Если сбросить и открыть заново приложение - на том же коде ошибки уже нет. Через какое-то время может появиться. Отловить влияющие причины довольно проблематично. Хочу подстраховаться и обойти этот скользкий момент. потому и ищу альтернативы.
Изменено: Neufazendnik - 12.07.2018 19:30:47
 
Цитата
Neufazendnik написал:
Есть способ еще как-то проверить..?
Да. С помощью флага. На колене:
Код
f=0
for each sh in thisworbook.worksheets
if sh.name = SearchName then f=true: Exit for
next
Изменено: kuklp - 12.07.2018 20:14:12
Я сам - дурнее всякого примера! ...
 
Сергей, я точно такое предложил :)
потом удалил
Цитата
Возможно ли без перебора названий листов через for each и без on error
Но названию темы соответствует. Пусть вариант остается.
 
Привет, Вить. Согласен, прозевал)
Я сам - дурнее всякого примера! ...
 
На форуме было - прочитать оглавление файла xls через АПИ(Володя Захаров вроде автор), но если у ТС родное глючит, предлагать лезть в системные функции.. :)
Я сам - дурнее всякого примера! ...
 
А без перебора, но с On Error Resume Next устроит? ))
 
Юрий М,
Цитата
Neufazendnik написал:
без перебора названий листов через for each и без on error как-то проверить
Че-то  кот сегодня мышей не ловит.
Изменено: БМВ - 12.07.2018 23:44:48
По вопросам из тем форума, личку не читаю.
 
Миш, как раз ловлю: Витю даже поймал с циклом )) А я автора спрашиваю - может его устроит вариант без цикла, но с On Error
 
Следующая универсальная функция не замечена в неподобающем поведении:
Код
' Проверяет, есть ли в коллекции Col объект с именем Name. Возвращает True (есть), False (нет)
Function ItemExists(ByVal Col, ByVal Name) As Variant
    Dim v As Object
    On Error Resume Next
    Set v = Col.Item(Name)
    ItemExists = (Err.Number = 0)
    Set v = Nothing
    On Error GoTo 0
End Function

Sub test()
   Debug.Print ItemExists(Worksheets, "Лист3")
End Sub
Владимир
 
Юрий,
Цитата
kuklp написал: но если у ТС родное глючит
Цитата
vikttur написал: С причиной бы разобраться.
Мне кажется на этом изыски можно закончить ибо один черт все или на переборе или на отлове ошибки.
По вопросам из тем форума, личку не читаю.
 
Цитата
Юрий М написал:
может его устроит вариант без цикла, но с On Error
Да есть он. Не фурычит же. Потому и создал тему.
 
Цитата
sokol92 написал:
Следующая универсальная функция не замечена в неподобающем поведении:
Опять on error...
я пробовал вариации на эту тему уже. В том числе обращение к свойству Cells не существующего листа.
Глюки... глюки...
On error не срабатывает ни так ни эдак, как будто его нет.
Цитата
kuklp написал:
На форуме было - прочитать оглавление файла xls через АПИ(Володя Захаров вроде автор),
Да, тема известная. Но с точки зрения быстродействия не айс. Тут тогда уж лучше for each. Меня последний только из-за быстродействия не устраивает. Листов в книге много и процедура к тому же очень много раз вызывается. Хотелось бы, чтобы она пошустрее лётала.
 
Цитата
Neufazendnik написал:
Глюки... глюки...
Пример - в студию (с #11). А по быстродействию - миллион проверок за 3 секунды:

Код
Sub test()
  Dim t As Double, b As Boolean, i As Long
  t = Timer
  For i = 1 To 1000000
   b = ItemExists(Worksheets, "Лист" & (i Mod 4))
  Next i
  
  Debug.Print Timer - t
End Sub
Изменено: sokol92 - 13.07.2018 00:34:20
Владимир
 
До кучи:
Код
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
 
Off. Один из моих любимых писателей... Ссылка в комментарии в предыдущем сообщении устарела - новая здесь.
Изменено: sokol92 - 13.07.2018 00:54:14
Владимир
 
Цитата
sokol92 написал:
Пример - в студию
Нет примера не рабочего кода. Есть пример приложения, в котором on error периодически перестает выполнять свою роль. С приложением в разумный срок разобраться не сможете.
 
Цитата
sokol92 написал:
А по быстродействию - миллион проверок за 3 секунды:
Ну да, в попугаях мы гораздо длиннее. Нагрузи книгу листами и все уже много печальнее. - 100 тысяч итераций = 16 секунд в моей рабочей книге.
Объем обработки в моей задаче предполагает пару миллионов итераций. Это лишние 3 минуты выполнения кода.
 
Цитата
Neufazendnik написал:
Есть пример приложения, в котором on error периодически перестает выполнять свою роль
Я не программист и не претендую, те отрывочные знания накопленные по необходимости - не так обширны, но вот уж тут они позволяют вспомнить про "Одного в ногу и семь не в ногу в строю" , только в данном случае наоборот. У Вас сбоит что-то общее, что приводит к программному сбою, а Вы ищете метод который будет работать без сбоя, как Вам кажется. Ну сработает метод тут, вылезет проблема в другом, по не устраненной причине.
Хорошо, не получается обработать ошибку, чем перебор плох? Долго писать - вроде нет, долго обрабатывать - ну все от количества листов  зависит, но не думаю что критично. Ну сделайте словарь, хранимый в памяти и используйте его, только естественно пополнять новыми и удалять ненужные объекты не забывайте.
По вопросам из тем форума, личку не читаю.
 
Так перебором и заткнул дыру пока. Но мало ли, вдруг чего не знаю и есть еще варианты. Потому и задал вопрос. А с причиной сбоя разбираться нет смысла. Так или иначе со временем наверняка и она вылезет. Зацикливаться на ней слишком затратно. Так что принимаю ситуацию как есть и стараюсь сделать код стабильнее.
 
Цитата
Neufazendnik написал:
А с причиной сбоя разбираться нет смысла.
ой, как это неправильно, но Вам решать.
По вопросам из тем форума, личку не читаю.
 
Цитата
Neufazendnik написал:
с причиной сбоя разбираться нет смысла. ... стараюсь сделать код стабильнее.
Хитро!! Это как если у машины отвалился ведущий мост,  а мы наращиваем мощность движка :D
Я сам - дурнее всякого примера! ...
 
Не надо путать отвалившийся мост с шумом не ясного происхождения, который присутствует много лет в весьма сложном рабочем механизме.
Изменено: Neufazendnik - 14.07.2018 12:00:19
 
Цитата
БМВ написал:
ой, как это неправильно, но Вам решать.
Объем работы, необходимый на выявление причины, оцениваю в несколько месяцев. Зачем? Если что критичное, оно вылезет в явной форме со временем. Не вылезет - значит не столь критично. Ситуация то какая. Имеем сутками и неделями работающее приложение. В какой-то момент появляется сбой. От чего? Да фиг знает. Сотни сложных подпрограмм отработали по 100 раз, прежде чем проблема на каком-то этапе образовалась. Логичного механизма отловить этот этап практически не возможно помыслить. Сидеть надеяться на случай - не метод. Задача на мой взгляд из числа неберучек. В лоб решать нет смысла. Нужно ждать появления стабильных закономерностей, после которых появляется сбой. Тогда будет возможность разобраться с его причиной.
Изменено: Neufazendnik - 14.07.2018 12:12:48
 
Цитата
Neufazendnik написал:
оцениваю в несколько месяцев
Еще одно озарение :) Я всю систему, со всеми установленными программами, настройками, драйверами переустанавливаю за 5-7 минут. Из записанного образа. Но Вы идете своим, непроторенным доселе путем. Уважаю! 8)
Я сам - дурнее всякого примера! ...
 
kuklp, Какое отношение переустановка системы имеет к особенностям vba кода? Вы за 5-7 минут устраняете ошибки кода любой программы?
Изменено: Neufazendnik - 14.07.2018 12:18:58
 
Я о своей системе со своими программами писал. За пару тысяч рублей(вообще-то мало, штук за  пять будет нормально) легко установлю на ваш комп свой образ со своими драйверами. Если Вы этого не понимаете, еще плюс сто Вам в карму.
Я сам - дурнее всякого примера! ...
 
А зачем мне Ваши драйвера? Вы тему явно попутали. И я это хорошо понимаю. Или вы из тех диагностов, что при любой поломке кричат: У вас отвалился задний мост! Давайте я помогу его поменять!
Изменено: Neufazendnik - 14.07.2018 12:32:34
 
Да угомонитесь уже. Вы по пять раз редактируете свои посты. Зачем? Мне неинтересно. Вы не хотите слушать других: У всех работает код с On error - у Вас нет. А дальше читайте #23. Ради Бога, идите своим путем, меняйте радиостанцию в приемнике, колпачки на шинах, что хотите. Месяцами, годами. Я приветствую Вашу приверженность к упрямству))
Я сам - дурнее всякого примера! ...
Страницы: 1 2 След.
Наверх