Я поместил это здесь, потому что это было слишком долго для комментария, и, хотя Я только попугай, что @Mathieu Guindon неоднократно предлагал , , стоит повторить, если он получитВы на правильном пути.
Я понимаю, почему вам нужна хорошая обработка ошибок, но вы зацикливаетесь на неправильном аспекте.Вы не можете иметь хорошую обработку ошибок, если у вас нет хорошей обработки ваших ошибок.
Подумайте, что это значит для
[...] исключить допущения [... и ...] сделать операции условными для определенных конкретных условий [...]
и как это вам поможет
[...] выясните, что не так [...]
, потому что
[...] заменяя правильное управление потоком для обработки ошибок [...]
является основной проблемой
[...] предотвращает появление ошибки и делает отладку намного сложнее, чем нужно.
Я сузил ваш код, чтобы сосредоточиться на одной переменной.Посмотрите на это и посмотрите, сможете ли вы найти какие-либо предположения, которые не были устранены до того, как ваш обработчик получил контроль, какие-либо операции, которые не выполняются при определенных условиях, и если ваш код идентифицирует или предотвращает что-либо, что является неправильным.
Function SurpAvg([...])
Dim surpx As Variant
[...]
ThisWorkbook.Activate
[...]
surpx = .Transpose(Range("surpx").Value)
[...]
On Error GoTo ErrorHandler
For j = LBound(surpx) To UBound(surpx)
[...]
NextJ:
Next j
ErrorHandler:
If Err Then Resume NextJ
[...]
End Function
Единственные допущенные мною предположения - это исключенные из них обработчики по умолчанию.Управление дается вашему обработчику без каких-либо предварительных условий, даже рабочая книга предполагается с ThisWorkbook.Activate
.Предполагается, что ActiveWorkbook
не вызывает внешний код.Если он вызывается внешним кодом, обычно выполняемым с помощью Personal.xlsb или надстройки * .xlam, то вы будете работать с неверной книгой;рассмотрим «Workbook1», «Лист1! A1» содержит UDF, размещенный в «Личном», с использованием ThisWorkbook
означает, что функция возвращает значение, полученное из данных в «Личном кабинете», а не из данных в «Рабочей тетради 1»!at: surpx = .Transpose(Range("surpx").Value)
Эта строка выполняется до того, как управление назначено вашему обработчику ошибок, поэтому ошибка здесь обрабатывается обработчиком по умолчанию;но он не может перехватить логические ошибки, и здесь может быть синтаксически правильная ошибка, которая все же вызывает дальнейшую ошибку во время выполнения кода или, возможно, приводит к неточному результату.Например:
Range("surpx")
явно не указано.Именованный диапазон surpx
можно охватить рабочую книгу и любое количество отдельных рабочих листов внутри нее.Ваш код предполагает, что активный лист является правильным листом, и он с радостью примет неожиданные значения, но по крайней мере обработчик по умолчанию предупредит вас сообщением об ошибке 1004, если диапазон не существует. Range("surpx").Value
принимается вслепуюи используется без предварительных условий.Мне нравятся div/0
ошибок, поэтому рассмотрим, что происходит с одним в этом диапазоне.surpx
- это Variant
, поэтому он без проблем принимает значение «Ошибка 2007», пока не попробуете использовать его с For j = LBound(surpx) To UBound(surpx)
.Это первая строка кода после того, как вы дали полномочия своему обработчику, поэтому обработчик по умолчанию не может вам помочь, и буквально нет попыток предотвратить, исправить или предоставить информацию, которая идентифицирует ошибку.Единственное, что делает ваш обработчик - молча пропускает блок кода.Это противоположность хорошей обработке ошибок.
Мой совет, помимо того, что уже было сказано, еще раз проверьте ваши типы данных, чтобы удалить варианты, действительно подумайте о том, как этот код вызывается, явно квалифицируйте ваши объектыи, хотя это было сказано, стоит повторить еще раз, используйте обработчик по умолчанию для отладки программы перед включением пользовательского обработчика .