Ошибка времени выполнения basic openoffice

При запуске самой программы или открытия любого докум

Автор ForumOOo (бот), 21 февраля 2012, 14:01

0 Пользователи и 1 гость просматривают эту тему.

Компонент: Общие вопросы
Версия продукта: 3.3
Сборка: openoffice.org 3.3.0 OOO330m20 (build 9567)
ОС: Windows xp sp3

При запуске самой программы или открытия любого документа с помощью OO выходит окно
«Мои макросы и диалоги.promt Open Office Basic» в этом окне две ошибки
— «Ошибка времени выполнения Basic. Свойство или метод не найдены: CurrentController»
— «Ошибка времени выполнения Basic. Переменная типа Object не установлена»
Закрываю эти сообщения и можно дальше работать.

Тестовый файл: http://forumooo.ru/attachments/upload/err.jpg (200.5 КБ)


Подпись: Марина


Не может быть.

[вложение удалено Администратором]


Hasim, если у вас нет такой проблемы, это не значит, что ее нет у меня.
Я open office уже переустанавливала раз 10, сносила джаву, ставила заново, а проблема осталась.
Как ее победить?


Для начала показать весь файл целиком, а не кусок картинки.


Нет, для начала надо создать новый файл и вставить этот простенький макрос Hasima.
Если и на нем  будут ошибки, тогда надо удалить профиль, и попробовать снова.
Если на простеньком ошибок не будет, а на оригинальном будут, тогда файл в студию.


Да, в принципе, и этого фрагмента картинки хватает…
Добро пожаловать на форум, Марина!

Скажите, а Promt вы после установки офиса не переустанавливали?
Скорее всего, в настройках офиса (меню Сервис-Настройка-События) на событие «Запуск приложения» записан запуск макроса, формирующего меню переводчика. Проверьте, пожалуйста.

PS. Я думаю, ошибка выскакивает, если просто запускается офис. В случае, если сразу открывается какой-то документ, её быть не должно. Фокус в том, что у любого документа свойство CurrentController есть, а у главного окна — нет. Если мои подозрения верны, то для устранения ошибки достаточно будет

удалить Promt (шутка)

немного доработать макрос regicterContextMenuInterceptor.


Hasim и neft, К своему стыду, я не знаю, как создать пустой файл, чтобы в него ваш макрос вставить.

JohnSUN, Промт я недели две как снесла. А кто вначале раньше был установлен ПРОМТ или ОО я не помню, очередная попытка снести ОО и заново установить была сегодня.
Нашла в «Запуск приложения» в столце «Назначенное действие» 4 каких-то макроса типа promt.***
Они были благополучно удалены. Моя проблема ушла. Я что, все правильно сделала?!


Эта зараза ПРОМТ оказывается прописался в системе. Как его у далить из ОО, чтобы и в дальнейшем, он мне жизнь не портил?

[вложение удалено Администратором]


Да, всё сделала правильно.
Почистить меню можно попробовать через ту же Сервис-Настройка-Меню кнопка Изменить-Удалить.
Или плюнуть на всё и просто удалить профиль пользователя. Раз уж переустанавливала столько раз, значит жалеть не о чем — в топку!


Во оно как! Не знала, не знала. Спасибо за участие, что хотела — сделала :-)


Всегда рады помочь!
Будут вопросы — не стесняйся, здесь все свои  :beer:


Если удаление профиля не поможет, ОБЯЗАТЕЛЬНО проделайте такое:
1. Удаляете (не переустанавливаете — восстанавливаете) Офис через «Панель управления — Установка и удаление прграмм».
2. Вручную из «Program_Files» удаляете папку «OpenOffice 3»
В \Program Files\OpenOffice 3\.. (даже при удалении всего пакета) остаются расширения, установленные «для всех пользователей. Эти расширения будут подключены к вновь установленному Офису при его 1-м запуске, что будет зафиксировано в Офисном профиле пользователя.
3. Удаляете Офисный профиль пользователя (ссылка «КАК» — у JohnSUN)
4. Устанавливаете Офисный пакет.


  • Форум поддержки пользователей LibreOffice, Apache OpenOffice

  • Главная категория

  • Общее

  • При запуске самой программы или открытия любого докум

  • Печать

Страницы: [1]   Вниз

Тема: Правила BASIC не работают в макросах LibreOffice, или почему не едут лыжи?  (Прочитано 9751 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн
MAMOHT

Дорогому All-у доброго времени суток и года!
«Всё было хорошо пока не занялся программированием…»
                                        «МАМОНТ. Copyright 11:21 29.06.2012 г.»
Как древний виндузятник порочащий весь и вся Человечную ОС по воле судьбы был приговорён к освоению софта под Линукс. И вот, при попытке написания макросов под LibreOffice, столкнулся с такими вот траблами:

При создании книжного макроса:

Sub MyCursor
  Dim Doc As Object
  Dim Cursor As Object
  Dim sPath As String

  Doc = StarDesktop.CurrentComponent
  Cursor = Doc.Text.createTextCursor()

Вот здесь выскакивает окно сообщения с надписью: «Свойство или метод не найдены: Text»

…..........
…........
  sPath = CurDir$
  MsgBox sPath
А здесь в сообщении чётко указана моя домашняя директория, но НЕ ТА директория в которой СЕЙЧАС открыт документ.

…......
End Sub

Проблема:
Из чьей кожи надо сделать бубен и какие изучить PAS, чтобы при составлении макроса на BASIC в LibreOffice 3.5.4.2 ID сборки: 350m1(Build:2) системы Ubuntu 10.04.4 всё-таки РАБОТАЛО правило Cursor = Doc.Text.createTextCursor() и как мне получить ТУ ТЕКУЩУЮ директорию в которой сейчас открыт АКТИВНЫЙ документ?

Ожидаю конкретных, корректных без словоблудства предложений по решению этих, как-бы на чей то взгляд, проблем.
Спасибо за понимание.

« Последнее редактирование: 29 Июня 2012, 15:56:47 от Чистый »


Оффлайн
Señor_Gaga

>>Ожидаю конкретных, корректных без словоблудства предложений по решению этих, как-бы на чей то взгляд, проблем.

Если мне изменяет память — бейсик идет только для msWord.
Для ОО и LO есть свой скриптовый язык.


Оффлайн
MAMOHT

>>Ожидаю конкретных, корректных без словоблудства предложений по решению этих, как-бы на чей то взгляд, проблем.

Если мне изменяет память — бейсик идет только для msWord.
Для ОО и LO есть свой скриптовый язык.

Вторую часть КАК-БЫ проблемы КАК-БЫ решил. Правда использованием не кратчайшего пути: это КАК-БЫ проехать в Париж через Владивосток. Нашёл описание на 114 странице книги Эндрю Питоньяк (Andrew Pitonyak)OpenOffice.org pro. Автоматизация работы.

Теперь к Señor_Gaga. Здесь точно КТО-ТО ошибается!!!

Переписываю дословно окно сообщения:
«Ошибка времени выполнения BASIC.
Свойство или метод не найдены: TEXT»


Оффлайн
brij

Не могу сейчас точно ответить на Ваш вопрос, но просто вспомнил, что у Питоньяка есть много чего по макросам ЛО. Наверняка, Вам уже это известно, но все же на всякий пожарный  ;) Если дружите с английским, то здесь http://www.pitonyak.org/oo.php/ можно найти очень много полезного, особенно мне когда-то сильно помог его «Macro document» http://www.pitonyak.org/oo.php/AndrewMacro.pdf. Там кстати, есть и его еще незаконченный список параллелей с VBA. Может пригодится.


Оффлайн
Dixi257


  • Печать

Страницы: [1]   Вверх

RU UA

Часто задаваемые вопросы по совместимости включают в себя также вопросы по сохранению в форматы MS Office и импорту данных форматов.

Принять участие в проекте!
Общие вопросы
Форматирование ответов
Вопросы использования
Популярные разделы:
Writer: Часто задаваемые вопросы
Calc: Часто задаваемые вопросы
Орфография и грамматика
Полезности и секреты
Главная страница

Contents

  • 1 Форматы файлов
    • 1.1 Как открыть файл shs?
    • 1.2 Работая в OpenOffice.org, сохранять тоже надо в его формате?
    • 1.3 При сохранении файлов формата xls, полученным из программ 1С, в OpenOffice.org, файл получается испорченным
    • 1.4 При открытии файлов RTF во Writer не сохраняется форматирование, а в MS Word тот же файл открывается корректно
    • 1.5 Как массово переформатировать файлы doc в odt?
    • 1.6 Как из командной строки конвертировать файлы из одного формата в другой?
  • 2 Обмен файлами с MS Office
    • 2.1 Можно ли сделать так, чтобы все файлы автоматически сохранялись в соответствующем формате MSO?
    • 2.2 Есть документ MS Word, в котором есть несколько связей с другими документам. При открытии этого документа в ОО, они не отображаются.
    • 2.3 В файле xls названия листов содержат точку в конце. При открытии в Calc точка заменяется на подчеркивание, при этом соответственно заменяются ссылки в самом файле. И все без единого предупреждения. Зачем это надо?
    • 2.4 Может ли ООо открывать файлы MS Office 2007?
    • 2.5 Как открыть файл .xlsx (Excel 2007), если в распоряжении имеются только ООo 2.3 (или старше) и MS Office XP?
    • 2.6 Можно ли в Microsoft Office открывать файлы ODF?
    • 2.7 Откроет ли получатель файлы ООо, присланные по почте, если у него Openoffice.org не установлен, а есть Microsoft Office?
    • 2.8 При защите листов Calc паролем при конвертации в формат MSO защитный пароль не сохраняется. И точно также при открытии xls Calc’ом
  • 3 Совместимость со сторонним ПО, требующим использования MSO
    • 3.1 В сторонней программе выводятся отчёты в MSO (Word, Excel). На компьютере установлен только ОО. При обращении к этой функции, программа выводит ошибку, что не установлен пакет MSO. Как обойти эту проблему, что делать?
    • 3.2 В ООо Calc не работает «Отчет200х» — программа для сдачи налоговой отчётности
    • 3.3 Многое из современного ПО требует наличия MSO на компьютере пользователя в той или иной степени. Будет ли решена эта проблема для пользователей ООо?
  • 4 Функции MSO , аналогов которым нет в ООо
    • 4.1 Функции текстового редактора MSO , аналогов которым нет во Writer
    • 4.2 Функции электронной таблицы MSO , аналогов которым нет в Calc
    • 4.3 Общие функции MSO, аналогов которым нет в ООо
  • 5 Макросы
    • 5.1 При попытке выполнения макроса из xls-файла получаю сообщение «Ошибка времени выполнения Basic»
    • 5.2 Есть ли поддержка VBA в OpenOffice.org?

OOo section.pngФорматы файлов

Как открыть файл shs?

Есть 2 способа:

  • Использовать конвертор файлов scrap2rtf .shs -> .rtf scrap2rtf (для текстовых документов).
  • Распаковать shs файл архиватором 7zip, и дописать расширение нового файла вручную (для электронных таблиц).

3

Работая в OpenOffice.org, сохранять тоже надо в его формате?

OpenOffice.org поддерживает формат документов Microsoft Office. И его можно даже настроить так, что по умолчанию документы будут сохраняться в формате Microsoft Office!

Однако необходимо знать, что форматы Microsoft Office являются закрытыми, и вышеописанная поддержка стала возможной благодаря использованию методов «обратной разработки». Поэтому не исключается некоторая несовместимость документов, созданных с помощью OpenOffice.org в формате Microsoft Office, с документами, созданными непосредственно в Microsoft Office.

2.3

При сохранении файлов формата xls, полученным из программ 1С, в OpenOffice.org, файл получается испорченным

Программы 1С сохраняют данные в устаревшем формате xls-95. OpenOffice.org версии 3.2 успешно открывает такие файлы, но не может сохранить в них кириллические символы. Решить проблему поможет расширение xls_1C, которое блокирует сохранение в формат xls-95, заменяя его форматом xls-97-2003.

3.2.

При открытии файлов RTF во Writer не сохраняется форматирование, а в MS Word тот же файл открывается корректно

Проблема в том, что импорт RTF реализован не полностью, особенно если не соблюдаются стандарты записи.
В этом случае Вы можете использовать WordViewer и копирование и вставку через буфер обмена.
Использование формата DOC предпочтительнее, чем RTF и DOCX.

2.3

Как массово переформатировать файлы doc в odt?

Файл — Мастер — Конвертер документов   позволяет конвертировать файлы doc, xls и ppt

2.3

Как из командной строки конвертировать файлы из одного формата в другой?

Стандартными средствами OpenOffice сделать это можно только в графическом интерфейсе.

Есть несколько вариантов решения проблемы:

  • Программа, использующая uno интерфейс OpenOffice Unoconv
  • Программа-конвертор (независимая от OpenOffice), например o3read
  • Написать свой макрос.

3.2

OOo section.pngОбмен файлами с MS Office

Можно ли сделать так, чтобы все файлы автоматически сохранялись в соответствующем формате MSO?

Да, вы можете указать, в каком формате автоматически сохранять файлы. Для этого зайдите в
Сервис — Параметры — Загрузка/сохранение  — Общие  — Формат файла по умолчанию и установите требуемые вам параметры.

2.3

Есть документ MS Word, в котором есть несколько связей с другими документам. При открытии этого документа в ОО, они не отображаются.

К сожалению, связи между документами в ООо организованы иначе.

2.3

В файле xls названия листов содержат точку в конце. При открытии в Calc точка заменяется на подчеркивание, при этом соответственно заменяются ссылки в самом файле. И все без единого предупреждения. Зачем это надо?

Таким образом OOo Calc предотвращает появление в названиях листов недопустимых символов. Подобная замена — одна из проблем совместимости офисных пакетов и свидетельствует о различии в подходах к использованию спецсимволов в названиях листов электронных книг.

2.3

Может ли ООо открывать файлы MS Office 2007?

Да, начиная с версии OpenOffice.org 3.0.

В более ранних версиях необходимо наличие дополнительных конвертеров:

  • Конвертер от Novell поддерживает файлы docx и xlsx: загрузить
  • Сборка ООо 2.3.0 от Novell, входящая в состав OpenSUSE 10.3, в настоящее время также поддерживает эти форматы.
  • Конвертер от Microsoft (docx -> doc): (только для Win2K и старше, не требует наличия MS Office, может работать с WordViewer и ExcelViewer, 27Mb).
  • Конвертер odf-converter командной строки
  • Конвертер odf-converter с графическим интерфейсом

3.1

Как открыть файл .xlsx (Excel 2007), если в распоряжении имеются только ООo 2.3 (или старше) и MS Office XP?

Возможны несколько вариантов:

  • Конвертер xlsx -> ods
  • Конвертер от Novell, который теперь может открывать xlsx, см. #Может ли ООо открывать файлы MS Office 2007?
  • Конвертер от Microsoft xlsx -> xls, см. #Может ли ООо открывать файлы MS Office 2007?

2.3.1

Можно ли в Microsoft Office открывать файлы ODF?

Необходимо установить ODF Plugin от SUN для MSO 2007 и младше.
MSO 2010 умеет открывать ODF.
WordPad из Windows 7 умеет открывать ODF.

2.3

Откроет ли получатель файлы ООо, присланные по почте, если у него Openoffice.org не установлен, а есть Microsoft Office?

Да, если выполнить любое из перечисленных действий:

  • Сохранить документ в одном из форматов, поддерживаемых в MS Office: doc, rtf, txt, xls. Кроме стандартной команды Сохранить как, для этой цели можно:
    • использовать специальную команду ООо для автоматической конвертации и отправки документов по электронной почте в формате MSO, см. Можно ли отправить по электронной почте файл в формате MSO средствами ООо?;
    • установить расширение ООо multidiff
  • Предложить получателю установить ООо;
  • Сохранить документ в формате PDF, если не требуется редактирование;
  • См. #Можно ли в Microsoft Office открывать файлы ODF?.

2.3

При защите листов Calc паролем при конвертации в формат MSO защитный пароль не сохраняется. И точно также при открытии xls Calc’ом

См. тут

OOo section.pngСовместимость со сторонним ПО, требующим использования MSO

В сторонней программе выводятся отчёты в MSO (Word, Excel). На компьютере установлен только ОО. При обращении к этой функции, программа выводит ошибку, что не установлен пакет MSO. Как обойти эту проблему, что делать?

Как правило, никак. Если стороннее ПО обращается к MSO как к OLE-объектам, то ООо не сможет заменить MSO.

Обращайтесь к разработчикам стороннего ПО.

Существует проект AutomateIT! по реализации интерфейса OLE для ОО как у MSO. Проект ещё находится в состоянии «альфа», то есть находится в состоянии разработки и интерфейс OLE поддерживается не полностью.
Текущая версия — 0.7 — alfa имеет инсталлятор, работает с версиями OpenOfice.Org 2.x, 3.0 beta.
Авторами заявлена совместимость с «Налогоплательщик ЮЛ» и Windows Vista.

Проект Uni Office@Etersoft – транслятор COM-объектов MS Office. На данный момент (версия 0.2) поддерживаются только COM-объекты Excel.

Сравнительная таблица AutomateIT! 0.6 и Uni Office 0.1

2.3

В ООо Calc не работает «Отчет200х» — программа для сдачи налоговой отчётности

К сожалению, решить эту проблему в настоящее время не представляется возможным.

2.3

Многое из современного ПО требует наличия MSO на компьютере пользователя в той или иной степени. Будет ли решена эта проблема для пользователей ООо?

Однозначный ответ на этот вопрос невозможен. Переадресуйте его разработчикам используемой Вами программы, которая требует наличия MSO.

Существует тенденция по адаптации программного обеспечения разрабатываемого при участии государственных органов для работы с ООо, в частности, реализована возможность формирования документов для печати в формате текстового редактора OpenOffice.org в «Программе подготовки документов, используемых при регистрации юридических лиц (ЮЛ) Версия 1.0.8».
При увеличении числа пользователей ООо проблема совместимости будет находить свое решение для большего числа продуктов.

2.3

OOo section.png Функции MSO , аналогов которым нет в ООо

Функции текстового редактора MSO , аналогов которым нет во Writer

  • Буквица — не сохраняется в *.doc
  • Подогнать текст при печати к количеству страниц

2.3

Функции электронной таблицы MSO , аналогов которым нет в Calc

  • Вычислить формулу (показать этапы вычисления)
  • Функция листа электронной таблицы =СУММЕСЛИМН()

2.4

Общие функции MSO, аналогов которым нет в ООо

  • Проверка грамматики. Для ООо реализовано в виде расширений. Подробнее — Орфография, грамматика и тезаурус: Часто задаваемые вопросы#Существует ли проверка грамматики в OpenOffice.org?

2.3

OOo section.pngМакросы

При попытке выполнения макроса из xls-файла получаю сообщение «Ошибка времени выполнения Basic»

OpenOffice.org поддерживает макросы VBA. Различные версии и сборки ООо делают это с разной эффективностью. Возможно, стоит попробовать использовать другую версию или сборку OpenOffice.org, например OpenOffice.org pro. Подробнее о сборках ООо Полезности: об OpenOffice.org
См. также #Есть ли поддержка VBA в OpenOffice.org?

2.4.1

Есть ли поддержка VBA в OpenOffice.org?

От версии к версии поддержка VBA улучшается, но 100% поддержки не будет никогда.
Дополнительно см. http://wiki.services.openoffice.org/wiki/VBA

2.4


Вступление

Код, который компилирует, может по-прежнему сталкиваться с ошибками во время выполнения. В этом разделе перечислены наиболее распространенные из них, их причины и способы их устранения.

Ошибка времени выполнения «3»: возврат без GoSub

Неверный код

Sub DoSomething()
    GoSub DoThis
DoThis:
    Debug.Print "Hi!"
    Return
End Sub

Почему это не работает?

Выполнение входит в процедуру DoSomething , переходит на метку DoThis , печатает «Привет!». на выход отладки, возвращается к инструкции сразу после вызова GoSub , печатает «Привет!». снова, а затем встречает оператор Return , но до сих пор некуда возвращаться , потому что мы не попали сюда с инструкцией GoSub .

Правильный код

Sub DoSomething()
    GoSub DoThis
    Exit Sub
DoThis:
    Debug.Print "Hi!"
    Return
End Sub

Почему это работает?

Представляя инструкцию Exit Sub перед DoThis линии DoThis , мы DoThis подпрограмму DoThis от остальной части тела процедуры — единственный способ выполнить подпрограмму DoThis — через прыжок GoSub .

Другие примечания

GoSub / Return устарел, и его следует избегать в пользу фактических вызовов процедур. Процедура не должна содержать подпрограмм, кроме обработчиков ошибок.

Это очень похоже на ошибку времени выполнения «20»: возобновить без ошибок ; в обеих ситуациях решение состоит в том, чтобы гарантировать, что нормальный путь выполнения не может войти в подпрограмму (обозначенную меткой строки) без явного перехода (предполагая, что On Error GoTo считается явным скачком ).

Ошибка времени выполнения «6»: переполнение

неверный код

Sub DoSomething()
    Dim row As Integer
    For row = 1 To 100000
        'do stuff
    Next
End Sub

Почему это не работает?

Тип данных Integer — это 16-разрядное целое число со знаком с максимальным значением 32 767; присваивая его чему-либо большему, чем это приведет к переполнению типа и повышению этой ошибки.

Правильный код

Sub DoSomething()
    Dim row As Long
    For row = 1 To 100000
        'do stuff
    Next
End Sub

Почему это работает?

Вместо этого вместо этого используется Long (32-разрядное) целое число, теперь мы можем создать цикл, который выполняет итерацию более 32 767 раз, не переполняя тип переменной счетчика.

Другие примечания

Дополнительные сведения см. В разделе Типы данных и лимиты .

Ошибка времени выполнения «9»: подстрочный индекс

неверный код

Sub DoSomething()
    Dim foo(1 To 10)
    Dim i As Long
    For i = 1 To 100
        foo(i) = i
    Next
End Sub

Почему это не работает?

foo — массив, содержащий 10 элементов. Когда счетчик циклов i достигает значения 11, foo(i) выходит за пределы диапазона . Эта ошибка возникает всякий раз, когда доступ к массиву или коллекции осуществляется с индексом, который не существует в этом массиве или коллекции.

Правильный код

Sub DoSomething()
    Dim foo(1 To 10)
    Dim i As Long
    For i = LBound(foo) To UBound(foo)
        foo(i) = i
    Next
End Sub

Почему это работает?

Используйте функции LBound и UBound для определения нижней и верхней границ массива, соответственно.

Другие примечания

Когда индекс является строкой, например ThisWorkbook.Worksheets("I don't exist") , эта ошибка означает, что предоставленное имя не существует в запрошенной коллекции.

Фактическая ошибка является специфичной для реализации; Collection будет повышена ошибка во время выполнения 5 «Неверный вызов или аргумент процедуры»:

Sub RaisesRunTimeError5()
    Dim foo As New Collection
    foo.Add "foo", "foo"
    Debug.Print foo("bar")
End Sub

Ошибка времени выполнения «13»: несоответствие типов

неверный код

Public Sub DoSomething()
    DoSomethingElse "42?"
End Sub

Private Sub DoSomethingElse(foo As Date)
'    Debug.Print MonthName(Month(foo))
End Sub

Почему это не работает?

VBA пытается очень тяжело преобразовать "42?" аргумент в значение Date . Когда он терпит неудачу, вызов DoSomethingElse не может быть выполнен, потому что VBA не знает, какую дату передать, поэтому он вызывает несоответствие типа ошибки 13 во время выполнения, поскольку тип аргумента не соответствует ожидаемому типу (и может ‘также неявно преобразуется).

Правильный код

Public Sub DoSomething()
    DoSomethingElse Now
End Sub

Private Sub DoSomethingElse(foo As Date)
'    Debug.Print MonthName(Month(foo))
End Sub

Почему это работает?

Date аргумент Date процедуре, которая ожидает параметр Date , вызов может быть успешным.

Ошибка времени выполнения ’91’: переменная объекта или с не заданной переменной блока

неверный код

Sub DoSomething()
    Dim foo As Collection
    With foo
        .Add "ABC"
        .Add "XYZ"
    End With
End Sub

Почему это не работает?

Переменные объекта содержат ссылку , а ссылки должны быть заданы с помощью ключевого слова « Set . Эта ошибка возникает , когда вызов элемента выполнен на объекте, ссылка не является Nothing . В этом случае foo является ссылкой Collection , но он не инициализирован, поэтому ссылка содержит Nothing — и мы не можем вызвать .Add on Nothing .

Правильный код

Sub DoSomething()
    Dim foo As Collection
    Set foo = New Collection
    With foo
        .Add "ABC"
        .Add "XYZ"
    End With
End Sub

Почему это работает?

.Add объектной переменной допустимую ссылку с помощью ключевого слова Set , вызовы .Add успешными.

Другие примечания

Часто функция или свойство может возвращать ссылку на объект — распространенным примером является метод Excel Range.Find , который возвращает объект Range :

Dim resultRow As Long
resultRow = SomeSheet.Cells.Find("Something").Row

Однако функция может очень хорошо вернуть Nothing (если поисковый .Row не найден), поэтому вполне вероятно, что .Row вызова .Row не выполняется.

Перед вызовом членов объекта убедитесь, что ссылка задана с условием If Not xxxx Is Nothing :

Dim result As Range
Set result = SomeSheet.Cells.Find("Something")

Dim resultRow As Long
If Not result Is Nothing Then resultRow = result.Row

Ошибка времени выполнения «20»: возобновить без ошибок

неверный код

Sub DoSomething()
    On Error GoTo CleanFail
    DoSomethingElse

CleanFail:
    Debug.Print Err.Number
    Resume Next
End Sub

Почему это не работает?

Если процедура DoSomethingElse вызывает ошибку, выполнение переходит к CleanFail линии CleanFail , печатает номер ошибки, а команда Resume Next возвращается к инструкции, которая сразу же следует за строкой, в которой произошла ошибка, которая в этом случае является Debug.Print инструкция: подпрограмма обработки ошибок выполняется без контекста ошибки, и когда достигается команда Resume Next , возникает ошибка 20 времени выполнения, потому что возобновить ее некуда.

Правильный код

Sub DoSomething()
    On Error GoTo CleanFail
    DoSomethingElse

    Exit Sub    
CleanFail:
    Debug.Print Err.Number
    Resume Next
End Sub

Почему это работает?

Представляя инструкцию Exit Sub перед CleanFail линии CleanFail , мы CleanFail подпрограмму обработки ошибок CleanFail от остальной части тела процедуры — единственный способ выполнить подпрограмму обработки ошибок — с помощью скачка On Error ; поэтому путь выполнения не доходит до инструкции Resume за пределами контекста ошибки, что позволяет избежать ошибки времени выполнения 20.

Другие примечания

Это очень похоже на ошибку времени выполнения «3»: возврат без GoSub ; в обеих ситуациях решение состоит в том, чтобы гарантировать, что нормальный путь выполнения не может войти в подпрограмму (обозначенную меткой строки) без явного перехода (предполагая, что On Error GoTo считается явным скачком ).

Содержание

  1. Error messages in Visual Basic
  2. Run-time errors
  3. Compile-time errors
  4. Office 2013 Visual Basic for Applications (VBA) errors
  5. Symptoms
  6. Microsoft Access
  7. Microsoft Word
  8. Microsoft Excel
  9. Cause
  10. Resolution
  11. Сообщения об ошибках в Visual Basic
  12. Ошибки во время выполнения
  13. Ошибки времени компиляции
  14. Office 2013 Visual Basic для приложений (VBA) ошибки
  15. Симптомы
  16. Microsoft Access
  17. Microsoft Word
  18. Microsoft Excel
  19. Причина
  20. Решение
  21. Обработка ошибок
  22. Типы ошибок
  23. Инструкция On Error
  24. Инструкция Resume
  25. Получение информации об ошибке и генерация ошибки
  26. Способы поиска ошибок в программе
  27. Отладка программы в VBA
  28. Подача звукового сигнала

Error messages in Visual Basic

When you compile or run a Visual Basic application, the following types of errors can occur:

Compile-time errors, which occur when you compile an application.

Run-time errors, which occur when an application is running.

For information about how to troubleshoot a specific error, see Additional Resources for Visual Basic Programmers.

Run-time errors

If a Visual Basic application tries to perform an action that the system can’t execute, a run-time error occurs, and Visual Basic throws an Exception object. Visual Basic can generate custom errors of any data type, including Exception objects, by using the Throw statement. An application can identify the error by displaying the error number and message of a caught exception. If an error isn’t caught, the application ends.

The code can trap and examine run-time errors. If you enclose the code that produces the error in a Try block, you can catch any thrown error within a matching Catch block. For information about how to trap errors at run time and respond to them in your code, see Try. Catch. Finally Statement.

Compile-time errors

If the Visual Basic compiler encounters a problem in the code, a compile-time error occurs. In the Visual Studio code editor, you can easily identify which line of code caused the error because a wavy line appears under that line of code. The error message appears if you either point to the wavy underline or open the Error List, which also shows other messages.

If an identifier has a wavy underline and a short underline appears under the rightmost character, you can generate a stub for the class, constructor, method, property, field, or enum. For more information, see Generate From Usage (Visual Studio).

By resolving warnings from the Visual Basic compiler, you might be able to write code that runs faster and has fewer bugs. These warnings identify code that may cause errors when the application is run. For example, the compiler warns you if you try to invoke a member of an unassigned object variable, return from a function without setting the return value, or execute a Try block with errors in the logic to catch exceptions. For more information about warnings, including how to turn them on and off, see Configuring Warnings in Visual Basic.

Источник

Office 2013 Visual Basic for Applications (VBA) errors

Symptoms

When you open a file or try to use macros in Microsoft Office 2013 Click 2 Run (C2R), you may experience one of the following symptoms.

Microsoft Access

Windows Installer window continuously flashes.

When you use Access wizards you get the following error:

«This feature isn’t installed, or has been disabled»

When you open the Visual Basic Editor (VBE) you get the following error:

«Microsoft Access is unable to load the Visual Basic for Applications dynamic-link library (dll) Vbe7»

Microsoft Word

After you click Macros, you get the following error:

«The function you are attempting to run contains macros or content that requires macro language support»

Microsoft Excel

When you open existing workbooks, you get the following error:

«The Visual Basic for Applications (VBA) macros in this workbook are corrupted and have been deleted.» opening existing workbooks

The Visual Basic, Macros, and Record Macro options are disabled under the Developer and View ribbon.

The Visual Basic and Macros options are disabled on the ribbon.

When you open presentations with VBA code you get the following error:

«The document contains macros. Macro language support for this application is disabled. Features requiring VBA are not available. Would you like to open this document read-only?»

Cause

Non-Microsoft registry cleaners and system maintenance applications deleted multiple registry key values that are used for VBA functionality in Microsoft Office 2013 applications.

Resolution

Run an Online Repair of Office. Here’s how:

Click Start> Control Panel> Programs and Features.

Click your Microsoft Office program, and then click Change.

Select Online Repair, and then click Repair.

After Online Repair is complete, you should be able to use your Office 2013 applications.

From the Start screen, type Control Panel in the Search box, and then tap or click Apps.

Tap or click Control Panel > Programs > Programs and Features.

Select your Microsoft Office program, and then click Change.

Select Online Repair, and then click Repair.

After Online Repair is complete, you should be able to use your Office 2013 applications.

To prevent recurrences, contact the provider of the registry cleaner or system-maintenance application.

Источник

Сообщения об ошибках в Visual Basic

При компиляции или запуске приложения Visual Basic могут возникать следующие типы ошибок:

Ошибки во время компиляции, возникающие при компиляции приложения.

Ошибки во время выполнения, возникающие при запуске приложения.

Сведения о способах устранения некоторых ошибок можно найти в статье Additional Resources for Visual Basic Programmers (Дополнительные ресурсы для программирования на Visual Basic).

Ошибки во время выполнения

Если приложение Visual Basic пытается выполнить действие, которое система не может выполнить, возникает Exception ошибка во время выполнения и Visual Basic создает объект. Visual Basic может создавать пользовательские ошибки любого типа данных, включая Exception объекты, с помощью инструкции Throw . Приложение может идентифицировать ошибки, отображая номер ошибки и сообщение перехваченного исключения. Если ошибка не будет перехвачена, приложение завершается.

Код может перехватывать и проверять ошибки времени выполнения. Если вы заключите код, создающий ошибку, в блок Try , вы сможете перехватить любую созданную ошибку в соответствующем блоке Catch . Сведения о том, как в коде отлавливать ошибки во время выполнения и реагировать на них, можно найти в статье Try. Catch. Finally Statement (Оператор Try. Catch. Finally).

Ошибки времени компиляции

Если компилятор Visual Basic обнаруживает проблему в коде, возникает ошибка времени компиляции. В редакторе кода Visual Studio можно легко определить, какая строка кода вызвала ошибку, так как волнистая строка отображается под этой строкой кода. Если навести курсор на подчеркнутый фрагмент, появляется сообщение об ошибке. Также его можно увидеть вместе с другими сообщениями в списке ошибок.

Если идентификатор имеет волнистый подчеркивание и короткое подчеркивание отображается под самым правым символом, можно создать заглушку для класса, конструктора, метода, свойства, поля или перечисления. Дополнительные сведения см. в разделе «Создание из использования» (Visual Studio).

Если вы будете правильно учитывать предупреждения компилятора Visual Basic, ваш код будет работать быстрее и с меньшим количеством ошибок. Эти предупреждения сообщают о том, что в коде могут возникнуть ошибки при запуске приложения. Например, компилятор предупреждает о вызове члена неопределенной объектной переменной, о возврате из функции без задания возвращаемого значения, а также о выполнении блока Try с ошибками в логике перехвата исключений. Дополнительные сведения о предупреждениях, в том числе о возможности включать и отключать их, см. в статье Configuring Warnings in Visual Basic (Настройка предупреждений в Visual Basic).

Источник

Office 2013 Visual Basic для приложений (VBA) ошибки

Симптомы

При открытии файла или попробуйте использовать макросы в Microsoft Office 2013 2 нажмите кнопку Run (C2R) возможно возникновение следующих проблем.

Microsoft Access

Постоянно мигает, окно установщика Windows.

При использовании мастера Access появляется следующее сообщение об ошибке:

«Это средство не установлено или была отключена»

При открытии редактора Visual Basic (VBE) появляется следующее сообщение об ошибке:

«Microsoft Access не удалось загрузить Visual Basic для приложений библиотеки динамической компоновки (dll) Vbe7»

Microsoft Word

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

«Функция, которую вы пытаетесь запустить, содержит макросы или содержимое требует поддержки языка создания макросов»

Microsoft Excel

При открытии существующих книг, можно получить следующее сообщение об ошибке:

«Visual Basic для приложений (VBA) макросов в данной книге повреждены и были удалены.» Открытие существующей книги

Параметры Visual Basic, макросыи Записи макросов отключены в группе разработчиков и просмотр ленты.

Параметры Visual Basic и макросы отключаются на ленте.

При открытии презентаций с VBA-кодом возникает следующая ошибка:

«Документ содержит макросы. Для этого приложения поддержка макроязыка отключена. Компоненты, которым требуется VBA не доступны. Вы хотите открыть этот документ только для чтения?»

Причина

Очистители реестра сторонних разработчиков и обслуживание приложений системы удалены несколько разделов реестра, используемых для выполнения функций VBA в приложениях Microsoft Office 2013.

Решение

Запустите интерактивный ремонт пакета Office. Вот как:

Нажмите кнопку Пуск> Панель управления> программы и компоненты.

Выберите приложение Microsoft Office и нажмите кнопку Изменить.

Выберите Восстановление по сети и затем нажмите кнопку Восстановить.

После завершения восстановления сети следует использовать приложения Office 2013.

На начальном экране введите в поле поиска Панели управления и затем коснитесь или щелкните приложения.

Нажмите кнопку или выберите Панель управления > программы > программы и компоненты.

Выберите программу Microsoft Office и нажмите кнопку Изменить.

Выберите Восстановление по сети и затем нажмите кнопку Восстановить.

После завершения восстановления сети следует использовать приложения Office 2013.

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

Источник

Обработка ошибок

Если вы когда-нибудь учились водить автомобиль, то наверняка вспомните, что при первой посадке на водительское сиденье все внимание было приковано к трем деталям: рулю, педалям и рычагу переключения передач. Происходящее вне автомобиля уходило на второй план, так как вначале нужно было стронуться с места. По мере практики навыки вождения улучшались и эти три детали постепенно уходили на задний план. Как ни странно, но руль и рычаг переключения передач всегда оказывались там, куда вы не смотря протягивали руки, а ноги сами находили педали. Теперь все внимание стало занимать происходящее на дороге. Иными словами, вы стали опытным водителем.

В программировании все абсолютно также. Начинающие программисты больше обращают внимание на первые попавшиеся на глаза операторы, функции и другие элементы языка, а сам алгоритм уходит на задний план. Если программа скомпилировалась без ошибок, то это уже большое счастье, хотя это еще не означает, что программа работает правильно. По мере практики мышление программиста меняется, он начинает обращать внимание на мелочи, на форматирование программы, использует более эффективные алгоритмы и в результате всего этого допускает меньше ошибок. Подводя итоги, можно сказать, что начинающий программист просто пишет программу, а опытный программист пытается найти оптимальный алгоритм и предусмотреть поведение программы в различных ситациях. Однако, от ошибок никто не застрахован, поэтому очень важно знать как быстро найти ошибку.

Типы ошибок

Существуют три типа ошибок в программе:

  • синтаксические — это ошибки в имени оператора или подпрограммы, отсутствие закрывающей или открывающей кавычек и т. д., то есть ошибки в синтаксисе языка. Как правило, компилятор предупредит о наличии ошибки, а программа не будет выполняться совсем;
  • логические — это ошибки в логике работы программы, которые можно выявить только по результатам работы программы. Как правило, компилятор не предупреждает о наличии ошибки, а программа будет выполняться, так как не содержит синтаксических ошибок. Такие ошибки достаточно трудно выявить;
  • ошибки времени выполнения — это ошибки, которые возникают во время работы программы. В одних случаях ошибки времени выполнения являются следствием логических ошибок, а в других случаях причиной являются внешние события, например, нехватка оперативной памяти, отсутствие прав для записи в файл и др.

Инструкция On Error

Ошибки времени выполнения можно перехватывать внутри подпрограммы. Для этого используется инструкция On Error , которая имеет три формата:

  • On Error GoTo — при возникновении ошибки управление передается инструкции, помеченной меткой . Метка должна быть допустимым идентификатором, к которому предъявляются такие же требования как и к переменным. Внутри подпрограммы метка указывается в самом начале помечаемой строки и после метки ставится двоеточие. В качестве примера создадим функцию для деления двух целых чисел. Внутри функции предусмотрим обработку ошибки деления на 0 :

Если при вызове функции во втором параметре передать значение 0 , то управление будет передано в строку, помеченную с помощью метки ПриОшибке . Обратите внимание на то, что метка расположена после инструкции Exit Function . В этом случае код после инструкции Exit Function будет выполнен только в том случае, если возникнет ошибка;

  • On Error Resume Next — при возникновении ошибки управление передается следующей инструкции;
  • On Error GoTo 0 — отключает перехват ошибок.

Если внутри подпрограммы не предусмотрен перехват ошибки, то при возникновении ошибки работа программы прерывается и выводится стандартное окно с описанием и несколькими кнопками: Continue (продолжить), End (завершить выполнение программы), Debug (перейти в режим отладки) и Help (вывод справки).

Инструкция Resume

Инструкция Resume позволяет указать куда следует переходить после обработки ошибки. Инструкция имеет несколько форматов:

  • Resume [0] — управление передается инструкции, вызвавшей ошибку;
  • Resume Next — управление передается инструкции, следующей за инструкцией, вызвавшей ошибку;
  • Resume — управление передается инструкции, помеченной меткой .

Если инструкция Resume не указана, то выполняется только код внутри обработчика ошибки и производится выход из подпрограммы.

Получение информации об ошибке и генерация ошибки

Вся информация о последней ошибке доступна через объект Err . Объект содержит следующие свойства:

  • Number — код ошибки, например, код 11 для ошибки деления на 0 . Если ошибки не произошло, то свойство содержит значение 0 ;
  • Description — описание ошибки, например, строка «Division by zero» для ошибки деления на 0 . Пример вывода кода и описания ошибки:
  • Source — название текущего проекта;
  • HelpFile — путь к файлу справки;
  • HelpContext — идентификатор раздела в справочном файле;
  • LastDLLError — системный код ошибки при работе с DLL.

Объект Err содержит следующие методы:

  • Clear() — очищает всю информацию о последней ошибке. Этот метод следует вызвать после успешной обработки ошибки. Информация об ошибке автоматически очищается при выходе из подпрограммы и ряде других случаев;
  • Raise() — позволяет сгенерировать ошибку в программе. Формат метода:

В параметре Number указывается код генерируемой ошибки (целое число от 0 до 65 535 ). Коды от 0 до 512 зарезервированы под системные ошибки, а остальные коды можно использовать под пользовательские ошибки. Чтобы сгенерировать ошибку с пользовательским кодом необходимо сложить код с константой vbObjectError . Остальные параметры являются необязательными и полностью аналогичны одноименным свойствам объекта Err . Пример генерации и обработки пользовательской ошибки:

Способы поиска ошибок в программе

В предыдущих разделах мы научились обрабатывать ошибки времени выполнения. Однако, наибольшее количество времени программист затрачивает на другой тип ошибок — логические ошибки. В этом случае программа компилируется без ошибок, но результат выполнения программы не соответствует ожидаемому результату. Ситуация еще более осложняется, когда неверный результат проявляется лишь периодически, а не постоянно. Инсценировать такую же ситуацию, чтобы получить этот же неверный результат, бывает крайне сложно и занимает очень много времени. В этом разделе мы рассмотрим лишь «дедовские» (но по прежнему актуальные) способы поиска ошибок, а современные способы отладки приложений, доступные в VBA, изучим в следующем разделе.

Первое, на что следует обратить внимание, — на объявления переменных. Например, рассмотрим простой пример:

Как вы думаете, какое значение отобразится в окне Immediate после выполнения этого кода? Думаете, что число 10? Не факт! Вот тут-то и кроется проблема не видная на первый взгляд. В первой инструкции присваивается значение переменной x , имя которой набрано на английской раскладке клавиатуры, а вот во второй инструкции выводится значение переменной x , имя которой набрано на русской раскладке клавиатуры. В результате значение присваивается одной переменной, а выводится значение другой переменной. Такие ситуации очень часто встречаются в программах на языке VBA, так как объявлять переменную не обязательно. Чтобы избежать такой ситуации следует обязательно объявлять переменные явным образом. Контроль за соблюдением этого правила можно возложить на компилятор, добавив в начале модуля следующую инструкцию:

При наличии инструкции компилятор производит проверку объявления всех переменных. Если переменная не была объявлена явным образом, то компилятор выведет сообщение об ошибке и выполнение программы будет остановлено. Таким образом, код должен выглядеть следующим образом:

Далее следует обратить внимание на форматирование кода. Начинающие программисты обычно не обращают на это никакого внимания, считая этот процесс лишним. А на самом деле зря! Компилятору абсолютно все равно, разместите вы все инструкции на одной строке или выполните форматирование кода. Однако, при поиске ошибок форматирование кода позволит найти ошибку гораздо быстрее.

Перед всеми инструкциями внутри блока должно быть расположено одинаковое количество пробелов. Обычно используют три или четыре пробела. От применения символов табуляции лучше отказаться. Если все же используете, то не следует в одном файле совмещать и пробелы и табуляцию. Для вложенных блоков количество пробелов умножают на уровень вложенности. Если для блока первого уровня вложенности использовалось три пробела, то для блока второго уровня вложенности должно использоваться шесть пробелов, для третьего уровня — девять пробелов и т. д. Пример форматирования вложенных блоков приведен в листинге 11.1.

Листинг 11.1. Пример форматирования вложенных блоков

Длина одной строки не должна содержать более 80 символов. Если количество символов больше, то следует выполнить переход на новую строку. При этом продолжение смещается относительно основной инструкции на величину отступа или выравнивается по какому-либо элементу. Иначе приходится пользоваться горизонтальной полосой прокрутки, а это очень неудобно при поиске ошибок.

Если программа слишком большая, то следует задуматься о разделении программы на отдельные подпрограммы или классы, которые выполняют логически законченные действия. Помните, что отлаживать отдельную подпрограмму гораздо легче, чем «спагетти»-код. Причем прежде чем вставить подпрограмму (или класс) в основную программу ее следует протестировать в отдельном проекте, передавая подпрограмме различные значения и проверяя результат ее выполнения.

Обратите внимание на то, что форматирование кода должно выполняться при написании кода, а не во время поиска ошибок. Этим вы сократите время поиска ошибки и скорее всего заметите ошибку еще на этапе написания. Если все же ошибка возникла, то вначале следует инсценировать ситуацию, при которой ошибка проявляется. После этого можно начать поиск ошибки.

Причиной периодических ошибок чаще всего являются внешние данные. Например, если числа получаются от пользователя, а затем производится деление чисел, то вполне возможна ситуация, при которой пользователь введет число 0 . Деление на ноль приведет к ошибке. Следовательно, все данные, которые поступают от пользователей, должны проверяться на соответствие допустимым значениям. Если данные не соответствуют, то нужно вывести сообщение об ошибке, а затем повторно запросить новое число или прервать выполнение всей программы. Кроме того, нужно обработать возможность того, что пользователь может ввести вовсе не число, а строку.

Метод Print() объекта Debug удобно использовать для вывода промежуточных значений. В этом случае значения переменных вначале выводятся в самом начале программы и производится проверка соответствия значений. Если значения соответствуют, то инструкция с методом Print() перемещается на следующую строку программы и опять производится проверка и т. д. Если значения не совпали, то ошибка возникает в инструкции, расположенной перед инструкцией с методом Print() . Если это пользовательская подпрограмма, то проверку значений производят внутри подпрограммы, каждый раз перемещая инструкцию с выводом значений. На одном из этих многочисленных этапов ошибка обычно обнаруживается. В больших программах можно логически догадаться о примерном расположении инструкции с ошибкой и начать поиск ошибки оттуда, а не с самого начала программы.

Инструкции для вывода промежуточных значений можно расставить уже при написании программы, не дожидаясь возникновения ошибки. В этом случае в начале программы объявляется константа с помощью инструкции #Const , а внутри программы производится проверка значения константы:

Проверить значение константы позволяет следующая конструкция:

Таким образом, меняя значение константы MY_DEBUG с 1 на 0 , можно отлючать вывод всех промежуточных значений.

Отладка программы в VBA

Сделать поиск ошибок более эффективным позволяет отладчик, встроенный в редактор VBA. С его помощью можно выполнять программу по шагам, при этом контролируя значения переменных на каждом шагу. Отладчик позволяет также проверить, соответствует ли порядок выполнения инструкций разработанному ранее алгоритму.

Прежде чем начать отладку необходимо пометить строки внутри программы с помощью точек останова. Для добавления точки останова делаем строку активной, а затем из меню Debug выбираем пункт Toggle Breakpoint. Слева от строки появится кружок, обозначающий точку останова. Добавить точку останова можно еще быстрее. Для этого достаточно щелкнуть слева от строки левой кнопкой мыши. Повторный щелчок позволяет удалить точку останова. Кроме того, для добавления или удаления точки отстанова можно воспользоваться клавишей . Чтобы удалить все точки останова следует из меню View выбрать пункт Clear All Breakpoints.

Когда точки останова расставлены можно начать отладку. Для этого запускаем программу на выполнение обычным способом. При достижении точки останова выполнение программы прерывается и отладчик ожидает дальнейших действий программиста. Инструкция, которая будет выполняться на следующем шаге, помечается желтой стрелкой слева от строки.

В режиме прерывания можно посмотреть значения различных переменных в окне Locals. Если окно не отображается, то отобразить его можно выбрав в меню View пункт Locals Window. Посмотреть значение переменной можно также если навести указатель мыши на переменную. Значение переменной отобразится во всплывающей подсказке.

При отладке можно контролировать значения отдельных переменных, а не всех сразу. Для этого следует выделить название переменной и из меню Debug выбрать пункт Add Watch. Можно также выделить название переменной и из контектного меню выбрать пункт Add Watch. В открывшемся окне устанавливаем флажок Watch Expression и нажимаем кнопку OK. Значение переменной будет отображаться в окне Watches. Чтобы отобразить окно Watches из меню View выбираем пункт Watch Window. Чтобы отменить отслеживание нужно выделить строку в окне Watches и нажать клавишу .

Для пошагового выполнения программы предназначены следующие пункты в меню Debug или соответствующие кнопки на панели инструментов Debug ( View | Toolbars | Debug):

  • Step Into (клавиша ) — выполняет переход к следующей инструкции;
  • Step Over — выполняет одну инструкцию. Если в этой инструкции производится вызов подпрограммы, то подпрограмма выполняется за один шаг и отладчик переходит в режим ожидания после выхода из подпрограммы;
  • Step Out — при заходе в подпрограмму этот пункт позволяет выполнить подпрограмму за один шаг и выйти из нее. Отладчик переходит в режим прерывания после выхода из подпрограммы;
  • Run To Cursor — выполняет переход к инструкции, в которой расположен курсор.

Если необходимо посмотреть последовательность вызова подпрограмм, то следует открыть окно Call Stack, выбрав в меню View пункт Call Stack.

Подача звукового сигнала

При возникновении ошибки или при неправильном вводе данных имеет смысл привлечь внимание пользователя звуковым сигналом. Сгенерировать звуковой сигнал позволяет инструкция Beep . Пример:

Статьи по Visual Basic for Applications (VBA)

Помощь сайту

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

Источник

Вступление

Код, который компилирует, может по-прежнему сталкиваться с ошибками во время выполнения. В этом разделе перечислены наиболее распространенные из них, их причины и способы их устранения.

Ошибка времени выполнения «3»: возврат без GoSub

Неверный код

Sub DoSomething()
    GoSub DoThis
DoThis:
    Debug.Print "Hi!"
    Return
End Sub

Почему это не работает?

Выполнение входит в процедуру DoSomething , переходит на метку DoThis , печатает «Привет!». на выход отладки, возвращается к инструкции сразу после вызова GoSub , печатает «Привет!». снова, а затем встречает оператор Return , но до сих пор некуда возвращаться , потому что мы не попали сюда с инструкцией GoSub .

Правильный код

Sub DoSomething()
    GoSub DoThis
    Exit Sub
DoThis:
    Debug.Print "Hi!"
    Return
End Sub

Почему это работает?

Представляя инструкцию Exit Sub перед DoThis линии DoThis , мы DoThis подпрограмму DoThis от остальной части тела процедуры — единственный способ выполнить подпрограмму DoThis — через прыжок GoSub .

Другие примечания

GoSub / Return устарел, и его следует избегать в пользу фактических вызовов процедур. Процедура не должна содержать подпрограмм, кроме обработчиков ошибок.

Это очень похоже на ошибку времени выполнения «20»: возобновить без ошибок ; в обеих ситуациях решение состоит в том, чтобы гарантировать, что нормальный путь выполнения не может войти в подпрограмму (обозначенную меткой строки) без явного перехода (предполагая, что On Error GoTo считается явным скачком ).

Ошибка времени выполнения «6»: переполнение

неверный код

Sub DoSomething()
    Dim row As Integer
    For row = 1 To 100000
        'do stuff
    Next
End Sub

Почему это не работает?

Тип данных Integer — это 16-разрядное целое число со знаком с максимальным значением 32 767; присваивая его чему-либо большему, чем это приведет к переполнению типа и повышению этой ошибки.

Правильный код

Sub DoSomething()
    Dim row As Long
    For row = 1 To 100000
        'do stuff
    Next
End Sub

Почему это работает?

Вместо этого вместо этого используется Long (32-разрядное) целое число, теперь мы можем создать цикл, который выполняет итерацию более 32 767 раз, не переполняя тип переменной счетчика.

Другие примечания

Дополнительные сведения см. В разделе Типы данных и лимиты .

Ошибка времени выполнения «9»: подстрочный индекс

неверный код

Sub DoSomething()
    Dim foo(1 To 10)
    Dim i As Long
    For i = 1 To 100
        foo(i) = i
    Next
End Sub

Почему это не работает?

foo — массив, содержащий 10 элементов. Когда счетчик циклов i достигает значения 11, foo(i) выходит за пределы диапазона . Эта ошибка возникает всякий раз, когда доступ к массиву или коллекции осуществляется с индексом, который не существует в этом массиве или коллекции.

Правильный код

Sub DoSomething()
    Dim foo(1 To 10)
    Dim i As Long
    For i = LBound(foo) To UBound(foo)
        foo(i) = i
    Next
End Sub

Почему это работает?

Используйте функции LBound и UBound для определения нижней и верхней границ массива, соответственно.

Другие примечания

Когда индекс является строкой, например ThisWorkbook.Worksheets("I don't exist") , эта ошибка означает, что предоставленное имя не существует в запрошенной коллекции.

Фактическая ошибка является специфичной для реализации; Collection будет повышена ошибка во время выполнения 5 «Неверный вызов или аргумент процедуры»:

Sub RaisesRunTimeError5()
    Dim foo As New Collection
    foo.Add "foo", "foo"
    Debug.Print foo("bar")
End Sub

Ошибка времени выполнения «13»: несоответствие типов

неверный код

Public Sub DoSomething()
    DoSomethingElse "42?"
End Sub

Private Sub DoSomethingElse(foo As Date)
'    Debug.Print MonthName(Month(foo))
End Sub

Почему это не работает?

VBA пытается очень тяжело преобразовать "42?" аргумент в значение Date . Когда он терпит неудачу, вызов DoSomethingElse не может быть выполнен, потому что VBA не знает, какую дату передать, поэтому он вызывает несоответствие типа ошибки 13 во время выполнения, поскольку тип аргумента не соответствует ожидаемому типу (и может ‘также неявно преобразуется).

Правильный код

Public Sub DoSomething()
    DoSomethingElse Now
End Sub

Private Sub DoSomethingElse(foo As Date)
'    Debug.Print MonthName(Month(foo))
End Sub

Почему это работает?

Date аргумент Date процедуре, которая ожидает параметр Date , вызов может быть успешным.

Ошибка времени выполнения ’91’: переменная объекта или с не заданной переменной блока

неверный код

Sub DoSomething()
    Dim foo As Collection
    With foo
        .Add "ABC"
        .Add "XYZ"
    End With
End Sub

Почему это не работает?

Переменные объекта содержат ссылку , а ссылки должны быть заданы с помощью ключевого слова « Set . Эта ошибка возникает , когда вызов элемента выполнен на объекте, ссылка не является Nothing . В этом случае foo является ссылкой Collection , но он не инициализирован, поэтому ссылка содержит Nothing — и мы не можем вызвать .Add on Nothing .

Правильный код

Sub DoSomething()
    Dim foo As Collection
    Set foo = New Collection
    With foo
        .Add "ABC"
        .Add "XYZ"
    End With
End Sub

Почему это работает?

.Add объектной переменной допустимую ссылку с помощью ключевого слова Set , вызовы .Add успешными.

Другие примечания

Часто функция или свойство может возвращать ссылку на объект — распространенным примером является метод Excel Range.Find , который возвращает объект Range :

Dim resultRow As Long
resultRow = SomeSheet.Cells.Find("Something").Row

Однако функция может очень хорошо вернуть Nothing (если поисковый .Row не найден), поэтому вполне вероятно, что .Row вызова .Row не выполняется.

Перед вызовом членов объекта убедитесь, что ссылка задана с условием If Not xxxx Is Nothing :

Dim result As Range
Set result = SomeSheet.Cells.Find("Something")

Dim resultRow As Long
If Not result Is Nothing Then resultRow = result.Row

Ошибка времени выполнения «20»: возобновить без ошибок

неверный код

Sub DoSomething()
    On Error GoTo CleanFail
    DoSomethingElse

CleanFail:
    Debug.Print Err.Number
    Resume Next
End Sub

Почему это не работает?

Если процедура DoSomethingElse вызывает ошибку, выполнение переходит к CleanFail линии CleanFail , печатает номер ошибки, а команда Resume Next возвращается к инструкции, которая сразу же следует за строкой, в которой произошла ошибка, которая в этом случае является Debug.Print инструкция: подпрограмма обработки ошибок выполняется без контекста ошибки, и когда достигается команда Resume Next , возникает ошибка 20 времени выполнения, потому что возобновить ее некуда.

Правильный код

Sub DoSomething()
    On Error GoTo CleanFail
    DoSomethingElse

    Exit Sub    
CleanFail:
    Debug.Print Err.Number
    Resume Next
End Sub

Почему это работает?

Представляя инструкцию Exit Sub перед CleanFail линии CleanFail , мы CleanFail подпрограмму обработки ошибок CleanFail от остальной части тела процедуры — единственный способ выполнить подпрограмму обработки ошибок — с помощью скачка On Error ; поэтому путь выполнения не доходит до инструкции Resume за пределами контекста ошибки, что позволяет избежать ошибки времени выполнения 20.

Другие примечания

Это очень похоже на ошибку времени выполнения «3»: возврат без GoSub ; в обеих ситуациях решение состоит в том, чтобы гарантировать, что нормальный путь выполнения не может войти в подпрограмму (обозначенную меткой строки) без явного перехода (предполагая, что On Error GoTo считается явным скачком ).

Содержание

  1. Error messages in Visual Basic
  2. Run-time errors
  3. Compile-time errors
  4. Office 2013 Visual Basic for Applications (VBA) errors
  5. Symptoms
  6. Microsoft Access
  7. Microsoft Word
  8. Microsoft Excel
  9. Cause
  10. Resolution
  11. Сообщения об ошибках в Visual Basic
  12. Ошибки во время выполнения
  13. Ошибки времени компиляции
  14. Office 2013 Visual Basic для приложений (VBA) ошибки
  15. Симптомы
  16. Microsoft Access
  17. Microsoft Word
  18. Microsoft Excel
  19. Причина
  20. Решение
  21. Обработка ошибок
  22. Типы ошибок
  23. Инструкция On Error
  24. Инструкция Resume
  25. Получение информации об ошибке и генерация ошибки
  26. Способы поиска ошибок в программе
  27. Отладка программы в VBA
  28. Подача звукового сигнала

Error messages in Visual Basic

When you compile or run a Visual Basic application, the following types of errors can occur:

Compile-time errors, which occur when you compile an application.

Run-time errors, which occur when an application is running.

For information about how to troubleshoot a specific error, see Additional Resources for Visual Basic Programmers.

Run-time errors

If a Visual Basic application tries to perform an action that the system can’t execute, a run-time error occurs, and Visual Basic throws an Exception object. Visual Basic can generate custom errors of any data type, including Exception objects, by using the Throw statement. An application can identify the error by displaying the error number and message of a caught exception. If an error isn’t caught, the application ends.

The code can trap and examine run-time errors. If you enclose the code that produces the error in a Try block, you can catch any thrown error within a matching Catch block. For information about how to trap errors at run time and respond to them in your code, see Try. Catch. Finally Statement.

Compile-time errors

If the Visual Basic compiler encounters a problem in the code, a compile-time error occurs. In the Visual Studio code editor, you can easily identify which line of code caused the error because a wavy line appears under that line of code. The error message appears if you either point to the wavy underline or open the Error List, which also shows other messages.

If an identifier has a wavy underline and a short underline appears under the rightmost character, you can generate a stub for the class, constructor, method, property, field, or enum. For more information, see Generate From Usage (Visual Studio).

By resolving warnings from the Visual Basic compiler, you might be able to write code that runs faster and has fewer bugs. These warnings identify code that may cause errors when the application is run. For example, the compiler warns you if you try to invoke a member of an unassigned object variable, return from a function without setting the return value, or execute a Try block with errors in the logic to catch exceptions. For more information about warnings, including how to turn them on and off, see Configuring Warnings in Visual Basic.

Источник

Office 2013 Visual Basic for Applications (VBA) errors

Symptoms

When you open a file or try to use macros in Microsoft Office 2013 Click 2 Run (C2R), you may experience one of the following symptoms.

Microsoft Access

Windows Installer window continuously flashes.

When you use Access wizards you get the following error:

«This feature isn’t installed, or has been disabled»

When you open the Visual Basic Editor (VBE) you get the following error:

«Microsoft Access is unable to load the Visual Basic for Applications dynamic-link library (dll) Vbe7»

Microsoft Word

After you click Macros, you get the following error:

«The function you are attempting to run contains macros or content that requires macro language support»

Microsoft Excel

When you open existing workbooks, you get the following error:

«The Visual Basic for Applications (VBA) macros in this workbook are corrupted and have been deleted.» opening existing workbooks

The Visual Basic, Macros, and Record Macro options are disabled under the Developer and View ribbon.

The Visual Basic and Macros options are disabled on the ribbon.

When you open presentations with VBA code you get the following error:

«The document contains macros. Macro language support for this application is disabled. Features requiring VBA are not available. Would you like to open this document read-only?»

Cause

Non-Microsoft registry cleaners and system maintenance applications deleted multiple registry key values that are used for VBA functionality in Microsoft Office 2013 applications.

Resolution

Run an Online Repair of Office. Here’s how:

Click Start> Control Panel> Programs and Features.

Click your Microsoft Office program, and then click Change.

Select Online Repair, and then click Repair.

After Online Repair is complete, you should be able to use your Office 2013 applications.

From the Start screen, type Control Panel in the Search box, and then tap or click Apps.

Tap or click Control Panel > Programs > Programs and Features.

Select your Microsoft Office program, and then click Change.

Select Online Repair, and then click Repair.

After Online Repair is complete, you should be able to use your Office 2013 applications.

To prevent recurrences, contact the provider of the registry cleaner or system-maintenance application.

Источник

Сообщения об ошибках в Visual Basic

При компиляции или запуске приложения Visual Basic могут возникать следующие типы ошибок:

Ошибки во время компиляции, возникающие при компиляции приложения.

Ошибки во время выполнения, возникающие при запуске приложения.

Сведения о способах устранения некоторых ошибок можно найти в статье Additional Resources for Visual Basic Programmers (Дополнительные ресурсы для программирования на Visual Basic).

Ошибки во время выполнения

Если приложение Visual Basic пытается выполнить действие, которое система не может выполнить, возникает Exception ошибка во время выполнения и Visual Basic создает объект. Visual Basic может создавать пользовательские ошибки любого типа данных, включая Exception объекты, с помощью инструкции Throw . Приложение может идентифицировать ошибки, отображая номер ошибки и сообщение перехваченного исключения. Если ошибка не будет перехвачена, приложение завершается.

Код может перехватывать и проверять ошибки времени выполнения. Если вы заключите код, создающий ошибку, в блок Try , вы сможете перехватить любую созданную ошибку в соответствующем блоке Catch . Сведения о том, как в коде отлавливать ошибки во время выполнения и реагировать на них, можно найти в статье Try. Catch. Finally Statement (Оператор Try. Catch. Finally).

Ошибки времени компиляции

Если компилятор Visual Basic обнаруживает проблему в коде, возникает ошибка времени компиляции. В редакторе кода Visual Studio можно легко определить, какая строка кода вызвала ошибку, так как волнистая строка отображается под этой строкой кода. Если навести курсор на подчеркнутый фрагмент, появляется сообщение об ошибке. Также его можно увидеть вместе с другими сообщениями в списке ошибок.

Если идентификатор имеет волнистый подчеркивание и короткое подчеркивание отображается под самым правым символом, можно создать заглушку для класса, конструктора, метода, свойства, поля или перечисления. Дополнительные сведения см. в разделе «Создание из использования» (Visual Studio).

Если вы будете правильно учитывать предупреждения компилятора Visual Basic, ваш код будет работать быстрее и с меньшим количеством ошибок. Эти предупреждения сообщают о том, что в коде могут возникнуть ошибки при запуске приложения. Например, компилятор предупреждает о вызове члена неопределенной объектной переменной, о возврате из функции без задания возвращаемого значения, а также о выполнении блока Try с ошибками в логике перехвата исключений. Дополнительные сведения о предупреждениях, в том числе о возможности включать и отключать их, см. в статье Configuring Warnings in Visual Basic (Настройка предупреждений в Visual Basic).

Источник

Office 2013 Visual Basic для приложений (VBA) ошибки

Симптомы

При открытии файла или попробуйте использовать макросы в Microsoft Office 2013 2 нажмите кнопку Run (C2R) возможно возникновение следующих проблем.

Microsoft Access

Постоянно мигает, окно установщика Windows.

При использовании мастера Access появляется следующее сообщение об ошибке:

«Это средство не установлено или была отключена»

При открытии редактора Visual Basic (VBE) появляется следующее сообщение об ошибке:

«Microsoft Access не удалось загрузить Visual Basic для приложений библиотеки динамической компоновки (dll) Vbe7»

Microsoft Word

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

«Функция, которую вы пытаетесь запустить, содержит макросы или содержимое требует поддержки языка создания макросов»

Microsoft Excel

При открытии существующих книг, можно получить следующее сообщение об ошибке:

«Visual Basic для приложений (VBA) макросов в данной книге повреждены и были удалены.» Открытие существующей книги

Параметры Visual Basic, макросыи Записи макросов отключены в группе разработчиков и просмотр ленты.

Параметры Visual Basic и макросы отключаются на ленте.

При открытии презентаций с VBA-кодом возникает следующая ошибка:

«Документ содержит макросы. Для этого приложения поддержка макроязыка отключена. Компоненты, которым требуется VBA не доступны. Вы хотите открыть этот документ только для чтения?»

Причина

Очистители реестра сторонних разработчиков и обслуживание приложений системы удалены несколько разделов реестра, используемых для выполнения функций VBA в приложениях Microsoft Office 2013.

Решение

Запустите интерактивный ремонт пакета Office. Вот как:

Нажмите кнопку Пуск> Панель управления> программы и компоненты.

Выберите приложение Microsoft Office и нажмите кнопку Изменить.

Выберите Восстановление по сети и затем нажмите кнопку Восстановить.

После завершения восстановления сети следует использовать приложения Office 2013.

На начальном экране введите в поле поиска Панели управления и затем коснитесь или щелкните приложения.

Нажмите кнопку или выберите Панель управления > программы > программы и компоненты.

Выберите программу Microsoft Office и нажмите кнопку Изменить.

Выберите Восстановление по сети и затем нажмите кнопку Восстановить.

После завершения восстановления сети следует использовать приложения Office 2013.

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

Источник

Обработка ошибок

Если вы когда-нибудь учились водить автомобиль, то наверняка вспомните, что при первой посадке на водительское сиденье все внимание было приковано к трем деталям: рулю, педалям и рычагу переключения передач. Происходящее вне автомобиля уходило на второй план, так как вначале нужно было стронуться с места. По мере практики навыки вождения улучшались и эти три детали постепенно уходили на задний план. Как ни странно, но руль и рычаг переключения передач всегда оказывались там, куда вы не смотря протягивали руки, а ноги сами находили педали. Теперь все внимание стало занимать происходящее на дороге. Иными словами, вы стали опытным водителем.

В программировании все абсолютно также. Начинающие программисты больше обращают внимание на первые попавшиеся на глаза операторы, функции и другие элементы языка, а сам алгоритм уходит на задний план. Если программа скомпилировалась без ошибок, то это уже большое счастье, хотя это еще не означает, что программа работает правильно. По мере практики мышление программиста меняется, он начинает обращать внимание на мелочи, на форматирование программы, использует более эффективные алгоритмы и в результате всего этого допускает меньше ошибок. Подводя итоги, можно сказать, что начинающий программист просто пишет программу, а опытный программист пытается найти оптимальный алгоритм и предусмотреть поведение программы в различных ситациях. Однако, от ошибок никто не застрахован, поэтому очень важно знать как быстро найти ошибку.

Типы ошибок

Существуют три типа ошибок в программе:

  • синтаксические — это ошибки в имени оператора или подпрограммы, отсутствие закрывающей или открывающей кавычек и т. д., то есть ошибки в синтаксисе языка. Как правило, компилятор предупредит о наличии ошибки, а программа не будет выполняться совсем;
  • логические — это ошибки в логике работы программы, которые можно выявить только по результатам работы программы. Как правило, компилятор не предупреждает о наличии ошибки, а программа будет выполняться, так как не содержит синтаксических ошибок. Такие ошибки достаточно трудно выявить;
  • ошибки времени выполнения — это ошибки, которые возникают во время работы программы. В одних случаях ошибки времени выполнения являются следствием логических ошибок, а в других случаях причиной являются внешние события, например, нехватка оперативной памяти, отсутствие прав для записи в файл и др.

Инструкция On Error

Ошибки времени выполнения можно перехватывать внутри подпрограммы. Для этого используется инструкция On Error , которая имеет три формата:

  • On Error GoTo — при возникновении ошибки управление передается инструкции, помеченной меткой . Метка должна быть допустимым идентификатором, к которому предъявляются такие же требования как и к переменным. Внутри подпрограммы метка указывается в самом начале помечаемой строки и после метки ставится двоеточие. В качестве примера создадим функцию для деления двух целых чисел. Внутри функции предусмотрим обработку ошибки деления на 0 :

Если при вызове функции во втором параметре передать значение 0 , то управление будет передано в строку, помеченную с помощью метки ПриОшибке . Обратите внимание на то, что метка расположена после инструкции Exit Function . В этом случае код после инструкции Exit Function будет выполнен только в том случае, если возникнет ошибка;

  • On Error Resume Next — при возникновении ошибки управление передается следующей инструкции;
  • On Error GoTo 0 — отключает перехват ошибок.

Если внутри подпрограммы не предусмотрен перехват ошибки, то при возникновении ошибки работа программы прерывается и выводится стандартное окно с описанием и несколькими кнопками: Continue (продолжить), End (завершить выполнение программы), Debug (перейти в режим отладки) и Help (вывод справки).

Инструкция Resume

Инструкция Resume позволяет указать куда следует переходить после обработки ошибки. Инструкция имеет несколько форматов:

  • Resume [0] — управление передается инструкции, вызвавшей ошибку;
  • Resume Next — управление передается инструкции, следующей за инструкцией, вызвавшей ошибку;
  • Resume — управление передается инструкции, помеченной меткой .

Если инструкция Resume не указана, то выполняется только код внутри обработчика ошибки и производится выход из подпрограммы.

Получение информации об ошибке и генерация ошибки

Вся информация о последней ошибке доступна через объект Err . Объект содержит следующие свойства:

  • Number — код ошибки, например, код 11 для ошибки деления на 0 . Если ошибки не произошло, то свойство содержит значение 0 ;
  • Description — описание ошибки, например, строка «Division by zero» для ошибки деления на 0 . Пример вывода кода и описания ошибки:
  • Source — название текущего проекта;
  • HelpFile — путь к файлу справки;
  • HelpContext — идентификатор раздела в справочном файле;
  • LastDLLError — системный код ошибки при работе с DLL.

Объект Err содержит следующие методы:

  • Clear() — очищает всю информацию о последней ошибке. Этот метод следует вызвать после успешной обработки ошибки. Информация об ошибке автоматически очищается при выходе из подпрограммы и ряде других случаев;
  • Raise() — позволяет сгенерировать ошибку в программе. Формат метода:

В параметре Number указывается код генерируемой ошибки (целое число от 0 до 65 535 ). Коды от 0 до 512 зарезервированы под системные ошибки, а остальные коды можно использовать под пользовательские ошибки. Чтобы сгенерировать ошибку с пользовательским кодом необходимо сложить код с константой vbObjectError . Остальные параметры являются необязательными и полностью аналогичны одноименным свойствам объекта Err . Пример генерации и обработки пользовательской ошибки:

Способы поиска ошибок в программе

В предыдущих разделах мы научились обрабатывать ошибки времени выполнения. Однако, наибольшее количество времени программист затрачивает на другой тип ошибок — логические ошибки. В этом случае программа компилируется без ошибок, но результат выполнения программы не соответствует ожидаемому результату. Ситуация еще более осложняется, когда неверный результат проявляется лишь периодически, а не постоянно. Инсценировать такую же ситуацию, чтобы получить этот же неверный результат, бывает крайне сложно и занимает очень много времени. В этом разделе мы рассмотрим лишь «дедовские» (но по прежнему актуальные) способы поиска ошибок, а современные способы отладки приложений, доступные в VBA, изучим в следующем разделе.

Первое, на что следует обратить внимание, — на объявления переменных. Например, рассмотрим простой пример:

Как вы думаете, какое значение отобразится в окне Immediate после выполнения этого кода? Думаете, что число 10? Не факт! Вот тут-то и кроется проблема не видная на первый взгляд. В первой инструкции присваивается значение переменной x , имя которой набрано на английской раскладке клавиатуры, а вот во второй инструкции выводится значение переменной x , имя которой набрано на русской раскладке клавиатуры. В результате значение присваивается одной переменной, а выводится значение другой переменной. Такие ситуации очень часто встречаются в программах на языке VBA, так как объявлять переменную не обязательно. Чтобы избежать такой ситуации следует обязательно объявлять переменные явным образом. Контроль за соблюдением этого правила можно возложить на компилятор, добавив в начале модуля следующую инструкцию:

При наличии инструкции компилятор производит проверку объявления всех переменных. Если переменная не была объявлена явным образом, то компилятор выведет сообщение об ошибке и выполнение программы будет остановлено. Таким образом, код должен выглядеть следующим образом:

Далее следует обратить внимание на форматирование кода. Начинающие программисты обычно не обращают на это никакого внимания, считая этот процесс лишним. А на самом деле зря! Компилятору абсолютно все равно, разместите вы все инструкции на одной строке или выполните форматирование кода. Однако, при поиске ошибок форматирование кода позволит найти ошибку гораздо быстрее.

Перед всеми инструкциями внутри блока должно быть расположено одинаковое количество пробелов. Обычно используют три или четыре пробела. От применения символов табуляции лучше отказаться. Если все же используете, то не следует в одном файле совмещать и пробелы и табуляцию. Для вложенных блоков количество пробелов умножают на уровень вложенности. Если для блока первого уровня вложенности использовалось три пробела, то для блока второго уровня вложенности должно использоваться шесть пробелов, для третьего уровня — девять пробелов и т. д. Пример форматирования вложенных блоков приведен в листинге 11.1.

Листинг 11.1. Пример форматирования вложенных блоков

Длина одной строки не должна содержать более 80 символов. Если количество символов больше, то следует выполнить переход на новую строку. При этом продолжение смещается относительно основной инструкции на величину отступа или выравнивается по какому-либо элементу. Иначе приходится пользоваться горизонтальной полосой прокрутки, а это очень неудобно при поиске ошибок.

Если программа слишком большая, то следует задуматься о разделении программы на отдельные подпрограммы или классы, которые выполняют логически законченные действия. Помните, что отлаживать отдельную подпрограмму гораздо легче, чем «спагетти»-код. Причем прежде чем вставить подпрограмму (или класс) в основную программу ее следует протестировать в отдельном проекте, передавая подпрограмме различные значения и проверяя результат ее выполнения.

Обратите внимание на то, что форматирование кода должно выполняться при написании кода, а не во время поиска ошибок. Этим вы сократите время поиска ошибки и скорее всего заметите ошибку еще на этапе написания. Если все же ошибка возникла, то вначале следует инсценировать ситуацию, при которой ошибка проявляется. После этого можно начать поиск ошибки.

Причиной периодических ошибок чаще всего являются внешние данные. Например, если числа получаются от пользователя, а затем производится деление чисел, то вполне возможна ситуация, при которой пользователь введет число 0 . Деление на ноль приведет к ошибке. Следовательно, все данные, которые поступают от пользователей, должны проверяться на соответствие допустимым значениям. Если данные не соответствуют, то нужно вывести сообщение об ошибке, а затем повторно запросить новое число или прервать выполнение всей программы. Кроме того, нужно обработать возможность того, что пользователь может ввести вовсе не число, а строку.

Метод Print() объекта Debug удобно использовать для вывода промежуточных значений. В этом случае значения переменных вначале выводятся в самом начале программы и производится проверка соответствия значений. Если значения соответствуют, то инструкция с методом Print() перемещается на следующую строку программы и опять производится проверка и т. д. Если значения не совпали, то ошибка возникает в инструкции, расположенной перед инструкцией с методом Print() . Если это пользовательская подпрограмма, то проверку значений производят внутри подпрограммы, каждый раз перемещая инструкцию с выводом значений. На одном из этих многочисленных этапов ошибка обычно обнаруживается. В больших программах можно логически догадаться о примерном расположении инструкции с ошибкой и начать поиск ошибки оттуда, а не с самого начала программы.

Инструкции для вывода промежуточных значений можно расставить уже при написании программы, не дожидаясь возникновения ошибки. В этом случае в начале программы объявляется константа с помощью инструкции #Const , а внутри программы производится проверка значения константы:

Проверить значение константы позволяет следующая конструкция:

Таким образом, меняя значение константы MY_DEBUG с 1 на 0 , можно отлючать вывод всех промежуточных значений.

Отладка программы в VBA

Сделать поиск ошибок более эффективным позволяет отладчик, встроенный в редактор VBA. С его помощью можно выполнять программу по шагам, при этом контролируя значения переменных на каждом шагу. Отладчик позволяет также проверить, соответствует ли порядок выполнения инструкций разработанному ранее алгоритму.

Прежде чем начать отладку необходимо пометить строки внутри программы с помощью точек останова. Для добавления точки останова делаем строку активной, а затем из меню Debug выбираем пункт Toggle Breakpoint. Слева от строки появится кружок, обозначающий точку останова. Добавить точку останова можно еще быстрее. Для этого достаточно щелкнуть слева от строки левой кнопкой мыши. Повторный щелчок позволяет удалить точку останова. Кроме того, для добавления или удаления точки отстанова можно воспользоваться клавишей . Чтобы удалить все точки останова следует из меню View выбрать пункт Clear All Breakpoints.

Когда точки останова расставлены можно начать отладку. Для этого запускаем программу на выполнение обычным способом. При достижении точки останова выполнение программы прерывается и отладчик ожидает дальнейших действий программиста. Инструкция, которая будет выполняться на следующем шаге, помечается желтой стрелкой слева от строки.

В режиме прерывания можно посмотреть значения различных переменных в окне Locals. Если окно не отображается, то отобразить его можно выбрав в меню View пункт Locals Window. Посмотреть значение переменной можно также если навести указатель мыши на переменную. Значение переменной отобразится во всплывающей подсказке.

При отладке можно контролировать значения отдельных переменных, а не всех сразу. Для этого следует выделить название переменной и из меню Debug выбрать пункт Add Watch. Можно также выделить название переменной и из контектного меню выбрать пункт Add Watch. В открывшемся окне устанавливаем флажок Watch Expression и нажимаем кнопку OK. Значение переменной будет отображаться в окне Watches. Чтобы отобразить окно Watches из меню View выбираем пункт Watch Window. Чтобы отменить отслеживание нужно выделить строку в окне Watches и нажать клавишу .

Для пошагового выполнения программы предназначены следующие пункты в меню Debug или соответствующие кнопки на панели инструментов Debug ( View | Toolbars | Debug):

  • Step Into (клавиша ) — выполняет переход к следующей инструкции;
  • Step Over — выполняет одну инструкцию. Если в этой инструкции производится вызов подпрограммы, то подпрограмма выполняется за один шаг и отладчик переходит в режим ожидания после выхода из подпрограммы;
  • Step Out — при заходе в подпрограмму этот пункт позволяет выполнить подпрограмму за один шаг и выйти из нее. Отладчик переходит в режим прерывания после выхода из подпрограммы;
  • Run To Cursor — выполняет переход к инструкции, в которой расположен курсор.

Если необходимо посмотреть последовательность вызова подпрограмм, то следует открыть окно Call Stack, выбрав в меню View пункт Call Stack.

Подача звукового сигнала

При возникновении ошибки или при неправильном вводе данных имеет смысл привлечь внимание пользователя звуковым сигналом. Сгенерировать звуковой сигнал позволяет инструкция Beep . Пример:

Статьи по Visual Basic for Applications (VBA)

Помощь сайту

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

Источник

Понравилась статья? Поделить с друзьями:
  • Ошибка вызова сервиса лицензирования
  • Ошибка вызова сервиса передачи получения данных дублирование данных
  • Ошибка вызова сервиса передачи получения данных null
  • Ошибка вызова сервиса передачи получения данных 0 зарегистрировано
  • Ошибка вызова операции сервиса http regservice keydisk ru