Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: On Error, проблема запуска отладчика ошибок  (Прочитано 11931 раз)
0 Пользователей и 1 Гость смотрят эту тему.
LuZer
Гость
« : 21-12-2004 14:08 » 

Здравствуйте всем!

в общем, с начала писал я вам письмо с просьбой о помощи (приведу его полностью, дабы уберечь остатних пользователей программных продуктов "всеми любимой"  Ага  компании, не к ночи будет упомянуто, "МокрыйСофт", от подобных "граблей").
Цитирую себя любимого:  Улыбаюсь

Цитата
"Изучаю VBA для Excel-я по книге: А. Гарнаев "MS Excel 2000, разработка приложений"...

Помогите пожалуйста разобраться со следующим:
В книге есть пример по созданию процедур с перехватом и обработкой ошибок. Но почему-то он у меня не работает.   Так больше нельзя...

Итак, есть форма с двумя текстовыми полями и Cmd Button (cmdOK). В первое поле (txtNumber) вводится число (x), во втором (txtInverse), после нажатия "cmdOK", выводится результат (y).

Вот код:

Код:
Private Sub cmdOK_Click()
Dim x As Double, y As Double
'
' Передача управления на обработчик ошибок,
' помеченный меткой ErrorHandler
On Error GoTo ErrorHandler
'
  x = CDbl(txtNumber.Text)
  y = 1 / x
  txtInverse.Text = CStr(y)
' Выход из процедуры в случае успешного нахождения результата
Exit Sub
'
' Обработчик ошибок
ErrorHandler:
MsgBox "Произошла ошибка: " & CStr(Err.Number) & "-" & _
                        Err.Description, vbInformation, _
                        "Обратное значение"
Select Case Err.Number
  Case 11, 13
    txtNumber.SetFocus
    Exit Sub
  Case 6
    txtNumber.Text = 1
    y = 1
    Resume Next
  Case Else
    MsgBox "Непредвиденная ошибка", vbInformation, _
          "Обратное значение"
    Exit Sub
End Select
End Sub

Далее для проверки предлагается ввести в "txtNumber" число: "1е-310", что, по идее, должно привести к ошибке "Переполнение" (код 6) и обработке ее в процедуре. А вот этого как раз и не происходит... Т.е. просто выскакивает окошко с сообщением: "Run-time error '6'...", со стандартными предложениями "закончить", "отладить" или, типа, "хелп", и усе.
Процедура, естественно, останавливается на строчке:

Код:
y = 1 / x

в общем, такое впечатление, что чегой-то не загружается ентот самый отладчик, но по какой причине, и чего собственно ему надо, непонятно.   Вот такой я вот 

"Поможите чем сможите", пожалуйста.

P.S. Excel в составе XP-шного Офиса.  VBA v6.3

Но пока я сие послание вам корябал - не переставал неустанно ковырять этот... (пи-и-и-и-и-и) ...ый (в смысле - чудесный) Бэйсик, который "Вижел" и, к тому же, "фор Аппликэйшн". И вот чего оказалось:
В опциях редактора VBA (Tools->Options) на вкладке "General" есть одна любопытная группа "радиобатонов", "Error Trapping" прозывается: "Break on All Errors", "Break in Class Module" и "Break on Unhandled Errors".
Так вот, у меня было выбрано: "Break on All Errors". Переключил на: "Break on Unhandled Errors", и все поехало.
То исть проблему я эту порешил, но вытек из нее интересный вопросец:  :?

:?: А можно эту кнопку переключить программно из того же VBA?
(На тот случай, если приложение с такой процедурой обработки ошибок придется запускать кому-то другому и на другой "машине". Боже упаси, вас подумать, что я это спрашиваю с каким-нибудь криминальным умыслом.)

Вот на этот вопрос я бы собстно и хотел получить ответ. (Надеюсь у вас хватило терпения дочитать сей опус до конца.)  :oops:
« Последнее редактирование: 03-12-2007 17:27 от Алексей1153++ » Записан
Naghual
Модератор

ua
Offline Offline
Пол: Мужской
ОПТИМИСТ


WWW
« Ответ #1 : 21-12-2004 15:21 » 

Буду краток.
Нет. Не можна.
Записан
LuZer
Гость
« Ответ #2 : 22-12-2004 07:44 » 

Цитата
Буду краток.
Нет. Не можна.

Жаль.  Круто!
Записан
LuZer
Гость
« Ответ #3 : 04-01-2005 12:02 » 

Забавно, но поковырявшись ишшо немнога  Ага (в книгах), я обнаружил что сие все-таки возможно.
Достаточно, просто вставить код создания файла с расширением ".reg", втихаря его запустить, а потом, так же втихаря - "убить". Пользователь даже ничего не заметит, так как, чтобы изменение настроек вступило в силу - перезагружать компьютер не потребуется.
Вот кусок кода, по созданию такого файла (для данного случая и для Win98..):
Код:
' Создание файла и открытие его, как объекта текстового потока
Set objTextStream = _
      objFileSystem.CreateTextFile("С:\VBA_Opt.reg")

' Запись текста в этот поток
objTextStream.WriteLine "REGEDIT4"
objTextStream.WriteBlankLines (1)
objTextStream.WriteLine _
  "[HKEY_CURRENT_USER\SOFTWARE\Microsoft\VBA\6.0\Common]"
objTextStream.WriteLine Chr(34) & "BreakOnServerErrors" & _
    Chr(34) & "=" & "dword:00000000"
objTextStream.WriteLine Chr(34) & "BreakOnAllErrors" & _
    Chr(34) & "=" & "dword:00000000"

' Закрытие текстового потока
objTextStream.Close

Вобчем, как грится:
"О, сколько нам мгновений чудных
Готовит просвещенья дух..."  Ага
« Последнее редактирование: 03-12-2007 17:28 от Алексей1153++ » Записан
Naghual
Модератор

ua
Offline Offline
Пол: Мужской
ОПТИМИСТ


WWW
« Ответ #4 : 05-01-2005 07:38 » 

Ну что же. Неординарное, интересное решение.
Правда оно имеет в себе ряд минусов:
1. Сработает только для определенной версии MSOffice, а не для той которая у пользователя.
2. Не предусмотрено сохранение оригинальных настроек пользователя, для их последующего восстановления.
3. По идее, может быть причиной возникновения ошибки в паралельно работающем (не твоем) коде VBA.
4. Использует объект текстового потока, что привязывает код к дополнительной компоненте.

Считаю что можно его доработать.
Что скажеш LuZer?
Записан
LuZer
Гость
« Ответ #5 : 05-01-2005 11:58 » 

Цитата
Считаю что можно его доработать.
Что скажеш LuZer?
Безусловно - "нет предела совершенству"...  Ага.

В VBA есть ряд функций для работы с реестром: SaveSettings, GetSetting, GetAllSettings, и оператор DeleteSetting (и, вроде, для их использования не нужно подключать объектную "библиОтику": "Microsoft Scripting Runtime"). Но, честно говоря, я пока не совсем "въехал" в их синтаксис.
Так шта пока будем посмотреть и мала-мала ковырять  Ага

P.S. Стыдно перед великим А.С., видать новогодние винные пары не совсем рассеялись и затуманили "буйну голову", пардон граждане, соврамши... Разумеется его незабвенные строфы на самом деле таковы:
" О, сколько нам открытий чудных
Готовят просвещенья дух
И опыт, сын ошибок трудных,
И гений, парадоксов друг,
И случай, бог изобретатель"

Всех, с наступающим Рождеством.
Записан
Naghual
Модератор

ua
Offline Offline
Пол: Мужской
ОПТИМИСТ


WWW
« Ответ #6 : 05-01-2005 13:16 » 

Ну вот тебе для начала модуль для работы с реестром. Пример в нем же.

[attachment удален администратором]
Записан
LuZer
Гость
« Ответ #7 : 06-01-2005 05:00 » new

Спасибо за примерчик. Будет время - разберусь доскональнее.
Но, по совести говоря, я тут выступил, так сказать, в роли акына ("среднеазиатского барда"), в смысле: "что увижу, то и пою"...   Вот такой я вот
Когда начал разбираться с текстовыми потоками, нашел в книге пример по созданию обычного текстового файла и записи в него пары строк текста, типа:
"Взвейтесь кострами синие ночи,
Мы пионеры - дети рабочих"  Ага
Тут вспомнилась проблемка с "On Error", ну и подумалось мне,  а почему бы таким же образом не накатать reg-файл... Получилось... А дальше, "волшебные" "Shell" и "Kill", и вуаля: имеем изменение настроек без следов постороннего вмешательства.
Про те грабли, что ты упомянул, я в общем-то подумал, но пока эта проблема передо мной так остро не стоит... Встанет - порешаем и ее...

Еще раз спасибо. Успехов.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines