- •Основы офисного программирования и язык vba
- •Офисное программирование
- •Состав Office 2000
- •Инсталляция Office 2000
- •Содержимое диска "Resource Kit"
- •Документ Issues
- •Документ ork9
- •Папка Tools
- •Содержимое диска "Language Pack"
- •Об этой книге и ...
- •Моя благодарность
- •Vba и объекты. Обзор
- •Библиотека объектов Office 2000 - каркас приложений
- •Встраивание вместо наследования
- •Построение каркаса документа
- •Библиотека объектов Office 2000 и Object Browser
- •Объекты Application
- •Свойства-участники
- •Вторая группа терминальных свойств
- •Методы объектов Application
- •События объектов Application
- •Совместная работа приложений. Создание объектов Application. Раннее и позднее связывание
- •Коллекции в Office 2000
- •Коллекции объектов Office 2000
- •Коллекции Excel: Workbooks, Sheets
- •Коллекция Workbooks
- •Коллекция Sheets
- •Коллекции Word: Documents, Paragraphs и другие
- •Коллекция Documents
- •Коллекция Paragraphs
- •Коллекция Sections
- •Коллекции Characters, Words, Sentences
- •Коллекции и конструкция For Each … Next
- •Объекты Range
- •Что определяет объект Range?
- •Метод Range
- •Объекты Selection
- •Метод Select и свойство Selection
- •Активные объекты и метод Activate
- •Проектирование документов
- •Документ и его программный проект
- •Модули - обработчики событий
- •Стандартные модули
- •Модули классов
- •Модуль макросов
- •Структура модуля. Окно проекта и Окно кода
- •Окно проекта
- •Свойства проекта
- •Имя проекта
- •Защита проекта
- •Окно кода
- •Еще раз о "переиспользовании" модулей
- •Проект и область видимости
- •Система документов и ее проект
- •Организация системы документов
- •Как организуются ссылки между проектами
- •Обмен информацией между документами
- •Система документов One - Two - Three
- •Типы данных
- •Простые типы данных.
- •Объявление переменных и констант простых типов
- •Синтаксис объявления простых переменных
- •Объявления по умолчанию
- •Константы
- •Массивы
- •Динамические массивы
- •Записи и тип, определенный программистом
- •Что можно делать с записями?
- •Раздел объявлений
- •Раздел опций
- •Разделы констант, типов и переменных
- •Раздел Declare
- •Правила именования
- •Типы и классы Еще раз о понятии "класс"
- •Что нового в классах "Office 2000"
- •Создание класса "Личность"
- •Объекты и переменные
- •Объекты, класс которых определен пользователем.
- •Объекты "родного" приложения
- •ActiveX-объекты
- •Модуль класса Свойства
- •Сокрытие свойств
- •Конструкторы и деструкторы. Стандартные события
- •Стандартные события Initialize и Terminate
- •Два конструктора класса Rational
- •Процедуры - свойства
- •Как создаются процедуры- свойства
- •Синтаксис Let, Get и Set
- •Классы, как упаковка
- •Семейство классов и процедуры - свойства
- •Friend методы
- •События
- •Классы, объекты With Events и обработчики событий
- •Модуль класса с объектом WithEvents
- •Объект WithEvents
- •События собственных классов
- •Как создать класс с событиями
- •Как зажигаются события
- •Где и как следует создавать обработчики событий для экземпляров класса
- •Связывание объектов
- •Реальные объекты и инициирование событий
- •Семейство классов и реализация интерфейсов
- •Наследование
- •Виртуальные методы и полиморфизм
- •Абстрактные классы
- •Наследование и полиморфизм в Office 2000
- •Наследование интерфейсов
- •Полиморфизм семейства классов
- •Проект "Люди и Машины"
Синтаксис объявления простых переменных
Объявление простых переменных имеет следующий синтаксис:
{Dim | Private | Public | Static }<имя переменной> [ As <имя типа>]
[, <имя переменной> [ As <имя типа>]]…
Вначале идет имя оператора, а потом список объявлений переменных, где роль разделителя играет запятая. Каждое объявление связывает имя переменной с ее типом, заданным конструкцией As. Будьте внимательны, VBA неприятно отличается в этом вопросе от других языков программирования. Здесь, как обычно, одним оператором можно объявить произвольное число переменных, но следует в каждом объявлении указывать конструкцию As, иначе переменным без As будет приписан тип Variant. На наш взгляд, то, что одним As нельзя объявить список переменных одного типа, - некий синтаксический "прокол", приводящий, если не к серьезным ошибкам, то к излишнему и не предполагаемому употреблению типа Variant.
Заметьте, есть и приятное отклонение, - имена переменных в VBA можно задать, используя русский алфавит.
Приведем пример, где действуют модули Father и Mother, в каждом из которых объявлены глобальные (общие и закрытые) переменные. В каждом из модулей объявлены две процедуры, взаимно вызывающие друг друга. Отладочная печать в процедурах позволит проследить за изменением значений глобальных, локальных и статических переменных. Вот тексты модулей Father и Mother - объявления глобальных переменных и процедур:
'Option Explicit
Public Fx As Byte, Fz As Integer
Private Fy As Integer
Public Sub Start()
'Инициализация глобальных переменных
Fx = 10: Fy = 11: Fz = 12
Mx = 20: My = 21: Mz = 22
Father1
End Sub
Public Sub Father1()
Dim Fz As Byte 'Локальная переменная
Fx = Fx + 2
Fy = Mx - 2
Fz = 1
Debug.Print "Father1: Fx=", Fx, " Fy =", Fy, "Fz =", Fz
'Вызов процедуры другого модуля
Mother1
End Sub
Здесь мы приводим тексты модуля Mother:
'Option Explicit
Public Mx As Byte
Private My As Integer
Public Sub Mother1()
'Объявление статической переменной
Static Count As Byte
Count = Count + 1
Mx = Mx - 2: Fz = My + 2
Debug.Print "Mother: Статическая переменная Count =", Count
'Вызов процедуры Father другого модуля или заключительной - Finish
If Fx < Mx Then Father1 Else Finish
End Sub
Public Sub Finish()
'Заключительная печать
Debug.Print "Finish: Fx = ", Fx, "Fy =", Fy, "Fz =", Fz
Debug.Print "Mx =", Mx, "My =", My, "Mz =", Mz
'Объявления разных типов и печать значений, полученных при объявлении
Dim B As Byte, I As Integer, L As Long
Dim Sng As Single, D As Double, C As Currency
Dim SF As String * 7, SV As String, Dat As Date
Dim O As Object, V
Debug.Print "B =", B, "I=", I, "L=", L
Debug.Print "Sng =", Sng, "D =", D; "C=", C
Debug.Print "SF =", SF, "SV =", SV, "Dat=", Dat
If O Is Nothing Then Debug.Print "Объект не определен"
If V = Empty Then Debug.Print "Variant переменные не инициализированы"
End Sub
Пример 3.1. (html, txt)
Запустив процедуру Start модуля Father, мы получили такие результаты отладочной печати:
Father1: Fx= 12 Fy = 18 Fz = 1
Mother: Статическая переменная Count = 1
Father1: Fx= 14 Fy = 16 Fz = 1
Mother: Статическая переменная Count = 2
Father1: Fx= 16 Fy = 14 Fz = 1
Mother: Статическая переменная Count = 3
Finish: Fx =16 Fy = Fz = 2
Mx = 14 My = 0 Mz =
B = 0 I= 0 L= 0
Sng = 0 D = 0 C= 0
SF = SV = Dat= 0:00:00
Объект не определен
Variant переменные не инициализированы
Дадим краткий комментарий:
-
Процедуры Father и Mother трижды взаимно вызывают друг друга. Статическая переменная Count подсчитывает число сделанных обращений.
-
Процедура Father печатает значения глобальных переменных Fx, Fy и локальной переменной Fz. Заметьте, локальное объявление "сильнее" глобального.
-
Процедура Finish печатает заключительные значения переменных Fx, Fy, Fz, Mx, My и Mz. Здесь печатается значение глобальной переменной Fz, а значения двух переменных - Fy и Mz - не определены. Дело в том, что Fy - закрытая переменная модуля Father, а Mz вообще не объявлялась. И все же ошибки не возникает, так как действуют объявления по умолчанию и обе эти переменные считаются объявленными в модуле Mother и по умолчанию имеют тип Variant. Именно здесь кроется причина возможных ошибок, во избежание которых мы и советовали включить оператор Option Excplicit. Будь это сделано, - появились бы предупреждающие сообщения. У нас эти опции написаны, но специально закомментированы для демонстрации эффекта их отсутствия. Если их включить, то ошибка сразу встретится в процедуре Start -- ведь переменные My и Mz не определены в модуле Father.
-
Вторая часть процедуры Finish носит самостоятельный характер, - она демонстрирует объявления всех простых типов и печать значений, получаемых переменными при объявлении. Заметьте, как проверяется неопределенность объекта и пустота значений переменных.