Ошибка времени выполнения basic свойство или метод не найдены text

  • Печать

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

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

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]   Вверх

Номер

Сообщение

Описание

3

Return
without GoSub

Оператор Return без GoSub

5

Invalid
procedure call

Неверный вызов процедуры

6

Overflow

Переполнение

7

Out of
memory

Недостаточно памяти

9

Subscript
out of range

Индекс вне заданного диапазона

10

This
array is fixed or temporarily locked

Этот массив имеет фиксированную длину или он временно
заблокирован

11

Division
by zero

Деление на ноль

13

Type mismatch

Несоответствие типа

14

Out of
string space

Не хватает памяти для строки

16

Expression
too complex

Выражение слишком сложное

17

Can’t
perform requested operation

Невозможно выполнить требуемую операцию

18

User
interrupt occurred

Произошло прерывание по команде пользователя

20

Resume
without error

Оператор Resume применен за пределами кода, отвечающего за
обработку ошибки

28

Out of
stack space

В стеке не хватает памяти

35

Sub,
Function or Property not defined

Процедура Sub, Function или Property не определена

47

Too many
DLL application clients

Слишком много приложений обращаются к DLL

48

Error in
loading DLL

Ошибка при загрузке DLL

49

Bad DLL
calling convention

Неверный вызов DLL

51

Internal
error

Внутренняя ошибка

52

Bad file
name or number

Неверное имя или номер файла

53

File not
found

Файл не найден

54

Bad file
mode

Неверный тип доступа

55

File
already open

Файл уже открыт

57

Device
I/O error

Ошибка устройства ввода/вывода

58

File
already exists

Файл уже существует

59

Bad
record length

Неверный размер записи

61

Disk full

Диск переполнен

62

Input
past end of file

Чтение файла невозможно, т.к. достигнут его конец

63

Bad
record number

Неверный номер записи

67

Too many
files

Слишком много файлов

68

Device unavailable

Устройство недоступно

70

Permission
denied

Доступ запрещен

71

Disk not
ready

Диск не готов

74

Can’t
rename with different drive

Нельзя переименовать файл со сменой носителя

75

Path/File
access error

Ошибка доступа к каталогу/файлу

76

Path not
found

Каталог не найден

91

Object
variable or With block variable not set

Переменная объекта или переменная блока With не задана

92

For loop
not initialized

Цикл For не инициализирован

93

Invalid
pattern string

Неверная маска

94

Invalid
use or Null

Неверное использование Null

97

Can’t
call Friend procedure on an object that is not an instance of the defining
class

Нельзя вызвать процедуру Friend, т.к. она не является
экземпляром класса

98

A
property or method call cannot include a reference to a private object,
either as an argument or as a return value

Обращение к свойству или методу не может включать ссылку
на локальный объект. Этот объект также не может быть аргументом или
возвращаемым значением

260

No timer
available

Ни один таймер не доступен

282

No
foreign application responded to a DDE initiate

Ни одно внешнее приложение не ответило на инициативу DDE

288

Destination
is busy

Адресат занят

290

Data is
wrong format

Неправильный формат данных

294

Invalid
DDE Link format

Неверный формат данных в DDE-диалоге

296

PasteLink
already performed on this control

PasteLink для этого элемента управления уже выполнен

297

Can’t set
LinkMode; invalid LinkTopic

Нельзя установить LinkMode; неправильный LinkTopic

298

System
DLL could not be loaded

Системная DLL
(библиотека) не может быть загружена

320

Can’t use
character device names in specified file names

Нельзя использовать имя устройства в определении имени
файла

321

Invalid
file format

Неверный формат файла

322

Can’t
create necessary temporary file

Не могу создать необходимый временный файл

325

Invalid
format in resource file

Неверный формат файла ресурсов

327

Data
value named not found

Значение не найдено

328

Illegal
parameter; can’t write arrays

Неверный параметр; не могу записать массив

335

Could not
access system registry

Доступ к системному реестру невозможен

336

ActiveX
component not correctly registered

Компонент ActiveX зарегистрирован неправильно

337

ActiveX
component not found

Компонент ActiveX не найден

338

ActiveX
component did not run correctly

Компонент ActiveX не может быть корректно выполнен

340

Control
array element ‘item’ doesn’t exist

Элемент управления ‘имя’ не найден

341

Invalid
control array index

Неверный индекс массива элементов управления

342

Not
enough room to allocate control array ‘item’

Недостаточно памяти для создания элемента управления ‘имя’

343

Object
not an array

Объект не является массивом

344

Must
specify index for object array

Необходимо указать индекс массива

345

Reached
limit: cannot create any more controls on this form

Достигнута верхняя граница: нельзя создать больше ни
одного элемента управления в этой форме

360

Object
already loaded

Объект уже загружен

361

Can’t
load or unload this object

Невозможно загрузить или выгрузить данный объект

363

ActiveX
control specified not found

Элемент управления ActiveX не найден

364

Object
was unload

Объект был выгружен

365

Unable to
unload within this context

Нет возможности в данном контексте произвести выгрузку

366

No MDI
form available to load

Форма, не определенная как MDI, не может быть загружена

368

The
specified file is out of date. This program requires a later version

Данный файл устарел. Эта программа требует более новой
версии

371

The
specified object can’t be used as an owner form for Show

Данный объект не может быть использован как родитель формы
для ее показа

380

Invalid
property value

Неверное значение свойства

381

Invalid
property-array index

Неверный индекс массива свойств

382

Property
Set can’t be executed at run time

Процедура установки свойства (Property Set) не может быть запущена
во время выполнения программы

383

Property
Set can’t be used with
а read-only property

Процедура установки свойства (Property Set) не может быть
использована для свойств, доступных только для чтения

385

Need
property-array index

Для массива свойств надо указать индекс

387

Property
Set not permitted

Процедура установки свойства (Property Set) не разрешена

389

Invalid key

Нажата неверная клавиша

393

Property
Get can’t be executed at run time

Процедура чтения свойства (Property Get) не поддерживается
во время выполнения программы

394

Property
Get can’t be executed on write-only property

Процедура чтения свойства (Property Get) не может быть
использована для свойств, доступных только для записи

396

‘Item’
property cannot be set within a page

Свойство ‘имя’ нельзя установить для страницы (объект
Printer)

400

Form
already displayed; can’t show modally

Форма уже отображена, ее нельзя отобразить как модальную

401

Can’t
show non-modal form when modal form is displayed

Немодальную форму нельзя отобразить одновременно с модальной

402

Must
close or hide topmost modal form first

Сначала необходимо закрыть верхнюю модальную форму

403

HDI forms
cannot be shown modally

MDI-формы не могут быть отображены как модальные

404

MDI child
forms cannot be shown modally

Дочерние MDI-формы не могут быть отображены модальными

419

Permission
to use object denied

Использование объекта запрещено

422

Property
not found

Свойство не найдено

423

Property
or method not found

Свойство или метод не найдены

424

Object required

Необходим объект

425

Invalid
object use

Неверное использование объекта

427

Invalid
object type; Menu control required

Неверный тип объекта; требуется элемент управления типа
Menu

429

ActiveX
component can’t create object or return reference to this object

Компонент ActiveX
не может создать объект или возвратить ссылку на этот объект

430

Class
doesn’t support Automation

Класс не поддерживает программирование объектов
(Automation)

432

File name
or class name not found during Automation operation

Имя файла или класса не найдено в процессе операции
программирования объектов (Automation)

438

Object
doesn’t support this property or method

Объект не поддерживает данное свойство или метод

440

Automation error

Ошибка программирования объектов (Automation)

442

Connection
to type library or object library for remote process has been lost

Связь с библиотекой типов или объектов для удаленного
процесса была утеряна

443

Automation
object doesn’t have a default value

Объект Automation
не имеет значения по умолчанию

444

Method not applicable in this context

Метод в этом контексте недоступен

445

Object doesn’t support this action

Объект не поддерживает эту команду

446

Object
doesn’t support named arguments

Объект не поддерживает указанные аргументы

447

Object doesn’t support current locale setting

Объект не поддерживает текущие национальные стандарты

448

Name argument not found

Именованный аргумент не найден

449

Argument
not optional or invalid property assignment

Аргумент обязателен или неверное
назначение свойства

450

Wrong
number of arguments

Неправильное количество аргументов

451

Object not a collection

Объект не является коллекцией

452

Invalid ordinal

Неверный порядковый номер

453

Specified DLL function not found

Указанная функция DLL не найдена

454

Code
resource not found

Код ресурса не найден

457

This key
is already associated with an element of this collection

Этот ключ уже ассоциирован с элементом этой коллекции

458

Variable
uses a type not supported in Visual Basic

Переменная использует тип, не поддерживаемый Visual Basic

459

This
component doesn’t support the set of events

Этот компонент не поддерживает установку событий

460

Invalid Clipboard format

Неверный формат Буфера обмена

461

Specified
format doesn’t match format of data

Данный формат не совпадает с форматом данных

462

The
remote server machine does not exist or is unavailable

Удаленная машина сервера не существует или недоступна

463

Class not
registered on local machine

Класс не зарегистрирован на локальной машине

480

Can’t create AutoRedraw image

Нельзя создать автоматически восстанавливаемое изображение

481

Invalid picture

Неверный рисунок

482

Printer error

Ошибка принтера

483

Printer driver does not support specified property

Драйвер принтера не поддерживает указанное свойство

484

Problem
getting printer information from the system. Make sure the printer is set up
correctly

Проблема при чтении информации принтером из системы.
Убедитесь, что принтер установлен правильно

485

Invalid
picture type

Неверный тип рисунка

486

Can’t
print form image to this type of printer

Нельзя распечатать изображение формы на принтере такого
типа

520

Can’t empty Clipboard

Нельзя очистить буфер обмена

521

Can’t open Clipboard

Нельзя открыть буфер обмена

735

Can’t save file to TEMP directory

Нельзя сохранить файл в каталоге TEMP

744

Search text not found

Исходный текст не найден

746

Replacements too long

Слишком длинная замена

Номер

Сообщение

Описание

2420

Syntax error in number

Число содержит синтаксическую ошибку

2421

Syntax error in date

Дата содержит синтаксическую ошибку

2422

Syntax error in string

Строка содержит синтаксическую ошибку

2423

Invalid use of ‘.’, ‘!’ or ‘( )’

Неверное использование ‘.’, ‘!’ или ‘( )’

2424

Unknown name

Неизвестное имя

2425

Unknown function name

Неизвестное имя функции

2427

Object has no value

Объект не имеет значения

2428

Invalid arguments used with domain function

Неверные аргументы статистической функции по подмножеству

2431

Syntax error(missing operator)

Синтаксическая ошибка (отсутствует оператор)

2433

Syntax error

Синтаксическая ошибка

2439

Wrong number of arguments used with function

Неверное число аргументов функции

2442

Invalid use of parentheses

Неверное использование скобок

2443

Invalid use of Is operator

Неверное использование оператора Is

2445

Expression too complex

Слишком сложное выражение

2446

Out of memory during calculation

Недостаточно памяти при вычислениях

2448

Can’t set value

Не удается задать значение

3001

Invalid argument

Ошибочный аргумент

3005

<Database name> isn’t a valid database name

Имя базы данных не является допустимым именем базы данных

3006

Database <name> is exclusively locked

Для базы данных <name> установлен монопольный доступ

3007

Can’t open library database <name>

Не удается открыть библиотечную базу данных <name>

3011

The Microsoft Jet database engine could not find the
object <name>. Make sure the object exists and that you spell its name
and the path name correctly

Объект <name> не найден ядром базы данных Microsoft
Jet. Проверьте существование объекта и правильность имени и пути

3012

Object <name> already exists

Объект <name> уже существует

3017

The size of a field is too long

Слишком большая длина поля

3021

No current record

Текущая запись отсутствует

3024

Couldn’t find file <name>

Не удается найти файл <name>

3025

Can’t open any moor

Открытие дополнительных файлов невозможно

3027

Can’t update. Database or object is read-only

Обновление невозможно. База данных или объект доступны
только для чтения

3036

Database has reached maximum size

Достигнут максимальный размер базы данных

3037

Can’t open any more tables or queries

Открытие дополнительных таблиц или запросов невозможно

3042

Out of MS-DOS file handles

Не хватает дескрипторов файлов MS-DOS

3043

Disk or network error

Дисковая или сетевая ошибка

3046

Couldn’t save; currently locked by another user

Сохранение невозможно; блокировка другим пользователем

3056

Couldn’t repair this database

Не удается восстановить эту базу данных

3107

Record(s) can’t be added; no insert permission or
<name>

Записи не могут быть добавлены; отсутствует разрешение на
вставку данных для объекта <name>

3108

Record(s) can’t be edited; no update permission or
<name>

Записи не могут быть изменены; отсутствует разрешение на
обновление данных для объекта <name>

3109

Record(s) can’t be deleted; no delete permission or
<name>

Записи не могут быть удалены; отсутствует разрешение на
удаление данных для объекта <name>

3111

Couldn’t create; no modify design permission for table or
query <name>

Создание невозможно; отсутствует разрешение на изменение
макета для таблицы или запроса <name>

3117

Can’t sort on Memo or OLE Object <clause>

Невозможна сортировка по полю Memo или объекта ActiveX в
<clause>

3116

Can’t join on Memo or OLE Object <name>

Невозможно объединение с полем Memo или объекта ActiveX
<name>

3146

ODBC – call failed

ODBC – ошибка вызова

3154

ODBC – couldn’t find DLL <name>

ODBC – не удается найти DLL <name>

3197

The Microsoft Jet database engine stopped the process
because you and another user are attempting to change the same data at the
same time

Процесс остановлен ядром базы данных Microsoft Jet, так
как другой пользователь пытается одновременно изменить те же данные

3230

Out-of-date Paradox lock file

Устаревший файл блокировок Paradox

3231

ODBC – field would be too long; data truncated

ODBC – слишком большое поле; произошло усечение данных

3232

ODBC – couldn’t create table

ODBC – создание таблицы невозможно

3235

ODBC – data type not supported on server

ODBC – тип данных не поддерживается сервером

3238

ODBC – data out of range

ODBC – данные выходят за пределы допустимого диапазона

3276

Invalid database object reference

Неверная ссылка на объект Database

3322

Crosstab query contains one or more invalid fixed column
headings

Перекрестный запрос содержит один или несколько неверных
заголовков столбцов

3342

Invalid Memo or OLE Object in sub-query<name>

Ошибочное поле Memo или поле объекта ActiveX в подчиненном
запросе <name>

3360

Query is too complex

Слишком сложный запрос

3409

Invalid field name<name> in definition of index or
relationship

Неверное имя поля <name> при определении индекса или
связи

3411

Invalid entry. Can’t perform cascading operation in
table<name> because the value entered is too large for field
<name>

Ошибочное значение. Невозможно выполнить каскадную
операцию в таблице <name>; значение велико для поля <name>

3423

You cannot use ODBC to import from, export to, or link an
external Microsoft Jet or ISAM database table to your database

Не допускается использование ODBC для импорта, экспорта
или присоединения таблицы из внешней базы данных Microsoft Jet или базы
данных ISAM

3424

Can’t create database because the locale is invalid

Создание базы данных невозможно; неверная национальная
настройка

3436

Failure creating file

Ошибка при создании, файла

3462

Failure to load DLL

Сбой при загрузке библиотеки

3506

The Synchronizer is unable to open the Synchronizer log

Синхронизатору не удается открыть журнал

3507

Failure writing to the Synchronizer log

Сбой при записи в журнал синхронизатора

3517

Synchronizer could not find any messages to process

Синхронизатор не может найти сообщение для обработки

3519

Failed to send a message

Сбой при отправке сообщения

3558

Disk I/O error at destination dropbox folder

Ошибка ввода/вывода на диске для результирующего банка
данных

3581

Can’t open replication system table <name> because
the table is already in use

Невозможно открыть системную таблицу репликации
<name>, так как она уже используется

3584

Insufficient memory to complete operation

Не хватает памяти для завершения операции

3586

Syntax
error in partial filter expression

Ошибка синтаксиса в выражении фильтра для таблицы
<name> в частичной реплике

3613

Can’t
create a relationship on linked ODBC tables

Не допускается создание связи между присоединенными
таблицами ODBC

3614

GUID not allowed in Find method criteria expression

Не допускается использование типа GUID в выражениях для
условия поиска в методах Find

3621

Can’t change password on a shared open database

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

3624

Couldn’t read the record; currently locked by another user

Чтение невозможно. Блокировка другим сеансом на данной
машине

3637

Cannot use the crosstab of as a non-fixed column a
subquery

Нельзя использовать составной или нефиксированный столбец
в качестве вторичного запроса

Содержание

  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
Скриншот реквизитов

Источник

Содержание

  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
Скриншот реквизитов

Источник

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

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

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

Типы ошибок

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

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

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

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

  • On Error GoTo <Метка> — при возникновении ошибки управление передается инструкции, помеченной меткой <Метка>. Метка должна быть допустимым идентификатором, к которому предъявляются такие же требования как и к переменным. Внутри подпрограммы метка указывается в самом начале помечаемой строки и после метки ставится двоеточие. В качестве примера создадим функцию для деления двух целых чисел. Внутри функции предусмотрим обработку ошибки деления на 0:
Function Деление(x As Integer, y As Integer) As Double
   On Error GoTo ПриОшибке
   Деление = x / y
   Exit Function
ПриОшибке:
   Деление = 0
End Function

Если при вызове функции во втором параметре передать значение 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. Пример вывода кода и описания ошибки:
Debug.Print Err.Number; Err.Description
  • Source — название текущего проекта;
  • HelpFile — путь к файлу справки;
  • HelpContext — идентификатор раздела в справочном файле;
  • LastDLLError — системный код ошибки при работе с DLL.

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

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

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

Sub ГенерацияОшибки()
   On Error GoTo ПриОшибке
   Err.Raise vbObjectError + 513
   Exit Sub
ПриОшибке:
   Debug.Print Err.Number; Err.Description
   ' -2147220991 Automation error
End Sub

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

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

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

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

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

Option Explicit
...
Dim x As Integer
x = 10
Debug.Print x ' 10

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

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

Dim Массив As Variant, i As Integer, j As Integer
Массив = Array(Array(0, 1), Array(2, 3), Array(4, 5))
For i = 0 To 2
   For j = 0 To 1
      Debug.Print Массив(i)(j)
   Next
Next

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

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

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

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

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

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

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

#If MY_DEBUG Then
   ' Здесь размещаем инструкции вывода значений
#End If

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

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

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

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

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

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

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

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

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

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

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

Dim Результат
Beep
Результат = InputBox("Необходимо ввести значение")

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

Аннотация: В этой лекции вы узнаете, как создавать блоки кода, которые обрабатывают ошибки времени исполнения. Такие ошибки (также называемые исключениями) возникают при нормальных условиях работы – например, из-за отсутствия диска в дисководе или отключенного принтера

В этой лекции вы узнаете, как:

  • исправлять ошибки времени исполнения с помощью нового обработчика ошибок Try…Catch ;
  • проверять конкретные условия возникновения ошибок с помощью оператора Catch When ;
  • использовать свойства Err.Number и Err.Description для определения исключений;
  • создавать вложенные операторы Try…Catch ;
  • использовать обработчики ошибок в комбинации с защитными техниками программирования;
  • досрочно выходить из обработчиков ошибок с помощью оператора Exit Try.

В
«Отладка программ на Visual Basic .NET»
вы узнали, как распознавать в программах на Microsoft Visual Basic .NET ошибки времени исполнения, и как с помощью инструментов для отладки Microsoft Visual Studio .NET обнаружить в коде программы логические ошибки и другие дефекты. В этой лекции вы узнаете, как создавать блоки кода, которые обрабатывают ошибки времени исполнения. Такие ошибки (также называемые исключениями ) возникают при нормальных условиях работы — например, из-за отсутствия диска в дисководе или отключенного принтера. Блоки кода, обрабатывающие такие ошибки, называются структурными обработчиками ошибок (или структурными обработчиками исключений). Вы можете использовать их для распознавания ошибок времени исполнения при их возникновении в программе, подавления нежелательных сообщений об ошибках и настройки программы так, что она снова сможет получить управление и продолжить работу.

Visual Basic .NET включает блок Try…Catch — новую синтаксическую конструкцию для обработки ошибок. В этой лекции вы узнаете, как с помощью блоков кода Try…Catch перехватывать ошибки времени исполнения и как использовать свойства Err.Number и Err.Description для идентификации конкретных ошибок времени исполнения. Вы также узнаете, как для написания более гибких обработчиков ошибок использовать множественные операторы Catch, создавать вложенные блоки кода Try…Catch и использовать оператор Exit Try для досрочного выхода из блока кода Try…Catch. Техники программирования, о которых вы узнаете, аналогичны синтаксису On Error Goto из предыдущих версий Visual Basic, а структурные обработчики ошибок в настоящий момент предоставляются также языками программирования Java и C++. Наиболее надежные программы на Visual Basic используют несколько обработчиков ошибок для анализа непредвиденных обстоятельств и предоставления пользователям удобной и бесперебойной работы.

Что нового в Visual Basic .NET?

  • Блок кода Try…Catch — это новый способ написания структурных обработчиков ошибок. Хотя вы можете по-прежнему использовать ключевые слова Visual Basic 6, включая On Error Goto, Resume и Resume Next, запись Try…Catch дает возможность избежать потенциальных сложностей конструкций Goto и предлагает очень эффективный способ управления ошибками времени исполнения.
  • Оператор Catch When позволяет проверять конкретные условия программы и обрабатывать в одном блоке кода Try…Catch несколько ошибок времени исполнения.
  • Оператор Exit Try предлагает новый способ выхода из структурных обработчиков ошибок.
  • Visual Basic .NET продолжает предоставлять свойства Err.Number и Err.Description для идентификации ошибок времени исполнения. В дополнение к этому можно использовать новый метод Err.GetException, который возвращает информацию об условии возникновения ошибки, которая привела к остановке выполнения программы.

Обработка ошибок с помощью Try … Catch

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

К счастью, вы не обязаны мириться со случайными ошибками, которые приводят вашу программу к обрушению. Можно написать специальные процедуры Visual Basic, называемые структурными обработчиками ошибок, которые будут реагировать на ошибки времени исполнения. Обработчик ошибок отслеживает ошибку времени исполнения и говорит программе, как продолжать работу при возникновении этой ошибки. Обработчики ошибок помещаются в процедуры событий, там, где существует возможность возникновения проблемы, или в общие функции или подпрограммы, специально предназначенные для обработки ошибок. (Подробности о написании функций и подпрограмм см. в
«Использование модулей и процедур»
.) Как предполагает их название, обработчики ошибок обрабатывают ошибку с помощью оператора Try…Catch и специального объекта отслеживания ошибок, который называется Err. У объекта Err есть свойство Number, которое идентифицирует номер ошибки, и свойство Description, в котором содержится описание этой ошибки. Например, если ошибка времени исполнения произошла при загрузке файла с диска, обработчик ошибок может отобразить собственное сообщение об ошибке, которое укажет на проблему, и запретить дисковые операции до тех пор, пока эта проблема не будет устранена пользователем.

Когда использовать обработчики ошибок

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

Установка ловушки: оператор Try … Catch

Блок кода, используемый для обработки ошибки времени исполнения, называется Try…Catch. Вы помещаете оператор Try в процедуре события непосредственно перед оператором, о котором вы беспокоитесь, а оператор Catch следует непосредственно за ним и содержит операторы, которые вы хотите выполнить, если произойдет ошибка времени исполнения. Также можно использовать некоторые дополнительные операторы, такие, как Catch When, Finally, Exit Try, а также вложенные блоки кода Try…Catch, которые демонстрируется в этой лекции. Базовый синтаксис обработчика исключений Try…Catch показан здесь.

Оператор Try указывает на начало обработчика ошибок

Try
  Операторы, которые могут вызвать ошибку времени исполнения
Catch
  Операторы, которые выполняются, если ошибка времени исполнения происходит
Finally
  Дополнительные операторы, выполняемые независимо от возникновения ошибки
End Try

где Try, Catch и End Try — это обязательные ключевые слова, а Finally и операторы, которые стоят за ним, необязательны. Заметьте, что программисты иногда называют операторы, находящиеся между ключевыми словами Try и Catch защищенным кодом, так как любые ошибки времени исполнения, возникающие в этих операторах, не приведут к обрушению программы. (Вместо этого Visual Basic выполняет операторы обработки ошибок, расположенные в блоке кода Catch.)

Ошибки путей и дисководов

В следующем примере продемонстрирована обычная ситуация возникновения ошибки времени исполнения — проблема с путем или дисководом. Чтобы выполнить это упражнение, загрузите пример проекта Visual Basic, который я создал для того, чтобы показать, как графические файлы открываются в объекте вывода изображений на форме Windows. Чтобы подготовиться к этому упражнению, вставьте дискету в дисковод A и скопируйте на него файл Fileopen.bmp. (Копию этого файла, а также проект Disk Drive Error, можно найти в папке c:vbnet03sbsГл.9disk drive error.) Вы будете использовать этот диск на протяжении всей лекции, чтобы сгенерировать ошибки времени исполнения и восстанавливаться после них.

Студворк — интернет-сервис помощи студентам

Здравствуйте! При выполнение макроса в LibreOffice Calc возникает ошибка:

Ошибка времени выполнения Basic. Свойство или метод не найдены: sheet.

Совершенно не понимаю в чем проблема. Буду крайне признателен, если намекнете, почему данная функция не работает.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Function test(list as string, a1 as string, c1 as string) as Double 
    dim suma,sumc,sumaqw as double
    dim sheet as object
    dim doc,cellsc,cellsa as Object 
    doc = StarDesktop.CurrentComponent 
    sheet = StarDesktop.CurrentComponent
    cellsc = doc.sheet.getbyname(list).GetCellRangeByName(c1) 
    cellsa = doc.sheet.getbyname(list).GetCellRangeByName(a1)
    sumaqw = sumqw(cellsa)
    suma = cellsa.computeFunction(com.sun.star.sheet.GeneralFunction.SUM) 
    sumc = cellsc.computeFunction(com.sun.star.sheet.GeneralFunction.SUM) 
    test = (2*suma+sumc)/((1+suma)*(1+sumaqw))
end function

  • Ошибка времени выполнения basic подпрограмма или функция не определена
  • Ошибка времени выполнения basic 449 аргумент является обязательным
  • Ошибка времени выполнения basic 13 несовместимые типы
  • Ошибка времени выполнения bad typed file size
  • Ошибка времени виндовс 7 какое обновление