Категории
Самые читаемые
RUSBOOK.SU » Компьютеры и Интернет » Программы » Excel. Трюки и эффекты - Алексей Гладкий

Excel. Трюки и эффекты - Алексей Гладкий

Читать онлайн Excel. Трюки и эффекты - Алексей Гладкий

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 5 6 7 8 9 10 11 12 13 14
Перейти на страницу:

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

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

Перехват ошибок

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

On Error GoTo Метка

On Error Resume Next

On Error GoTo 0

Первый вариант инструкции On Error активизирует обработчик ошибок (см. подраздел об обработке перехваченных ошибок). При возникновении ошибки после этой инструкции выполнение программы продолжается с метки Метка.

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

Третий вариант инструкции On Error отключает перехват ошибок обработчиком, находящимся в выполняемой процедуре или функции.

Обработка перехваченных ошибок

Если в программе используется инструкция вида On Error GoTo Метка, то при возникновении ошибки после этой инструкции выполнение программы продолжается с метки Метка. Программный код, который начинается с данной метки и заканчивается (обычно, но не всегда и не обязательно) инструкцией Resume, называется обработчиком ошибок. В обработчике ошибок программист помещает действия, которые либо исправляют ошибку, либо информируют о ней пользователя. В конец обработчика ошибок обычно помещается один из вариантов инструкции Resume:

Resume [0]

Resume Next

Resume Метка

При использовании Resume [0] выполнение программы продолжается с той инструкции, в которой произошла ошибка. Если использовать вариант Resume Next, то выполнение программы продолжается со следующей инструкции после той, в которой произошла ошибка. Использование же варианта Resume Метка позволяет продолжить выполнение программы с указанной после Resume метки.

При обработке ошибок важно знать, что в распоряжении программиста всегда имеется глобальная ссылка с именем Err на объект ErrObject. Этот объект хранит подробную информацию о возникшей ошибке (номер ошибки, текст сообщения об ошибке и т. д.). В обработчике эту ссылку можно использовать для уточнения типа, источника ошибки, а также для получения других сведений.

Ниже приведен пример функции с обработчиком ошибок (она пытается записать текст в файл на гибком диске А:):

Function dhWriteToFloppy(strText As String) As Boolean

' Включение обработчика ошибок

On Error GoTo ErrHandler

' Выполнение операций с дискетой

Open «A:Text.txt» For Output As 1

Write #1, strText

Close 1

' Действия выполнены успешно

dhWriteToFloppy = True

ExitFunc:

' Выход из функции до обработчика ошибок

Exit Function

ErrHandler:

' Закрытие файла, если его все-таки удалось открыть

Close 1

Dim strErrMessage As String

' Идентификация ошибки и формирование текста сообщения

Select Case Err.Number

Case 71

strErrMessage = «Нет диска в дисководе»

Case 70

strErrMessage = «Диск защищен от записи»

Case 61

strErrMessage = «Нет места на диске»

Case Else

strErrMessage = Err.Description

End Select

' Отображение сообщения об ошибке

MsgBox strErrMessage, vbExclamation, «Ошибка»

' Продолжение выполнения программы

dhWriteToFloppy = False

Resume ExitFunc

End Function

Если запись удается, то функция возвращает значение True. Если возникает ошибка, то выдается соответствующее сообщение, после чего функция возвращает значение False. На примере функции dhWriteToFloppy следует заметить, что при нормальном выполнении программы (без возникновения ошибок) обработчик ошибок выполняться не должен, что достигается выходом из функции до обработчика с помощью инструкции Exit Function.

Классы в VBA

Язык программирования VBA является объектно-ориентированным, хотя и не поддерживает наследование и полиморфизм. VBA-программист может работать с встроенными классами, а также создавать и использовать свои собственные классы.

Создание класса на VBA

Создание класса на VBA отличается от других языков программирования (таких как C++), в которых описание классов во многом аналогично описанию структур.

В VBA для каждого класса в проект должен быть добавлен отдельный модуль, в который помещается код, реализующий работу класса, – модуль класса. Добавление нового модуля класса осуществляется с помощью команды меню Insert → Class Module (Вставить → Модуль класса) редактора Visual Basic. Имя модулю класса присваивается с помощью окна Properties (Свойства), которое показано на рис. 1.3.

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

Рис. 1.3. Назначение имени классу

Свойства класса

Свойства для классов в VBA могут быть реализованы двумя способами. Первый способ – это использование в модуле класса общих переменных-членов (объявленных с атрибутом Public). Добавим таким способом свойство в созданный ранее класс Class1, в котором будет храниться строка с описанием данных, содержащихся в объекте-экземпляре этого класса:

Public strTag As String

Такой способ реализации свойств является самым простым, однако в нем не предусмотрена возможность контролировать правильность задания параметра и осуществлять какие-либо действия при изменении его значения. Для решения этой проблемы можно использовать второй способ – создание процедур и функций, которые выполняются при установке и получении значений свойств соответственно. Для этих целей в модуле класса применяются обычные объявления процедур и функций, в которых используется ключевое слово Property.

Для получения значения свойства предназначена функция, объявленная с использованием Property Get:

[Public | Private] [Static] Property Get Имя_свойства ([Аргументы]) _

[As Имя_типа]

[Инструкции]

[Имя_свойства = Выражение]

[Exit Property]

[Инструкции]

[Имя_свойства = Выражение]

End Property

Для присвоения значения свойству, не являющемуся ссылкой на объект, предназначена процедура, объявленная с использованием Property Let:

[Public | Private] [Static] Property Let Имя_свойства ([Аргументы,]Значение)

[Инструкции]

[Exit Property]

[Инструкции]

End Property

Для присвоения значения свойству, являющемуся ссылкой на объект, предназначена процедура, объявленная с использованием Property Set:

[Public | Private] [Static] Property Set Имя_свойства ([Аргументы,]Значение)

[Инструкции]

[Exit Property]

[Инструкции]

End Property

Использование процедур и функций с ключевым словом Property очень удобно для создания свойств только для чтения (для этого свойства не реализуются Property Let и Property Set) и свойств только для записи (не реализуется Property Get).

Разберем реализацию свойств ObjectRef и ObjectType для рассматриваемого класса Class1 (частная переменная-член objRef используется для хранения установленной ссылки на объект):

Private objRef As Object

Property Set ObjectRef(objNewRef As Object)

' Задание ссылки хранимого объекта

Set objRef = objNewRef

End Property

Property Get ObjectRef() As Object

' Возврат ссылки на хранимый объект

Set ObjectRef = objRef

End Property

Property Get ObjectType() As String

' Возврат имени типа хранимого объекта

ObjectType = TypeName(objRef)

End Property

Методы класса

Любая функция или процедура, описанная в модуле класса, является методом этого класса. Методы делятся на общие (описаны с использованием Public) и частные (описаны с использованием Private).

Ниже приведена реализация метода для созданного нами класса Class1, при обращении к которому на экран выводится сообщение со значениями атрибутов класса:

Sub ShowInfo()

' Отображение окна со значением свойства strTag и именем типа _

объекта, на который хранится ссылка

MsgBox "strTag = " & strTag & vbCrLf & _

"Object type = " & ObjectType

End Sub

Использование класса в программе

Как было сказано в начале главы, операции со всеми объектами VBA осуществляет только с использованием ссылок. Объявление ссылок на объекты было рассмотрено в разделе, посвященном переменным в VBA. Здесь будет рассмотрено лишь применение объекта созданного ранее класса Class1. Для создания ссылки на объект можно использовать следующее объявление:

Dim obj As Class1

После создания ссылки сам объект создается с помощью инструкции Set:

1 ... 5 6 7 8 9 10 11 12 13 14
Перейти на страницу:
На этой странице вы можете бесплатно скачать Excel. Трюки и эффекты - Алексей Гладкий торрент бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Сергій
Сергій 25.01.2024 - 17:17
"Убийство миссис Спэнлоу" от Агаты Кристи – это великолепный детектив, который завораживает с первой страницы и держит в напряжении до последнего момента. Кристи, как всегда, мастерски строит