Не перехватывается ошибка. Куда вставить обработчик?

VitAks
Дата: 10.11.2009 01:11:57
Не подскажите, где ошибка возникает и как ее нужно обрабатывать?

Цель: ввести понятные пользователю пояснения.

Ситуация: при импорте файл пользователь выбрал не тот. Как результат: разбор первой строки происходит, а вставка полученного значения в таблицу не происходит, так как целевое поле имеет тип дата.

Несмотря на вставленный обработчик, ошибка (13 - не соответствие типов)
не пререхватывается.

Помогите понять.


Public Function ImportRstSAP()

Dim path As String
path = WH_GetFileName

Dim dtDate_1 As Date

'Очистим результирующую таблицу
CurrentDb.Execute ("Delete * from Unloading")

Dim TextLine As String
Dim rst As DAO.Recordset, D, s, f
Set rst = CurrentDb.OpenRecordset("Select * from Unloading")

f = FreeFile: Open path For Input As f
'Do While Not EOF(1)
Do Until EOF(f)
       Line Input #f, TextLine
       'Debug.Print TextLine
       s = Split(TextLine, ";")
       D = s(0)
       
       On Error GoTo Err_fileFormat
        dtDate_1 = CDate(DateSerial(Mid(D, 1, 4), Mid(D, 5, 2), Mid(D, 7, 2)))
       
       rst.AddNew
         rst.Fields(1) = dtDate_1
         rst.Fields(2) = s(1)
         rst.Fields(3) = s(2)
         rst.Fields(4) = s(3)
         rst.Fields(5) = s(4)
         rst.Fields(6) = s(5)
         rst.Fields(7) = s(6)
         rst.Fields(8) = s(7)
         rst.Fields(9) = s(8)
         rst.Fields(10) = CInt(s(9))
         rst.Fields(11) = CCur(s(10))
         rst.Fields(12) = CInt(s(11))
         rst.Fields(13) = CInt(s(12))
         rst.Fields(14) = CInt(s(13))
         rst.Fields(15) = CInt(s(14))
         rst.Fields(16) = CInt(s(15))
         rst.Fields(17) = CInt(s(16))
         rst.Fields(18) = CInt(s(17))
         rst.Fields(19) = CInt(s(18))
         rst.Fields(20) = CInt(s(19))
         rst.Fields(21) = CInt(s(20))
         rst.Fields(22) = CInt(s(21))
       rst.Update
     
Loop
rst.Close
Set rst = Nothing
Close f

MsgBox "Импорт произведен"
Exit_fileFormat:
    Exit Function
    
Err_fileFormat:
Select Case Err.namber
Case 13
    Call Form_Error(13, 0)
MsgBox "Error " & Err.Number & ": " & Err.Description & "[color=red]пояснение хочу ввести[/color]", _
             vbOKOnly + vbCritical, "adhGetNextAutoNumber"

            Resume Exit_fileFormat
End Select
End Function
qwrqwr
Дата: 10.11.2009 01:40:41
VitAks


Err_fileFormat:
Select Case Err.namber
Case 13
может из-за этого?
VitAks
Дата: 10.11.2009 01:49:51
qwrqwr,

Спасибо, но дотуда не доходит.

возникает стандартное окно сообщеня, а после нажатия "отладка" выделяется это:

dtDate_1 = CDate(DateSerial(Mid(D, 1, 4), Mid(D, 5, 2), Mid(D, 7, 2)))
VitAks
Дата: 10.11.2009 02:14:10
Мне кажется, что я не понимаю как это работает.

Вот тут тут
было обсуждение, и там даны пояснения, но что-то я не понимаю. У меня-то где возникает эта ошибка и где ее ловить?

Место возникновения

Цитата:

Дополнительные сведения

Если не выполнена инструкция On Error, то любая ошибка выполнения является фатальной; это означает, что выводится сообщение об ошибке и выполнение программы прекращается.
"Включенным" обработчиком ошибок называют подпрограмму, которая указана в инструкции On Error; "активным" обработчиком ошибок является включенный обработчик ошибок, который обрабатывает текущую ошибку. Если ошибка возникает в самом обработчике ошибок (в промежутке между возникновением ошибки и выполнением инструкции Resume, Exit Sub, Exit Function или Exit Property), то обработчик ошибок, определенный в текущей процедуре, не может обработать ошибку. Управление в этом случае возвращается в вызывающую процедуру; если в вызывающей процедуре включен обработчик ошибок, то обработка ошибки передается ему. Если этот обработчик ошибок является в данный момент активным, т.е. уже обрабатывает ошибку, то управление снова передается назад в вызывающую процедуру и т.д. до тех пор, пока не будет найден включенный, но не активный обработчик ошибок. Если включенный, но неактивный обработчик ошибок найден не будет, ошибка становится фатальной в том месте программы, в котором она впервые возникла. При каждой передаче управления обработчиком ошибок в вызывающую процедуру эта процедура становится текущей. После завершения обработки ошибки обработчиком в любой процедуре возобновляется выполнение текущей процедуры с той ее части, которая указана в инструкции Resume.


Конец цитаты.
develed
Дата: 10.11.2009 06:36:56
On Error перенеси в начало функции (как вариант).
VitAks
Дата: 10.11.2009 09:45:05
develed,
Спасибо,
но,
не помогает.
VitAks
Дата: 10.11.2009 09:56:36
VitAks,

Вы не поверите, но вредно сидеть по ночам!

Err_fileFormat:
Select Case Err.Number
Case 13
    'Call Form_Error(13, 0)
    
MsgBox "Error " & Err.Number & ": " & Err.Description & "Мой личный текст", _
             vbOKOnly + vbCritical


Вот ни к селу ни к городу это Call. Это у меня вовсе не форма, а совсем даже такой стандартный модуль.

Проблема решена. А потому что утро мудро.
develed
Дата: 10.11.2009 10:44:52
Значит ошибка все же перехватывалась. Надо было сразу пошагово в отладчике смотреть.:)
VitAks
Дата: 10.11.2009 11:48:00
develed,

Спасибо.
VitAks
Дата: 10.11.2009 23:39:58
А вот ни фига, приключения продолжаются!
На домашнем компе все так же, выводится стандартное сообщение, а не мое.

В результате всякого разного тыкания, научного и не очень, выяснилось:

В редакторе VBA есть Options.
Там, на вкладке General,
в секции Error Trapping, нужно установить переключатель
Break on Unhandled Errors.

Разбираться сейчас не могу, просто может кому поможет это сообщение.

Вторые сутки, полет нормальный...