У меня проблема с UDF нижнего уровня, который выдает ошибку до обработки ошибок подпрограммы самого высокого уровня. Я думал, что смогу исправить это с помощью On Error GoTo -1
, но проблема все еще возникает.
Согласно Microsoft, «без оператора On Error GoTo -1
исключение автоматически отключается при выходе из процедуры» (https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/on-error-statement). Означает ли это, что когда я вызываю подпрограмму более низкого уровня, я "завершаю" процедуру и аннулирую оператор On Error GoTo -1
?
Например, это для подпрограммы, которая принимает документ Excelи объединяет его с изображениями JPG в PDF. Изображения JPG должны быть упорядочены по номеру, который заканчивается именем их файла (то есть Photomics0). Иногда имя файла не будет иметь номер в конце имени файла. Я хочу эточтобы вызвать нормальную ошибку, которая должна произойти.
Подпрограмма самого высокого уровня имеет следующую обработку ошибок:
Sub Example()
Do While t = 1
On Error GoTo errorMSG1
Set wb2 = Workbooks(Copyrange)
On Error GoTo -1
'
' more code here & call to other subroutines
'
Exit Sub
Loop
errorMSG1:
On Error GoTo -1
'
' Code that notifies user that they don't have the excel document open in
' background and opens it for them
'
End Sub
UDF самого низкого уровня (3 уровня вниз) приводит к ошибке с кодом:
retvalint = CLng(retval)
из-за того, что retval
должно быть числом в конце имени файла jpg. Без номера retval
пусто и броситьs ошибка, из-за которой код переходит на errorMSG1
, чего я не хочу.
Я должен также сказать, что это всегда происходит, когда исходная ошибка, которую я пытаюсь перехватить, не возникает. Я не проверял, происходит ли это, когда происходит первоначальная ошибка.
Я пытался бросить On Error GoTo -1
абсолютно везде на всех уровнях моих подпрограмм и функций, но безрезультатно.
Кроме того, стоит отметить, что это пример того, как ошибки «всплывают»?
РЕДАКТИРОВАТЬ: я должен также сказать, что ранее я пытался использовать On Error GoTo 0
, но более высокий уровеньсаб имеет большое Do Loop
в нем. Я заметил, что, когда исходная ошибка, которую я пытался уловить, возникла на итерации> = 2, она выдала бы исходную ошибку Runtime Error
.