7 3. Объекты, их свойства, события и методы Теперь наступила пора познакомиться с объектами, событиями, свойствами и методами VBA. К объектам в первую очередь можно отнести те элементы различных приложений, которыми Вы пользуетесь при работе на компьютере. Это хорошо известные Вам кнопки, полосы прокрутки, различные иконки, строки в меню. Объектами также являются окна, которые Вы располагаете на рабочем столе. Всякий раз, когда Вы, перемещая курсор мышки на объект, делаете щелчок одной из клавиш, Вы создаете событие. К событиям также относится нажатие клавиши или комбинации клавиш. Событие возникает и в тот момент, когда открывается или закрывается какое-нибудь окно. Во время этих событий и могут срабатывать те программы или процедуры, которые Вы запишете в виде команд. Таким образом Ваши процедуры должны быть связаны с какими –либо событиями, в свою очередь связанными с различными объектами. Иногда процедуры размещают в отдельных модулях и вызывают определенными командами. Совокупность процедур, предназначенных для выполнения какой-либо определенной задачи, объединяется в проект. Большинство программ или проектов условно состоят из трех этапов – ввод данных, их обработка и вывод полученных результатов. Для ввода данных в большинстве языков программирования существуют свои объекты и команды. Преимуществом VBA, как языка программирования является то, что в качестве источника данных могут быть использованы ячейки электронной таблицы Excel или фрагменты текста документа в Worde. Поэтому мы сначала (это просто необходимо для дальнейшей работы) познакомимся с таким важным объектом как Range. В ЭТ смысл этого объекта – диапазоны ячеек, в текстовом документе – фрагмент текста. Сейчас поговорим подробнее о диапазоне ячеек. В программе ячейки того или иного диапазона могут быть обозначены несколькими вариантами через прямую адресацию: Range (“A1:B3”), через имя диапазона Range(“itogi”), через стандартный выделенный программно или вручную Range-объект: ActiveCell или Selection. через объект Cells(номер строки, номер столбца). Ячейки, помимо того, что могут содержать различные данные, имеют различные свойства, которые можно менять непосредственно на рабочем листе, предварительно выделив диапазон ячеек. Например, можно менять размеры ячеек, шрифт внутри, фон, можно выделив одну ячейку, удалить всю строку или весь столбец, также можно произвести автозаполнение и т.д. В режиме программы также можно обратиться к свойствам объекта Range, определить или поменять их значения, написав соответствующие процедуры, а также применить различные методы. Познакомьтесь с примерами. Строка в программе Cells(3,6)=23 означает, что ячейке расположенной в 3-ей строке и в 6ом столбце, нужно присвоить значение 23. Но, если мы напишем Range(“B3:F10”).Cells(3,6)=23, то число 23 появится в третьей строке и шестом столбце, которые нужно будет отсчитывать от ячейки В3. Строка Range(“D5”).EntireRow.Delete означает, что необходимо удалить всю 5-ю строку, в которой находится ячейка D5. В данном случае команда содержит указание на объект (строку) и метод (Delete), который должен быть применен к этому объекту. Все рассмотренные команды будут применены к ячейкам того листа, для которого записаны процедуры с этими командами. Мы имеем возможность обращаться к ячейкам, расположенным на любом листе рабочей книги. В этом случае необходимо предварительно указывать конкретный рабочий лист. Например, выполнение команды Worksheets(3).Range(“A5:A10”).Clear. приведет к очистке содержимого ячеек указанного диапазона, расположенных на третьем листе рабочей книги. Итак, если мы хотим применить метод к какому либо объекту, то команда должна выглядеть в общем виде следующим образом: 8 3.1. Имя объекта. Метод Для каждого объекта существуют свои методы и сведения о них можно найти в справочной системе VBA. Если мы в программе захотим поменять какие-нибудь свойства объектов, то нужно помнить, что свойство имеет какое-то определенное значение (красный фон ячейки, размер шрифта – 12, числовое значение в ячейке -23). Чтобы задать значение свойства какого-либо объекта, то необходимо использовать код в следующей форме: Имя объекта. Свойство Значение свойства Для записи в переменную значения какого-либо свойства код должен выглядеть так: Имя переменной = Имя объекта. Свойство 3.2. Правила для создания имен следующие: Длина имен не должна превышать 256 символов. В имени можно использовать любую комбинацию букв, цифр и символов, но оно должно начинаться с буквы. Настоятельно рекомендуем применять латинские символы и не использовать кириллицу. Имена не должны включать точек, пробелов и следующих символов: % & ! # @ $ Имена должны быть уникальны внутри области, в которой они определены. Изменение имени крайне нежелательно, так как это приводит к необходимости проверять весь проект на корректность при ссылках на это имя Регистр букв в именах не имеет значения. Это означает, что имя, написанное заглавными буквами, и то же имя, написанное строчными буквами, являются эквивалентными. Чтобы исключить путаницу, все одинаковые, но написанные в разном регистре имена автоматически приводятся к одному образцу. Имя должно быть таким, чтобы нести в себе полезную дополнительную информацию о типе и назначении объекта 4. Стандартные элементы управления К важным объектам VBA относятся элементы управления. Они необходимы для организации работы с приложениями, для запуска различных процедур, получения или передачи информации и так далее. Стандартные элементы управления можно применить, используя панель элементов управления. Для дальнейшей работы Вам необходимо открыть чистую рабочую книгу в электронной таблице и все дальнейшие действия производить на «Листе1». Итак, выполним следующие действия. Командная кнопка CommandButton – основное назначение объекта состоит в реагировании на щелчок мыши и вызов процедуры, обрабатывающей это событие. Рисунок Image – служит для размещения рисунка, загружаемого из графического файла. Особые свойства: PictureAlignment – определяет режим выравнивания рисунка в границах объекта, PictureCizeMode – определяет режим согласования размеров рисунка и размеров элемента управления, PictureTiling – разрешает размножение рисунка по всей поверхности объекта, если размер рисунка меньше размеров объекта, SpecialEffect – Определяет вид самого элемента управления. Поле списка ListBox –служит для представления данных в форме развертывающегося списка. Позволяет пользователю выбрать один или несколько элементов из списка. Особые свойства: ColumnCount – задает количество столбцов в списке, ListCount – возвращает число элементов списка, 9 ListStyle – определяет вид элементов списка, MultiSelect – разрешает или запрещает выделение нескольких элементов списка одновременно, TextColumn – определяет номер столбца, для которого элемент выделенной строки будет отображаться в текстовом поле. Поле TextBox – предназначено для ввода текста пользователем. Особые свойства: Text – содержит в себе текст, введенный в поле, LinkedCell – указывает на ячейку в рабочем листе, которая повторяет свойство Text, указывает на ячейку, связанную с этим объектом, TextAlign – способ выравнивания текста в окне. Полоса прокрутки ScrollBar – предназначена для ввода числовых значений без помощи клавиатуры. Особые свойства: Min, Max – соответственно минимальное и максимальное числовое значение диапазона вводимых значений, Value – числовое зачение, которое хранит элемент управления. Кнопка – счетчик SpinButton - подобно полосе прокрутки позволяет вводить числовые значения без помощи клавиатуры. Кнопка выключатель ToggleButton – кнопка, после щелчка на которой, остается нажатой до очередного щелчка. Состояние кнопки отражается в свойстве Value со значениями «True» или «False» Переключатель OptionButton – обеспечивает выбор одного элемента из нескольких. Для объединения нескольких элементов в одну группу необходимо их свойству GroupName присвоит одинаковое значение. Флажок CheckBox – элемент, который моет иметь два значения – «True» или «False». Таблица 1. Общие свойства элементов управления Название Пояснения Name Имя объекта BackColor Определяет цвет фона BorderColor Определяет цвет линий или рамки объекта Caption Сообщение на объекте Enabled Разрешает или запрещает объекту реагировать на действия пользователя Font Содержит в себе объект Font, чьи свойства определяют различные параметры шрифта ForeColor Цвет переднего плана объекта Picture Определяет название файла, содержащего рисунок, который может быть расположен на поверхности объекта Value Возвращает значение, содержащееся в объекте1 Visible Делает объект видимым или невидимым Height Высота объекта Width Ширина объекта Left Расстояние от левой границы листа до объекта Top Расстояние от верхней границы листа до объекта 1 Тип этого свойства зависит от типа объекта 10 4.1. Упражнение 2 1. Вызовите через команды Вид/ Панели инструментов/ Элементы управления панель элементов управления (в дальнейшем ПЭУ), а в этой панели вызовите окно свойств. В окне свойств Вы увидите перечень свойств рабочего листа, в котором Вы находитесь, но нас пока будут интересовать именно элементы управления. 2. Найдите на ПЭУ кнопку с буквой А и с подсказкой «Надпись», щелкните по ней и когда курсор примет вид крестика расположите этот элемент на рабочем листе. В принципе Вы должны выполнить те же действия, что и при расположении на листе линий, кругов, квадратов и других объектов рисования. Еще раз: Удаление, изменение размеров элементов управления производятся теми же приемами, что и для объектов рисования. Как только вы расположили элемент управления на рабочем листе, он будет выделен, а окно свойств будет содержать список и значения свойств именно этого элемента управления. Познакомимся подробнее с элементом управления «Надпись», в качестве примера. Его официальное название Label (Это видно в верхней строке окна свойств), а имя элемента управления - Label1. Обращаем Ваше внимание на различие между названием и именем. Имя можно будет менять (но только в начале работы над проектом, пока еще не перешли к написанию кода). Далее идет целый перечень различных свойств этого элемента. Эти свойства могут иметь либо числовое значение, либо «True» или «False» ( соответственно «Да» или «Нет»), либо текстовое, или содержать имя файла изображением, которое необходимо поместить на этот элемент управления. Можно, поместив курсор в правую колонку окна свойств, изменить некоторые свойства этого элемента. В частности, попробуйте поменять содержание свойства Caption. Это свойство отображает тот текст, который будет находиться на этом элементе управления. И опять важное замечание – нельзя путать свойство Name («Имя») со свойством Caption («Сообщение»). Имя каждого объекта уникально, присваивается один раз по определенным правилам, и в дальнейшем не изменяется, в то время как сообщение, которое может содержать этот элемент может меняться в процессе выполнения программы. Продолжим наше упражнение (элемент управления должен быть выделен). 3. Расположите курсор в правом столбике окна свойств в строке Name и наберите любое имя в соответствии с правилами. Переместив курсор из этой строки в любую другую, убедитесь, что в самой верхней строке окна свойств появилось имя, созданное Вами. 4. Теперь расположите курсор в строке Caption и наберите любой текст. Как только курсор покинет строчку с набранным текстом, Вы увидите набранное Вами сообщение на элементе управления. Вы сейчас меняете свойства элемента управления, работая в режиме конструктора, и даже еще не приступали к процессу написания кода. Таблица 1 содержит свойства, практически общие для всех элементов управления. И теперь давайте завершим упражнение. 5. Используя таблицу 1 попробуйте поменять другие свойства элемента Label Элемент Label – самый простой элемент и чаще всего предназначается именно для вывода сообщений и размещения картинок в процессе выполнения программы. Перечислим другие стандартные элементы и при этом отметим, что со всеми этими элементами Вы уже встречались, работая с офисными приложениями. 11 5. Структура проекта на языке VBA. Напомним, что согласно смыслу объектно-ориентированного программирования программа состоит из ряда процедур, которые располагаются в отдельных модулях или связаны с определенными объектами. Сначала остановимся на процедурах, связанных с объектами, а именно с элементами управления. Особенность этих процедур заключается в том, что они начинают выполняться после какого – либо события, совершенного пользователем. В таблице 2 перечислены наиболее распространенные события, которые могут быть использованы для запуска процедур. Таблица 2. Наиболее распространенные события Название Пояснения Activate Change Click DblClick Deactivate GotFocus Initialize KeyDown KeyPress KeyUp Load LostFocus MouseDown MouseMove MouseUp Paint Resize Unload Активизация объекта Изменение на объекте Щелчок по объекту Двойной щелчок Деактивизация объекта Получение фокуса Инициализация Клавиша вниз Клавиша нажата Клавиша вверх Загрузка Потеря фокуса Движение клавиши мыши вниз Движение мыши. Движение клавиши мыши вверх Закраска объекта Изменение размера объекта Выгрузка объекта из приложения Замети, что для различных элементов управления в среде VBA реализованы разные события. Это обусловлено рядом причин, в частности, назначением самого элемента управления, его местом в иерархии объектов и т.д. Как мы уже отмечали, другие процедуры могут быть размещены в модулях и выполняться при их вызове. В целом структура программы на VBA имеет следующий вид. Код VBA хранится в проектах. Проекты в свою очередь содержат модули, а модули включают процедуры. Формально можно описать структуру компонентов следующим образом: Проекты являются совокупностью модулей. Проект может содержать как стандартные модули, так и модули класса. Модули являются совокупностью процедур, описаний и инструкций, Каждое приложение имеет собственный способ хранения проектов: Word сохраняет проекты в шаблонах документа (DOT) и в документах (DOC), Excel – в рабочих книгах (XLS), Access – в файлах базы данных (MDB), PowerPoint – в презентациях (РРТ). Проект может включать несколько модулей. Имеются два типа модулей – стандартные модули и модули класса. Стандартные модули — это модули, в которых можно описать доступные во всем проекте процедуры Sub и Function. 12 Модули класса содержат описание объекта, который является членом класса. Примерами объектов класса являются формы и отчеты. Процедуры, описанные в модуле класса, используются только в этом модуле. 5.1. Создание процедур. Наступила пора самостоятельно написать процедуру, но прежде чем мы это сделаем, необходимо разобраться с типами процедур. Процедура Sub — набор команд, с помощью которого можно решить определенную задачу. При ее запуске выполняются команды процедуры, а затем управление передается в приложение или процедуру, которая вызвала процедуру Sub. Большую часть кода VBA, составляют процедуры именно этого типа. Любой макрос или другой код VBA, который просто выполняет определенный набор действий, используя приложения Office, также является процедурой Sub. Процедура Function (или функция) также представляет собой набор команд, который решает определенную задачу. Различие заключается в том, что функция обязательно возвращают определенное значение. Например, этой процедуре можно поручить вычисление гипотенузы, используя теорему Пифагора, или площадь треугольника, или определить в каком из двух слов больше символов. Другими словами функции обычно используются при выполнении вычислений, операциями с текстом, либо возвращают логические значения. Процедура Property используется для ссылки на свойство объекта. Данный тип процедур применяется для установки или получения значения пользовательских свойств форм и модулей. В следующем упражнении мы создадим процедуру Sub, связанную с элементом управления Командная кнопка (CommandButton). Эта процедура будет выполнять те же действия, что макрос, созданный нами в первом упражнении, но Вы убедитесь, что процедура проще и понятнее. 5.2. Упражнение 3 1. Откройте чистую рабочую книгу Excel и убедитесь, что находитесь на рабочем листе «Лист1». 2. Вызовите панель элементов управления и, если есть необходимость, перейдите в режим конструктора. 3. Через эту же панель откройте окно свойств. 4. Создайте на рабочем листе элемент Кнопка (CommandButton), и если она выделена, то в окне свойств можно будет менять свойства этой кнопки 5. В окне свойств, в строке Name вместо «CommandButton1» наберите другое имя – «Cmd1» (работаем в латинском шрифте!!!). Чтобы «почувствовать разницу» измените свойство Caption – наберите там произвольное слово – сообщение на русском языке, например «Проба». После этого можно считать, что элемент управления «сформирован» и теперь переходим к созданию процедуры. 6. Дважды щелкните по кнопке (двойной щелчок) и Вы перейдете в окно редактора VBA. В окне проекта Вы увидите, что выделен объект «Лист1», а справа, на переднем плане будет расположено окно для написания кода именно для объектов этого листа. Обращаем внимание, что в верхней строке этого окна, разбитой на две части слева располагается имя кнопки (Cmd1), а справа – слово Click, означающее одно из событий, на которое может реагировать элемент CommandButton. Также обращаем внимание, что и имя объекта и названия события являются элементами списка, то есть, если нажать на треугольники справа от этих слов, то можно получить либо список объектов рабочего листа (пока только General, Cmd1, Worksheet), либо список событий для одного из объектов. 7. Обращаем внимание на текст внутри окна кода. Находим следующие две строки Private Sub Cmd1_Click() 13 End Sub Первая строка является началом процедуры Sub которая является «местной» для этого модуля (слово Private). Эта процедура относится к элементу управления Cmd1 и будет выполнена, когда произойдет событие Click, то есть щелчок мышью по кнопке. Имя данной процедуры таким образом - «Cmd1_Click» Нижняя строка End Sub означает конец процедуры. Код для данной процедуры должен находиться между двумя этими строками. Переходим к написанию кода. Прежде всего, спланируем, что мы хотим сложить два числа, взятые из двух ячеек, а результат сложения поместить в третью ячейку. Пусть эти числа будут расположены в ячейках A2 и B2, а результат поместим в ячейку C2. Сначала рассмотрим более длинный вариант, который поможет нам понять использование переменных в программе. Набираем строчки X1=Сells(2,1) X2=Сells(2,2) Cells(2,3)=X1+X2 В первой строке в ячейку памяти компьютера, которой мы дали имя X1 (это одна из переменных, используемых в программе), мы помещаем содержимое ячейки A2 (2-я строка, 1-й столбец в электронной таблице), во второй строке под именем X2 запоминается содержимое ячейки B2. В третьей строке происходит сложение этих переменных, и результат отправляется в ячейку C2. Процедура выглядит так: Private Sub Cmd1_Click() X1=Сells(2,1) X2=Сells(2,2) Cells(2,3)=X1+X2 End Sub Возможен второй вариант написания процедуры, выполняющей те же действия Private Sub () Cells(2,3)=Сells(2,1) +Сells(2,2) End Sub Здесь важно сделать следующее замечание. Вы уже наверно смогли заметить, что операцию сложения можно выполнить напрямую в электронной таблице, или путем написания макроса, или через создание процедуры. Безусловно, первый способ самый простой, а все остальное – только как упражнения. Но бывают ситуации, когда электронная таблица без использования VBA «бессильна» реализовать Ваши планы. Искусство написания программ как раз и заключается в правильном выборе – что же поручить электронной таблице, а что – языку программирования. При написании кода Вы уже заметили, что после набора слова “Cells“ на экране появилась подсказка, о том, что пора вводить номер строки (RowIndex) – это очень приятная «услуга» со стороны редактора VBA, и свидетельствует она о том, что Вы набирает код в данной строки синтаксически правильно. Продолжаем выполнять упражнение. Итак код записан. 8. Вернитесь в электронную таблицу через соответствующую кнопку для Excel, которая находится либо левом верхнем углу редактора, либо в панели задач. 9. Введите в ячейки A2 и B2 два произвольных числа 10. Выйдите из режима конструктора, отжав соответствующую кнопку в панели элементов управления 11. Щелкните по созданной Вами кнопке. В ячейке C3 должен появиться результат сложения. 14 Объекты, их свойства, события и методы ...............................................................................7 3.1. Имя объекта. Метод ...........................................................................................................8 3.2. Правила для создания имен следующие: .........................................................................8 4. Стандартные элементы управления .........................................................................................8 4.1. Упражнение 2 ...................................................................................................................10 5. Структура проекта на языке VBA. .........................................................................................11 5.1. Создание процедур. ..........................................................................................................12 5.2. Упражнение 3 ...................................................................................................................12 3.