Ошибки, возникающие в отладке класса, как если бы они возникали при вызове свойства - PullRequest
3 голосов
/ 21 ноября 2008

Я (к сожалению) разрабатываю приложение в Excel 2000 VBA. Я полагаю, что обнаружил, что любая ошибка, возникающая в свойстве, функции или подпунктах пользовательского класса, как если бы ошибка возникла в той точке кода VBA, где вызывается свойство. То есть отладчик VBE не приводит меня к точке в свойстве Class, где произошла ошибка, но вместо этого, где свойство было впервые введено (например, из модуля Sub или Function). Это расстраивает разработку чего-то большего, чем наиболее мелкий OO Excel 2000 VBA-код, поскольку мне нужно построчно проходить через каждый метод Class, чтобы найти инструкции, вызывающие ошибку.

Я что-то упустил или это известная ошибка, с которой мне приходится сталкиваться в Excel 2000? Это было исправлено в 2003 или 2007 году?

Пример кода:

'''''''''''''''
'In Module1:

Public Sub TestSub1()
    Dim testClass As Class1
    Dim testVariant As Variant
    Set testClass = New Class1
    testVariant = testClass.Property1 'Debugger takes me here...
End Sub

''''''''''''''
' In Class1

Property Get Property1() As Variant
    Err.Raise 666, , "Excel 2000 VBA Sux!" 'But error is actually thrown here.
End Property

Ответы [ 4 ]

4 голосов
/ 21 ноября 2008

Для Office 2003 вы получите такое поведение, когда отладчик настроен на прерывание необработанных ошибок (конфигурация по умолчанию).

Если вы хотите, чтобы он ломался в строке Err.Raise, вам необходимо настроить его так, чтобы он ломался при всех ошибках (Инструменты / Параметры / Общие / Перехват ошибок / Разрыв всех ошибок).

Я полагаю, что то же самое для Office 2000, но у меня нет копии для проверки.

1 голос
/ 21 ноября 2008

Эта страница является очень хорошим ресурсом по обработке ошибок в VBA:

0 голосов
/ 18 октября 2015

То же самое относится и к Excel 2010 - вот где я встретил это поведение.

Цитировать Сайт Чипа Пирсона :

Абсолютно нет причин использовать параметр перехвата ошибок, кроме Break In Class Module.

Его описание разницы между режимами ошибок:

Когда вы тестируете и запускаете свой код, у вас есть три режима захвата ошибок. Во-первых, сломать все ошибки. Это приведет к открытию отладчика, если произойдет какая-либо ошибка, независимо от того, какая обработка On Error у вас может быть в коде. Второй вариант - «Разбить необработанные ошибки». Это приведет к открытию отладчика, если ошибка не обрабатывается существующей директивой On Error. Это наиболее часто используемая опция и настройка по умолчанию. Третий вариант, Break In Class Module, является наиболее важным и наименее используемым. Это не режим захвата ошибок по умолчанию, поэтому вы должны установить его вручную.

Модуль класса взлома является наиболее важным, поскольку он заставит отладчик разбить строку кода в объектном модуле, который фактически вызывает проблему. Параметр «Модуль прерывания класса» находится в диалоговом окне «Параметры», доступном в меню «Инструменты». Он находится на вкладке «Общие» диалогового окна «Параметры», как показано ниже.

0 голосов
/ 21 ноября 2008

Эта «функция» такая же в Excel 2003, и я был бы удивлен, если она будет отличаться в 2007 году.

...