Проблема со стандартной обработкой ошибок в vba из-за необъяснимого зацикливания

StackOverflow https://stackoverflow.com//questions/24063246

Вопрос

Я следую инструкциям по созданию новой процедуры VBA в Access.Одной из спецификаций является использование стандартной обработки ошибок ExitProc.Я был немного сбит с толку, что это за улучшение, но я просмотрел примеры в Интернете и ранее заполненные примеры, предоставленные в качестве шаблона, я пришел к этому:

On Error GoTo HandleError
'code that may cause errors

ExitProc:
Exit Function
HandleError:
If FindFolders = False Then
    MsgBox ("Required folders for " & InstrumentName & " not found")
ElseIf FindFolderPaths = False Then
    MsgBox ("Required folder paths for " & InstrumentName & " not found")
End If

MsgBox Err.Number & " " & Err.Description & " in FindFolderPaths"
Resume ExitProc
End Function

findfolders - это логическая переменная, которую я пометил как false в процедуре, чтобы указать на ошибку, а FindFolderPaths - это имя процедуры, которую я использую для указания того, найдены ли пути.Когда я запускаю эту процедуру, появляются следующие поля сообщений.Я создал ошибку в имени папки, чтобы показать, как будет обработана ошибка :

-Необходимые папки для ICPM не найдены

-0 в FindFolderPaths

-Необходимые папки для ICPM не найдены

20 Возобновить работу без ошибок в FindFolderPaths

Когда я шаг за шагом прошел процедуру, похоже, что она дважды прокручивает HandleError перед переходом к ExitProc, и я не могу понять, почему.Также сообщение об ошибке изменяется во время второго цикла в HandleError, что странно.

Это было полезно?

Решение

Ваша проблема, похоже, заключается в том, что вы "неправильно используете" обработчик ошибок, вызывая его непосредственно в своем коде, используя Goto HandleError вместо того, чтобы вызывать его автоматически при возникновении ошибки.

Это бы точно объяснило, что, по вашему сообщению, было выведено при запуске вашего кода:

-Required folders for ICPMS not found  'shows regardless of what triggers the handler
-0 in FindFolderPaths                  'err number of zero means there's no error

Resume Exit Proc затем запускает фактический ошибка при повторном вызове кода

-Required folders for ICPMS not found        'not relevant here...
-20 Resume without Error in FindFolderPaths  'an actual error number and message

Обычно, если есть какое-то условие, которое вы можете проверить (например, отсутствующая папка), вам не нужно обрабатывать это, вызывая обработчик ошибок - вы можете показать сообщение из своего "обычного" кода, а затем просто Exit function.В качестве альтернативы можно вызвать пользовательскую ошибку, используя Err.Raise, присвоив ему конкретный номер ошибки и описание, которые вы можете протестировать и соответствующим образом обработать в своем обработчике ошибок.

http://msdn.microsoft.com/en-us/library/office/aa164019 (v=office.10).aspx#odc_tentipsvba_topic3

Другие советы

Удалить резюме EXITPROC.Код оставит функцию, когда она попадает в завершение функции.Кроме того, вам нужно удалить скобки, когда вы звоните Msgbox.Используйте только скобки, когда вы устанавливаете что-то равное MSGBox.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top