powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработать ошибки
28 сообщений из 28, показаны все 2 страниц
Обработать ошибки
    #35310881
Андрюхец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет народ
как нормально обрабатывать ошибки
в моей программе взде стоит обрабока ошибок
результаты обработки просто ссобщения
и почемуто 100 раз она отрабатывает ошибку нормально а на 101 выдает критическую
как можно гасить любую возникающую ошибку в приложении или это невозможно?
...
Рейтинг: 0 / 0
Обработать ошибки
    #35310901
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего невозможного нет.
On Error Resume Next
- "ибудит тибе щасте".

Но не слишком ли большой будет эта радость?
...
Рейтинг: 0 / 0
Обработать ошибки
    #35310915
Андрюхец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это можно применить только к канкретному куску текста а не к приложению в целом
этого у мя и так хватает
а вот как бы реально защитить приложение от сбоев
...
Рейтинг: 0 / 0
Обработать ошибки
    #35312589
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отладить его.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35312980
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
" ...результаты обработки просто ссобщения ..." Просто сообщений недостаточно, нужно как-то реагировать еще, например, вызывать одни модули и не вызывать другие. И посмотри опции в Tools/General/Error Trapping. И самое главное: избавься от On Error Resume Next.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35313029
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnсамое главное: избавься от On Error Resume NextПожалуй, я бы не был столь категоричен.

Инструкция полезная, а во многих случаях - необходимая (можно даже через пробел: "не обходимая").
Главное - не забывать после неё правильно поставить On Error GoTo ...
...
Рейтинг: 0 / 0
Обработать ошибки
    #35313120
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:0)

Любопытно взглянуть на примеры "необходимая" и "не обходимая"!
...
Рейтинг: 0 / 0
Обработать ошибки
    #35313166
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цитата из http://www.cpearson.com/excel/ErrorHandling.htm:

A Note Of Caution

...It is tempting to deal with errors by placing an On Error Resume Next statement at the top of the procedure in order to get the code to run without raising an error. This is very bad coding practice. Remember that using On Error Resume Next does not fix errors. It merely ignores them...

Я знаю, что люди в принципе используют (я бы сказал, что это даже популярно) On Error Resume Next в сочетании с CommonDialog и его свойством CancelError, а также в событии Form_Resize (классика), но обязательно ли это? Это в определенных случаях помогает сократить код, но подход в целом опасен, так как прячет проблему, а вот всегда ли мы лезем в Err, чтобы ее оттуда извлечь?
...
Рейтинг: 0 / 0
Обработать ошибки
    #35313216
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnЛюбопытно взглянуть на примеры "необходимая" и "не обходимая"!Ну, коли любопытно...

"Не обходимая" - например, при заполнении объекта типа Collection значениями с попутным контролем уникальности. Может быть, кроме отключения (resume next) и последующей проверки err.number есть другой способ определить, что в коллекции нет члена с определённым значением ключа, но мне он неизвестен.

Насколько я знаю, ключ формируется один раз при добавлении в коллекцию очередного Item, и в дальнейшем по этому ключу можно извлекать элемент, но нет способа прочесть ключ элемента, извлеченного, скажем, в цикле For Each....

Вы знаете такой способ? Поделитесь, плииз :)


Другой (впрочем, не очень-то и другой) случай - поиск имени с определённой иерархией областей поиска. Вот пример из боевой программы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Property Get WsRange(ws As Worksheet, rngID As String, _
        Optional OnWsOnly As Boolean = False) As Range

    If Err Then Exit Property
    If ws Is Nothing Then Exit Property

    On Error Resume Next
    With ws
        Set WsRange = .Range(rngID)
        If Err Then Err.Clear Else Exit Property

        If OnWsOnly Then Exit Property

        Set WsRange = .Names(rngID).RefersToRange
        If Err Then Err.Clear Else Exit Property
        Set WsRange = .Parent.Names(rngID).RefersToRange
        If Err Then Err.Clear
    End With
End Property
Вы можете предложить более корректный вариант? Приму с благодарностью.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35313221
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ч-чёрт, нет возможности редактировать...
Поправка: не поиск имени , а поиск диапазона по имени .
...
Рейтинг: 0 / 0
Обработать ошибки
    #35317557
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДмиДми,

На первый вопрос ответить чрезвычайно легко: вы используете не тот объект. В вашем случае используют не Collection, а Dictionary, вот и все. Гвозди забивают молотком, а не плоскогубцами.
Пойду читать второй пример.

Успехов.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35317706
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДмиДми,

Насчет второго примера: Вы бы не могли пояснить, что вы на самом деле подразумеваете под rngID : Name или ID?

И для чего вы его передаете ByRef?
...
Рейтинг: 0 / 0
Обработать ошибки
    #35317825
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnВ вашем случае используют не Collection, а DictionaryВ данном конкретном случае Вы меня убедили: не "не_обходимо", а "необходимо", и даже "иногда необходимо".

P.S. Риторический вопрос к победителю: а всегда ли Вам захочется ради одного только метода Exists (без которого легко можно обойтись) подтягивать целую библиотеку и грузить в память ещё один очень даже немаленький объект?
...
Рейтинг: 0 / 0
Обработать ошибки
    #35317866
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnчто вы на самом деле подразумеваете под rngID : Name или ID?
И для чего вы его передаете ByRef?
1. Это всегда Name. В качестве побочного эффекта - может быть использована и привычная A1-адресация, но не используется.
2. Так оно исторически сложилось. А сейчас во всю дурь действует древнее правило "пока работает - не трожь!"
Имена относительно коротки, можно было бы и в самом деле передавать значение, но незачем возиться: этот код выполняется относительно редко и на быстродействие не влияет, объект с этим свойством только один - стало быть, и память особо не сэкономишь (если сэкономишь вообще).
...
Рейтинг: 0 / 0
Обработать ошибки
    #35317872
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnДмиДми,

На первый вопрос ответить чрезвычайно легко: вы используете не тот объект. В вашем случае используют не Collection, а Dictionary, вот и все. Гвозди забивают молотком, а не плоскогубцами.
Пойду читать второй пример.

Успехов.

Но если очень хочется, то обойти все равно можно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub CommandButton1_Click()
    Dim objMyVBACollection As New VBA.Collection
    
    AddItemToCollection objMyVBACollection, "A", "1"
    AddItemToCollection objMyVBACollection, "B", "1"
    AddItemToCollection objMyVBACollection, "C", "1"
    AddItemToCollection objMyVBACollection, "D", "1"
End Sub

Private Sub AddItemToCollection(ByRef ioobjMyCollection As VBA.Collection, _
                                                          ByVal pstrItem As String, _
                                                          ByVal pstrKey As String)

    Static intKeyIncrement As Integer
    
    ioobjMyCollection.Add pstrItem, pstrKey & "_" & CStr(intKeyIncrement)
    intKeyIncrement = intKeyIncrement +  1 
    
End Sub

Успехов
...
Рейтинг: 0 / 0
Обработать ошибки
    #35317898
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДмиДми VladConnчто вы на самом деле подразумеваете под rngID : Name или ID?
И для чего вы его передаете ByRef?
1. Это всегда Name. В качестве побочного эффекта - может быть использована и привычная A1-адресация, но не используется.


Спасибо, ДмиДми,

Тогда можно сказать следующее: переименуйте rngID в rngName, ID - это что-то для линкованных рангов, по-моему, имя переменной вводит в заблуждение и напрягает. И наконец: зачем вообще потребовалось делать иерархический поиск имени ранга, если все равно все имена рангов внутри данной книги уникальны? Ну так и ищите сразу по всей книге одной строкой, и не надо тогда On Error Resume Next.

Успехов.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35317953
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnAddItemToCollectionТакой способ добавления не сопровождается контролем уникальности pstrItem.
VladConnзачем вообще потребовалось делать иерархический поиск имени ранга, если все равно все имена рангов внутри данной книги уникальны?Нет. Есть идентичные имена уровня листа (на многих листах, и любое из них может отсылать к диапазону как "своего", так и другого листа) и уровня книги.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35318007
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уникальность Item? Вы об этом не упоминали, и Collection - не тот объект, он не требует уникальности Item. Вы показывали проблему уникальности ключа. И в случае с Item не требуется, кстати, On Error Resume Next, т.к. ошибки не возникает.

Успехов
...
Рейтинг: 0 / 0
Обработать ошибки
    #35318012
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry, не ответил сразу.
VladConnпереименуйте rngID в rngName, ID - это что-то для линкованных ранговТак оно и есть. Excel в данном случае работает в паре с Access'ом, и в Аксе rngId используется для линковки.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35318036
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
" ...Нет. Есть идентичные имена уровня листа (на многих листах, и любое из них может отсылать к диапазону как "своего", так и другого листа) и уровня книги. "

Если вас не затруднит, покажите способ создания неуникальных имен рангов: звучит странно. Пока я не увижу, что это на самом деле возможно: два разных ранга с одним и тем же именем, я не смогу согласиться с вашим "Нет." А если увижу, то тогда посмотрю, как можно обойти On Error Resume Next.

Я подозреваю, что вы смешиваете понятия диапазона клеток и ранга.

Успехов
...
Рейтинг: 0 / 0
Обработать ошибки
    #35318055
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnУникальность Item? Вы об этом не упоминали, и Collection - не тот объект, он не требует уникальности ItemРазве не упоминал? ДмиДми при заполнении объекта типа Collection значениями с попутным контролем уникальности Уникальности же требует не объект Collection, её требую я.
Я строю составной индекс, и ключ - функция нескольких свойств объекта, ссылка на который заносится в коллекцию.

Повторение ключа недопустимо, но возможно, так как линкуемые таблицы приходят от неподвластных мне балбесов-операторов. Поэтому одна из первых задач - обнаружить и ликвидировать повторения значений ключа, вызванные ошибками во входных данных.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35318069
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДимДим, вы говорили о проблеме уникальности ключа, а не Item.

Требование уникальности Item - не VB-шное, а значит и oшибка не генерируется, а значит и On Error Resume Next не потребуется.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35318073
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnЕсли вас не затруднит, покажите способ создания неуникальных имен рангов: звучит странно. Пока я не увижу, что это на самом деле возможно: два разных ранга с одним и тем же именем, я не смогу согласиться с вашим "Нет." А если увижу, то тогда посмотрю, как можно обойти On Error Resume Next.Вы про Эксель?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Sub add_name(sheet_name As String)
    Worksheets(sheet_name).Names.Add Name:="aaa", RefersTo:=Worksheets(sheet_name).Range("A1")
    Worksheets(sheet_name).Range("B2") = "=aaa"
    Worksheets(sheet_name).Range("aaa") = sheet_name
End Sub

Sub start_here()
    ' создаем
    add_name ActiveSheet.Name
    Worksheets.Add
    add_name ActiveSheet.Name
    Worksheets.Add
    ActiveSheet.Range("B2") = "=aaa"

    ' убеждаемся
    Worksheets("Sheet1").Activate
    Debug.Print Application.Range("aaa")
    Worksheets("Sheet2").Activate
    Debug.Print Application.Range("aaa")
    Worksheets("Sheet3").Activate
    Debug.Print Application.Range("Sheet1!aaa")
    Debug.Print Worksheets("Sheet1").Range("aaa")
    Debug.Print Application.Range("aaa")
End Sub
...
Рейтинг: 0 / 0
Обработать ошибки
    #35318109
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnПока я не увижу, что это на самом деле возможно: два разных ранга с одним и тем же именем, я не смогуУвидев три, сможете? :) Их могло бы быть и больше при большем количестве листов.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35318127
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пошел в список имен и увидел только один ранг:

Код: plaintext
=Sheet3!$A$ 1 

Успехов.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35318136
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДмиДми VladConnПока я не увижу, что это на самом деле возможно: два разных ранга с одним и тем же именем, я не смогуУвидев три, сможете? :) Их могло бы быть и больше при большем количестве листов.

ДмиДми, я на работе и скачивать не имею права. Позже, дома. Предыдущий ответ был основан на примере от WhiteOwl.

Вы пишите, но мне надо начать работать наконец. На следующей неделе посмотрю уже.

Приятных выходных.
...
Рейтинг: 0 / 0
Обработать ошибки
    #35318164
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnЯ пошел в список имен и увидел только один рангРазверните комбобокс имён (он слева от строки формул) и кликните то единственное, что увидите в списке - свой ник.
Проделайте это на всех листах.

Засим откланиваюсь.
Успехов!
...
Рейтинг: 0 / 0
Обработать ошибки
    #35321252
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OK,

Насколько я понял, на каждом листе действительно могут быть имена, такие же, как на других листах. В жизни не стал бы делать себе такую головную боль. В дополнение, может быть имя уровня книги. Имя может отсылать на какой угодно ранг книги.

В вашем примере кода property возвращает в разных случаях разное. Я не уверен, что достаточно разобрался, но вот этот пример не возвращает то, что нужно?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Private Sub CommandButton1_Click()
    Dim MyClass As New Class1
    Dim R As Range
    
    Set R = MyClass.WsRange(Worksheets("List1"), "VladConn", True) 'R is Nothing
    Set R = MyClass.WsRange(Worksheets("List2"), "VladConn", True):    Debug.Print R.Worksheet.Name & ", " & R.Address
    Set R = MyClass.WsRange(Worksheets("List3"), "VladConn", True):    Debug.Print R.Worksheet.Name & ", " & R.Address
    Set R = MyClass.WsRange(Worksheets("List3"), "VladConn"):    Debug.Print R.Worksheet.Name & ", " & R.Address
    Set R = MyClass.WsRange(Worksheets("List1"), "VladConn"):    Debug.Print R.Worksheet.Name & ", " & R.Address
    
End Sub

Property Get WsRange(ws As Worksheet, _
                                   rngID As String, _
                                   Optional OnWsOnly As Boolean = False) As Range
    
    Dim objReturn As Range
    
    On Error GoTo MethodExit

    If Not ws Is Nothing Then

        If OnWsOnly Then
            Set objReturn = ws.Names(rngID).RefersToRange
        Else
            Set objReturn = ws.Parent.Names(rngID).RefersToRange
        End If

    End If
    
MethodExit:

    Set WsRange = objReturn
    
    If Err.Number <>  0  Then
        If Err.Number =  1004  Then
            Err.Clear
        Else
            MsgBox "Error " & Err.Description & " in NewWsRange", vbCritical
        End If
    End If

End Property

Иерархия - поиск либо на уровне данного листа либо на уровне всей книги. Так?
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработать ошибки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]