2016-06-23 2 views
0

Извинения заранее - это может быть длинный - весь код добавлен в нижней части.Доступ к ошибкам во время VBA 2016 - Как поймать?

Я работаю над базой данных для отслеживания билетов на поддержку. Я пытался очистить ошибки, которые появлялись с помощью трекера, поэтому я начал работать с перестройкой - Очистка кода - Изменение имен полей и т. Д. - Это была совершенно новая база данных, к которой никто не имел доступа. Но по какой-то причине мой код ошибки больше не выглядит. Поэтому позвольте мне объяснить все.

Передняя часть открыта и открыта, загружает форму входа - это использует DLOOKUP для проверки и сопоставления паролей. Это нормально. После входа в форму ввода билета (Frm_ticket_Entry) у этого есть несколько полей для данных и 2 кнопки. (Я только перечислю некоторые, как ни один из них на самом деле обязательно)

имена полей:

Ticket_Number - (fairly self explanatory) 
    Agent   - (Agent working ticket) 
    Return_Team - (if ticket was returned) 

Кнопки:

New Record - (Adds a new record - Guess you can tell that) 
    Save Record - (saves record after data changes) 

При использовании Err.raise ("номер ошибки") - Мои улавливатель работает как ожидалось

Когда я выключаю err.raise (закомментирую) и запускаю все - иногда я ударяю «Ошибки времени выполнения» (такие как заблокированные для редактирования) в моей предыдущей версии БД - это было поймано моим ошибка c atcher - и создал пользовательский вывод - теперь, похоже, он не хочет улавливать ошибки во время выполнения. Почему бы и нет, что происходит не так !? (извинения за экстенсивного чтения - я изо всех сил, чтобы описать вещи точно, но вкратце - Дополнительная информация доступна, если требуется/Запрошен.)

код для «Новая запись»:

Private Sub btn_NewRecord_Click() 
    DoCmd.GoToRecord , , acNewRec 'Add a new record 
    Me.Ticket_Number = "#" ' Change ticket number textbox to "#" 
    Me.Kickback_Reason = "Pass to next level support" ' - Set Default entry for kick back reason 
    Me.Agent = User() ' Set "Agent" field to the currently logged in user 
    Me.Returning_Team = "CSC Service Desk" ' Set default for "Returning Team" 
    DoCmd.RunCommand acCmdSaveRecord 'Save the record into the table 
    DoCmd.GoToRecord acDataTable = tbl_Tickets, , acLast ' return to the last saved record 

On Error GoTo Error_Handle  
' Err.Raise 3314, "btn_New_Record_Click()", "Errored" ' Force error for debug purposes 
' Err.Raise 2105, "btn_New_Record_Click()", "Errored" 
' Err.Raise 21345, , "Unknown Error Occured" 
Exit Sub 

Error_Handle: 

Call ErrorLogger(Err.Number, Err.Description, Err.Source)  
    Err.Clear 
    MsgBox "Error Trapping complete"  
    Resume Next  
    End Sub 

и код для ErrorLogger:

Function ErrorLogger(ErrNum As Integer, ErrDesc, ErrSrc As String) 

Select Case ErrNum 

Case 3314 ' You must enter a value in the 'tblKickbacks.Ticket Number' field. 
MsgBox "It seems some required fields may not have been completed! " _ 
& "Please ensure you have filled in 'Ticket Number'/'Agent'/ 'Returning Team' and/or 'Kickback Reason'" 

If IsNull(Me.Ticket_Number) Then 
Me.Ticket_Number.SetFocus 
End If 

If (MsgBox("Error " & ErrNum & " occured." & vbNewLine _ 
& "Details : " & ErrDesc & vbNewLine _ 
& "Error occured in : " & ErrSrc & vbNewLine _ 
& "Would you like to send an email error report?" _ 
, 4 Or 16, "ERROR DETECTED")) = vbYes _ 
Then 
    GoTo DevEmail 
Else 
    GoTo Err_Exit 
End If 

Case 2105 ' You can't go to the specified record. 

MsgBox "Error Caught - 2105" 

Case 3218 ' Error Description: Could not update; currently locked. 

' Need to find and add code here for forcibly unlocking any and ALL locked records 

Case Else 
MsgBox "Error : " & ErrNum & " -- " & ErrDesc & " " _ 
& "Not recognised - Sending error email" 
GoTo DevEmail 

End Select 

DevEmail: 

Dim oAPP As Outlook.Application 
Dim oMail As Outlook.MailItem 

' Create the Outlook session. 
Set oAPP = New Outlook.Application 

' Create the message. 
Set oMail = oAPP.CreateItem(olMailItem) 

With oMail 
    ' Add the To recipient(s) to the message. 
    .To = "[email protected]" 
    .Subject = "Tracker V2 Error" 
    .Body = "Error message as Follows:" & vbNewLine _ 
        & "Error Number: " & ErrNum & vbNewLine _ 
        & "Error Description: " & ErrDesc & vbNewLine _ 
        & "Error Source: " & ErrSrc 
    .Send 
End With 
MsgBox "Email has been sent" 

Err_Exit:   
End Function 

ответ

2

Перемещение On Error GoTo Error_Handle с первой строки.

Private Sub btn_NewRecord_Click() 
    On Error GoTo Error_Handle  

    ... 

End Sub 
+0

Я не был в состоянии создать конфликт и проверить это - Но если это все было не так, а потом проклятье. Не знаю, как я могу быть настолько глупым o.O Это логичный смысл. Но по какой-то причине я думал, что On Error GoTo был общим для всех ошибок - независимо от положения в коде. Я не могу поверить, что я мог бы выглядеть так просто! Я буду держать это открытым - До тех пор, пока я не смогу подтвердить, что ошибка ловли работает нормально? Я планирую масштабный тест базы данных позже сегодня - так что, надеюсь, все должно быть хорошо :) –

+0

Я тестировал эту БД, и все было в порядке. 3 человека на тесте получали «Ошибка времени выполнения 6 - переполнение» - мой код ошибки не смог поймать эту ошибку и сообщить об этом, как я закодировал. который был взят из-за того, что были пойманы другие ошибки (Err.2105/Err.3218) Необычное дело в том, что другой пользователь, который тестировал, использовал тот же * Копировать * файла FE - и записывался в тот же файл BE - и не получалось никаких ошибок:/- Это начинает меня путать. Любая дополнительная помощь будет принята с благодарностью. ~ Matt –

+1

Если ошибка не улавливается, она возникает из другого кода. Поместите обработчик ошибок в полный код. – BitAccesser

0

Там нет ничего между об ошибке Гото errhandle и выходе подразделах вам нужна эта строка выше кода, который добавляет новую запись

Смежные вопросы