Ф.И. Воробьева, Е.С. Воробьев
ПРИЕМЫ ПРОГРАММИРОВАНИЯ В СРЕДЕ VISUAL BASIC FOR APPLICATION MS OFFICE Учебное пособие
2...
31 downloads
638 Views
1MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Ф.И. Воробьева, Е.С. Воробьев
ПРИЕМЫ ПРОГРАММИРОВАНИЯ В СРЕДЕ VISUAL BASIC FOR APPLICATION MS OFFICE Учебное пособие
2010
Федеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования «Казанский государственный технологический университет»
Ф.И. Воробьева, Е.С. Воробьев
ПРИЕМЫ ПРОГРАММИРОВАНИЯ В СРЕДЕ VISUAL BASIC FOR APPLICATION MS OFFICE Учебное пособие
Казань КГТУ 2010 -4-
УДК 658.26:66.094 Воробьева, Ф.И. Приемы программирования в среде VISUAL BASIC for APPLICATION: учебное пособие / Ф.И. Воробьева, Е.С. Воробьев. – Казань: Изд-во Казан. гос. технол. ун-та; 2010. − 104 с. ISBN 978-5-7882-0825-1 Рассмотрены основные элементы среды разработки программ, а также базовые конструкции алгоритмического языка Visual Basiс for Application. Показаны примеры разработки пользовательских функций Ехсel Продемонстрированы приемы работы с отладчиком программ. Даны общие принципы и примеры создания пользовательских программ (макросов) и форм для создания своих приложений в среде Excel. Пособие может быть использовано при изучении дисциплин «Информатика», «Применение ЭВМ в технологии» и «Применение ЭВМ в расчетах», а также при курсовом и дипломном проектировании. Предназначено для студентов очной и заочной форм обучения специальностей 240802.65 «Основные процессы химических производств и химическая кибернетика» и 240801 «Машины и аппараты химических производств», обучающихся по направлению 240800 «Энерго- и ресурсосберегающие процессы в химической технологии, нефтехимии и биотехнологии». Подготовлено на кафедре общей химической технологии. Печатается по решению редакционно-издательского совета Казанского государственного университета. Рецензенты: профессор КГТУ им. Туполева
О.Ш. Даутов
старший научный сотрудник Казанского научного центра РАН Д.В. Чачков ISB N 978-5-7882-0825-1
ã Воробьева Ф.И., Воробьев Е.С., 2010 ã Казанский государственный технологический университет, 2010
-5-
Введение Visual Basic for Application (VBA) это среда программирования в пакете программ Microsoft Office. Средствами VBA можно создавать функции пользователя, которые используются на листах электронных таблиц, макросы (макро команды) для создания новых команд из комбинаций стандартных команд приложений, если их надо часто повторять в том же порядке, программные надстройки для специальных программных решений внутри приложений Microsoft Office. Основные понятия объектно-ориентированного программирования Объектно-ориентированное программирование позволяет существенно упростить процесс создания программ. Основами данного способа программирования являются объекты. Объекты – представляют собой законченные элементы, которые мы используем во время программирования. Например, мы строим различные геометрические фигуры, каждая из них может быть объектом. Возьмем прямоугольник, чтобы его построить нам надо знать его ширину и длину, которые являются его (прямоугольника) свойствами (Properties). Если мы не знаем объекта прямоугольник, то нам надо будет нарисовать четыре линии соответствующих длин и правильно их сориентировать друг относительно друга. Когда мы имеем объект прямоугольник, то все операции его построения уже заложены в самом объекте. Например, нам надо расширить наш объект новым свойством (цветом). Создаем для него новое свойство «Цвет заливки» и пишем подпрограмму для его реализации. Показанный пример объекта весьма прост. В реальных условиях каждый объект обладает: · свойствами (Properties), которые задаются конкретными значениями (длина и ширина). Их можно считать или изменять, задав нужное значение; · методами (Methods), которые реализуют какие-либо действия с объектом, например, изменить его размеры, цвет и т.п.; · событиями (Events), в которых обычно и реализуются программы пользователя для управления данным объектом, например, щелчок мышки или ее движение через объект и т.п. Каждый объект может включать в себя другие объекты, и сам входить частью в объекты более высокого уровня. Например, наш -6-
объект прямоугольник, может включать в себя четыре объекта линий, а линия может состоять из двух точек. Также можно двигаться и в другую сторону, включая прямоугольник в более сложные объекты. Вся структура пакета программ Microsoft Office построена на этой же идеологии. Каждая программа является объектом с именем Application (Приложение). В свойствах этого объекта мы можем узнать имя самой программы (Word, Excel и т.п.), параметры окна, открытые файлы документов и т.д. С использованием методов мы можем открывать и закрывать документы и саму программу, изменять размеры рабочего окна программы и т.п. Если мы хотим создать свою процедуру запуска программы, то мы можем записать в событие объекта свой программный код, например, при запуске Word, обязательно открывать нужный документ. В свою очередь каждый документ тоже является объектом, содержащим более мелкие объекты, так, например, электронная таблица содержит листы, а лист имеет ячейки. Хорошее понимание объектно-ориентированного программирования и умение использовать стандартные объекты существенно упростит создание ваших программ. Прежде чем перейти к самим приемам работы в среде программирования VBA, познакомимся с размещением программ пользователей в документах. Модули Все программы Visual Basic for Application сохраняются в рабочих файлах Microsoft Office, это могут быть документы Word, электронные таблицы Excel и файлы других программ пакета. Обычно программы VBA находятся в специальной части файлов, называемой Modules (модули). Модуль VВА содержит исходный код программы – текстовое представление инструкций по выполнению вычислений. Каждый файл может иметь до нескольких модулей. Модули объединены в общий объект Project (проект). Существует несколько типов модулей: · модули объектов документа, которые содержат нужные программные реализации для событий этих объектов. Например, если мы создали экранную форму, которую надо запускать одновременно с открытием документа, то процедуру ее показа надо записать в событие книги - Open; · экранные формы, которые позволяют создавать свои рабочие окна для реализации ваших собственных задач. Формально данные модули состоят из двух – собственно экранной формы и программно-7-
го кода для реализации необходимых событий ее объектов; · модули программ – основной элемент VBA, который содержит программный код для функций пользователя, макросов и внутренних подпрограмм, необходимых для работы как функций и макросов, так и разработанных экранных форм; · модули классов (объектов), которые создают новые объекты (классы) на основе уже имеющихся объектов приложения. Первая группа модулей существует в документе всегда, для других групп имеются методы для их создания или загрузки из соответствующих файлов. Чтобы создать модуль в проекте необходимо выполнить команду Insert => Module (UserForm, Class Module), что приведет к созданию выбранного модуля и изменению содержимого окна проекта. Появится строка Моdulе1, соответствующая вставленному модулю в окне проекта. Модуль может быть создан автоматически, когда пакет (Word, Excel) выполняет запись макроса, ему присваивается имя ModuleN, где N – первый свободный номер в проекте модулей во время текущего сеанса работы. Например, в первый раз, когда вы сохраняете записанный макрос в Книге1.xls, Excel создает модуль с именем Module1. Если вы продолжаете записывать макросы в том же сеансе работы и сохранять их там же, Excel продолжает сохранять записанные макросы в том же модуле Module1 до тех пор, пока вы не выберете другую рабочую книгу. Если позже в том же сеансе работы вы опять захотите сохранить записанные макросы в Книге1.xls, то будет добавлен другой модуль с именем Module2. Любой из добавляемых модулей может быть импортирован в проект, используя команду File => Import File…, затем надо показать нужный файл для загрузки. Эта команда бывает очень удобной, для внесения в проект набора стандартных процедур, которые вы используете при создании своих программ. Чтобы создать такие файлы для загрузки, нужно необходимые модули экспортировать в файл по команде File => Export File… Для удаления модуля следует выполнить следующие команды: 1) кликнуть правой кнопкой мышки на имени этого модуля в окне проекта, например, на Моdulе1; 2) в открывшемся контекстном меню выполнить команду Remove (Удалить); 3) выбрать предлагаемую операцию экспорта модуля перед его удалением Yes (Да) или кликнуть на кнопке No (Нет), если экспорти-8-
ровать модуль перед удалением не надо. Теперь можно познакомиться и с самой оболочкой для разработки программ в среде VBA. Основные элементы управления в редакторе VBA Для просмотра модулей и работы с программным кодом вам необходимо использовать редактор Microsoft Visual Basic. Этот компонент предоставляет инструментальные средства, которые используются для создания новых модулей, просмотра содержимого существующих модулей, создания и редактирования исходного кода программ, разработки пользовательских диалоговых окон и выполнения других задач, относящихся к написанию и обслуживанию программ на VВА. Независимо от того, работаете ли вы в Word или в Excel, редактор VBA запускается одним и тем же способом. Используйте для этого один из следующих приемов: · Выберите на ленте инструментов вкладку Разработчик, а на ней инструмент Visual Basic. · Нажмите сочетание клавиш Alt+F11. Основное окно редактора VBA (рис.1) ничем не отличается от окон MS Office. Верхняя строка – заголовок окна с именем самой программы Microsoft Visual Basic и через дефис именем документа, в котором создается программный код. Здесь же имеются системные кнопки управления окном, как во всех программах MS Office. Ниже находится строка основного меню и панели инструментов, дублирующие наиболее часто повторяющиеся команды из меню. Более подробно по ним будет описано ниже. Все остальное пространство занимает рабочая область, которая может разделяться на различные окна и панели. Их можно раскрывать или скрывать по мере надобности. Это панели: · проекта (Project) (в левой верхней части экрана) – содержит перечень объектов, входящие в документ создаваемой программы. На рис.1 видно, что имеются два проекта: это собственно наш рабочий документ (книга Excel), содержащий четыре объекта – листы книги (Лист1, Лист2, Лист3) и сама книга (Эта книга), и второй проект – надстройка Exp_fun.xla, что видно по ее расширению. По мере наполнения проекта там могут появляться новые объекты – программные модули, пользовательские формы и т.д. В заголовке панели имеются три кнопки, которые выполняют следующие функции: по-9-
казывает программный код объекта, выводит на экран сам объект, если это возможно (это возможно только для пользовательских форм), и раскрывает или сворачивает дерево объектов;
Рис.1. Окно VBA
· свойств объектов (Properties) (в левой нижней части экрана) – содержит перечень свойств выделенного объекта, в нашем случае здесь представлены свойства выделенного в проекте объекта Лист1. В заголовке панели имеется выпадающий список из включенных в данный объект его членов (members) – других объектов, на которые можно быстро перейти при их выборе. Все свойства объекта могут быть представлены в двух вариантах – по алфавиту (Alphabetic) или по категориям (Categorized) согласно имеющимся на этой панели закладкам; · коллекции объектов (Object browser) (справа вверху) – содержит библиотеку всех объектов, использующихся в среде VBA и самого - 10 -
приложения (в нашем случае это электронная таблица Excel). Здесь можно найти любой объект, познакомиться с его свойствами и получить более подробную информацию по каждому объекту, его свойствам, методам и событиям через систему помощи [F1]. Выбор объектов может быть организован через выбор нужной библиотеки (выпадающий список в верхней строке панели). Здесь можно выбрать нужную из них или все сразу All Libraries (все библиотеки), как показано на рис.1. Затем выбираем нужный объект в двух нижних списках: в списке классов (Classes) (наборов из нескольких объектов, объединенных в группу (Класс)) и списке членов класса (Members of …) самих объектов или их свойств. Можно найти нужный объект в поиске (вторая строка панели). Результаты поиска представляются в окне ниже. Выбрав нужный объект, можно увидеть все его свойства в нижних окнах; · исполнения (Immediate) (внизу слева) – окно, где можно немедленно выполнить команду VBA или даже нескольких команд; · локальных переменных (Locals) (внизу в центре) – окно, где автоматически выводится информация по всем описанным в программе переменным во время выполнения кода; · просмотра (Watches) (внизу справа) – окно, куда можно ввести выражение, которое будет вычислено, и результат будет выведен в нем; · собственно окно кода программы, которое обычно находится вместо коллекции объектов. Сюда вносится сам код программ (рис.2). В верхней строке окна имеются два выпадающих списка. Левый из них показывает область в коде модуля. В нем могут быть два значения: «General» – основная область и «Имя_объекта» (Worksheet, Workbook и UserForm) – область программ данного объекта. Правый список содержит обязательное значение «Declaration» – описание переменных, и список общих и вспомогательных процедур, расположенных в этой области кода. При выборе другого объекта в левом списке, правый будет содержать все программы, описывающие события для данного объекта. Данные списки позволяют быстро переходить к различным программам внутри модуля. Все панели могут быть скрыты с помощью щелчка на кнопке с крестиком соответствующей панели. Чтобы отобразить какую-либо отсутствующую панель, следует открыть меню View (Вид), кликнуть на соответствующей строке выпавшего меню. Для ряда панелей имеются комбинации горячих клавиш для их быстрого вызова. - 11 -
Рис.2. Окно кода программы
Как уже говорилось выше, в окне кода набирается сам текст программы. Это можно делать вручную, но лучше пользоваться стандартными заготовками – шаблонами. Познакомимся с первым из них – созданием процедуры. Для этого необходимо в меню Insert выбрать команду Procedure. В открывшемся окне вставки процедуры (рис.3) необходимо задать имя процедуры, выбрать её тип (Sub (подпрограмма), Function (функция), Property (свойство)) и область видимости (Public (публичная), Private (приватная)). ЗаверРис.3. Окно вставки процедуры шить ввод нажатием кнопки Ok. В окне кода появится заготовка программы. Первая и последняя строки (операторы) программы стандартные: Sub имя () End Sub
Вам теперь необходимо ввести собственно код программы между этими строками. Помните, что в именах идентификаторов (программ, переменных) не должно быть пробелов (их можно заменять подчеркиванием «_»). Они не должны начинаться с чисел и не могут совпадать с име- 12 -
нами стандартных функций и служебных слов языка. Регистр в имени переменных не имеет значения. Если мы хотим, чтобы имя программы состояло из нескольких слов, то вместо пробела надо использовать знак соединения или каждое слово начинать с заглавной буквы. Примеры имени программы: моя_программа МyРrоgram МояПрограмма Мy_Рrogram Между первой и последней строками шаблона набираются остальные операторы программы. При этом можно пользоваться привычными командами редактирования (как в текстовом процессоре Word), а также буфером обмена. Ввод строки оканчивается нажатием клавиши Enter. Если для наглядности оператор нужно разместить на нескольких строках, то для переноса следует использовать комбинацию символов пробела и соединения « _» (после ввода этих символов надо нажать клавишу Enter). Если необходимо несколько операторов разместить на одной строке, то между ними надо поставить двоеточие «:». Помните, что после завершения ввода строки происходит ее проверка и корректировка с вводом дополнительных пробелов. Апостроф (запятая в верхней части строки) «’» означает, что следующая за ним информация (до конца строки) является комментарием, т.е. набором символов, который никак не влияет на выполнение программы. Если Вы готовите большую программу, то рекомендуется её комментировать, чтобы не забыть основной алгоритм и назначение используемых переменных. Более подробно остановимся на основных командах меню: · File (Alt+F) – содержит команды работы с файлами, печати и закрытия пакета. Наибольший интерес вызывают команды Import (Импорт) и Export (Экспорт), которые позволяют сохранить программный код в текстовом файле, а затем загрузить его в другой проект. Это позволяет использовать наборы заранее созданных программных заготовок и форм в других проектах. Команда Remove (Извлечь) позволяет удалить выделенный объект из проекта. При ее выполнении задается вопрос об экспорте данных (рис.4). Если объект больРис.4. Запрос на экспорт объекта ше не нужен, его можно - 13 -
просто удалить, если он не нужен только в данном проекте, но может пригодиться в другом, его можно перед удалением экспортировать в файл, ответив на запрос «Да». · Edit (Alt+E) – содержит несколько групп команд, связанных с редактированием текста программы: Краткая справка по командам и подменю меню Edit редактора VBA приведена в таблице. Там же можно видеть пиктограммы кнопок, которые присутствуют или могут присутствовать на панелях инструментов для ускоренного доступа к этим командам, равно как и сочетания клавиш, нажав на которые, можно выполнить данные команды. Команда или подменю
Undo … (Отменить) Redo … (Повторить) Сut (Вырезать) Сору (Копировать) Paste (Вставить)
Clear (Очистить)
Select All (Выделить все) Find (Найти) Find Next (Найти следующий)
Кноп- Сочетание ка клавиш
Описание
Ctrl+Z
Отмена выполненной команды. Иногда можно отменить ряд команд
Нет
Отмена последней команды Undo …
Вырезать выделенный фрагмент кода или объект и поместить в буфер обмена Копирование выделенного фрагменCtrl+C та кода или объекта в буфер обмена Вставка содержимого буфера обмеCtrl+V на, например, в модуль (код) или форму (элемент формы) Удаление фрагмента кода или элемента формы. При работе с кодом команда имеет название Clear (ОчиDel стить), а при работе с элементами форм отображается название Delete (Удалить) Выделение всего программного кода Ctrl+A в модуле или всех элементов на форме Команда поиска текстового фрагменCtrl+F та в модуле Поиск и выделение следующего F3 фрагмента текста или кода после первого найденного Ctrl+X
- 14 -
Команда или подменю
Replace (Заменить) Indent (Отступ) Outdent (Выступ) List Properties| Methods (Список свойств /методов ) List Constants (Список констант) Quick Info (Быстрая справка) Parameter Info (Параметры) Complete Word (Завершить слово)
Bookmarks (Закладки)
Кноп- Сочетание ка клавиш
Описание
Поиск текста и замена его на другой. Оба текста (искомый и текст замены) Ctrl+H указываются в диалоговом окне при выполнении команды Смещение строк выделенной части Таb кода вправо Смещение строк выделенной части Shift+Tab кода влево Вывод списка свойств или методов для введенного объекта после ввода Ctrl+J точки (.) в конце имени объекта Выводится список допустимых кон-
Ctrl+Shift стант для указанного объекта после +J
ввода знака равенства (=) Выводит список параметров для функций, процедур и других модуCtrl+I лей программы при наведении курсора на имя этого модуля Контролирует ввод необходимых Ctrl+Shift входных параметров при заполнении +I имен фактических параметров после имени процедуры Автоматическое завершение ввода ключевых слов. Выполняется только в Ctrl том случае, если введено достаточное +Space количество символов, позволяющих VBA идентифицировать это слово Подменю работы с закладками. Содержит команды Установить / Снять закладку (Toggle Bookmark), перейить к следующей закладке (Next Нет Bookmark), и к предыдущей (Previous Bookmark) и удалить все закладки (команда Clear All Bookmarks). - 15 -
Можно заметить, что первые две команды рассматриваемого меню (Undo и Redo, соответственно) отображены несколько необычно - команды выделены серым цветом (это означает, что они недоступны), к тому же перед этими командами появилось слово Can't, что в переводе означает невозможно. Объясняется все просто - поскольку в документе никакие операции с данными не производились, то и отменять нечего. В процессе работы, когда команды станут доступны, в соответствующей командной строке будет отображена не только сама команда, но и описание того действия, которое можно отменить или повторить. · View (Alt+V) – представлены команды и подменю, позволяющие настраивать внешний вид рабочего окна приложения Excel, перехода к подпрограммам и возврата к последней точке ввода текста. Команда или подменю
Code (Код) Object (Объект) Definition (Определение) Last Position (Последняя позиция курсора) Object Browser (Окно объекта) Immediate Window (Окно тестирования) Locals Window (Окно переменных) Watch Window (Окно просмотра)
Кноп- Сочетание ка клавиш
Описание
Отображение окна редактирования программного кода Отображение объекта, выбранного в Shift+F7 окне проекта Project Explorer Команда перехода на подпрограмму с Shift+F2 обращения к ней в программном коде F7
Ctri+Shift+ Быстрый переход к предыдущему F2 месту размещения курсора F2
Ctrl+G
Отображение окна Object Browser для доступных на данный момент объектов Отображение окна Immediate Window, полезного при отладке программных кодов. В него можно ввести программный код и выполнить его Отображение окна Locals Window, используемого при отладке программного кода для отслеживания значения переменных Отображение окна отладки Watch Window для просмотра значения выражений - 16 -
Команда или подменю
Call Stack (Стек вызова) Project Explorer (Окно проекта) Properties Window (Окно свойств) Toolbox (Элементы управления) Tab Order (Порядок перехода)
Toolbars (Панели инструментов)
Microsoft Excel
Кноп- Сочетание ка клавиш
Описание
Ctrl+L
Просмотр стека вызова подпрограмм Call Stack в режиме отладки в момент остановки выполнения программы на закладке
Ctrl+R
Отображение окна проекта Project Explorer
F4
Отображение окна свойств Properties Window Отображение панели с элементами управления форм
Отображение диалогового окна Tab Order, с помощью которого устанавливается порядок выполнения переходов (при нажатии клавиши Таb) между элементами формы Подменю содержит команды, позволяющие отображать: панель отладки Debug, панель редактирования Edit, стандартную панель инструментов Standard, панель формы UserForm и команду настройки панелей инструментов Customize Команда перехода к приложению Alt+F11 Excel. При этом редактор VBA остается открытым
· Insert (Alt+I) – содержит команды вставки всех возможных объектов в проект VBA. Это модули, оконные формы и процедуры. Так же можно вставить фрагменты программных модулей из файла. Команда или подменю
Procedure (Процедура)
Кноп- Сочетание ка клавиш
Описание
Команда вставки новой процедуры в модуль - 17 -
UserForm (Форма пользователя) Module (Модуль) Class Module (Модуль класса)
Команда добавления новой формы в проект Добавление нового модуля в проект Добавление в проект модуля класса Вставка в модуль файла, содержащего код VBA
File (Файл)
· Format (Alt+O) – содержит команды форматирования объектов на оконных формах, что существенно упрощает размещение этих объектов на форме и относительно других объектов. Замечание. Не все команды этого меню активны. Причина в том, что открыт новый рабочий документ. В процессе написания программного кода и работы с соответствующими объектами доступ к командам будет получен. Это же замечание относится и к командам прочих меню, как описанных выше, так и тех, о которых речь еще будет идти далее. Команда или подменю
Align (Выровнять)
Make Same Size (Установить размер) Size to Fit (Размер по заполнению) Size to Grid (Размер по сетке)
Кнопка
Описание
Выравнивание объектов относительно друг друга. Выравнивание выполняется: по левому краю (Lefts), по центру (Centers), по правому краю (Rights), по верхнему краю (Tops), по центральной линии (Middles) и нижнему краю (Bottoms) и по базовой сетке (То Grid) Подменю выравнивания размеров объектов позволяет для выбранных объектов сделать равными ширину (Width), высоту (Height) или оба размера (Both) Команда, которая устанавливает свойства автоматического выравнивания объекта под его содержание, что можно применить к окну ввода или вывода текстовой информации Команда, которая устанавливает свойства автоматического выравнивания объекта по сетке - 18 -
Команда или подменю
Horizontal Spacing (Расстояние по горизонтали)
Vertical Spacing Размер по вертикали) Center in Form (По центру формы) Arrange Buttons (Упорядочить кнопки) Group (Группировать) Ungroup (Разгруппировать) Order (Порядок)
Кнопка
Описание
Подменю изменения расстояния по горизонтали между выбранными объектами. Содержит команды: Make Equal (равное расстояние между объектами); Increase (увеличение расстояния между объектами на расстояние шага базовой сетки формы); Decrease (уменьшение расстояния между объектами на расстояние шага базовой сетки формы) и Remove (объекты сдвигаются по горизонтали друг к другу). Во всех случаях базовым считается объект, которому передан фокус (вокруг него рамка с белыми метками) Подменю содержит команды для изменения расстояния по вертикали между выделенными объектами. Команды такие же, как и для предыдущего подменю, только теперь все это имеет место вдоль вертикали Подменю содержит команду выравнивания выделенных объектов относительно центра формы по горизонтали (Horizontally) и вертикали (Vertically) В подменю представлены две команды выравнивания кнопок в форме: по нижней (Bottom) и правой (Right) границе Команда группировки объектов Команда отмены группировки объектов Подменю содержит команды, позволяющие изменять порядок отображения перекрывающихся объектов в форме. Эти команды таковы: Bring To From (переме- 19 -
Команда или подменю
Кнопка
Описание
щение объекта на передний план), Send To Back (перемещение объекта на задний план), Bring Forward (перемещение объекта на один уровень вперед) и Send Backward (перемещение объекта на один уровень назад). Если выделить несколько объектов, то один из них будет иметь прозрачные угловые курсоры, а у остальных черные. Объект с прозрачными курсорами является активным. · Debug (Alt+D) – набор команд для отладки программного кода. Команда или подменю
Кноп- Сочетание ка клавиш
Compile VBAProject (Компилировать) Step Into (Входить)
Step Over (Перешагивать)
Step Out (Выполнить до конца) Run to Cursor (Выполнить до курсора)
Описание
Команда компилирования проекта Команда пошагового выполнения F8 кода с исполнением внутренних процедур Команда пропуска трассировки подпрограмм, просто происходит ее вычисление. Если известно, что Shift+F8 подпрограмма работает правильно, то поиск ошибок в ней не нужен, и при трассировке ее можно пропустить из пошагового исполнения Выполнение оставшихся команд процедуры. Если вы убедились, что код подпрограммы работает Ctrl+Shift+ правильно и дальнейшее его исF8 полнение в пошаговом режиме просто трата времени, надо воспользоваться этой командой Ctrl+F8
Выполнение команд до строки, в которой размешен курсор
- 20 -
Команда или подменю
Кноп- Сочетание ка клавиш
Add Watch (Добавить для просмотра)
Edit Watch (Редактировать просматриваемые) Quick Watch (Быстрый просмотр) Toggle Breakpoint (Установить точку остановки) Clear All Breakpoints (Удалить все точки остановок) Set Next Statement (Определить следующую инструкцию) Show Next Statement (Показать следующую инструкцию)
Ctrl+W
Shift+F9
F9
Ctrl+Shirf+ F9
Ctrl+F9
Описание
Команда отображения диалогового окна Add Watch, где можно указывать переменные и выражения, значение которых проверяется в процессе выполнения программного кода Команда отображения диалогового окна Edit Watch, в котором можно редактировать переменные и выражения, отслеживаемые в процессе выполнения программного кода Отображение диалогового окна Quick Watch с текущим значением как выбранной переменной, так и целого выражения Выбор метки (точки) остановки выполнения кода Удаление всех меток остановки выполнения кода
Команда определения следующей выполняемой команды. Позволяет менять порядок выполнения команд исходного программного кода Команда выделения следующей выполняемой строки кода
- 21 -
· Run (Ctrl+R) – набор команд для выполнения программного кода. Команда или подменю
Кнопка
Run Macro (Запустить) Break (Приостановить) Reset (Сброс) Design Mode (Режим разработки)
Сочетание клавиш
Описание
Команда запуска макроса на выполнение Приостановка выполнения макCtrl+Break роса Сброс значений всех переменных к исходным значениям Переход в режим разработки и выход из этого режима (повторное выполнение команды) F5
Зафиксировав строку команды (Design Mode), вы указываете системе, что вы проектируете свою форму, и нет необходимости выполнять все события, которые в этот момент могут возникать на форме; · Tools (Ctrl+T) – содержит команды настройки системы программирования. Команда или подменю
References (Ссылки)
Additional Controls (Дополнительные элементы управления) Macros (Макросы) Options (Параметры)
Кнопка
Описание
Команда включения ссылок на программы, которые будут нужны в данном проекте. Например, мы хотим использовать текстовый процессор Word, который будет вызываться как объект в нашем проекте, тогда его надо найти в списке зарегистрированных программ и поставить галочку. После этого в проекте можно вызвать Word как объект, и увидеть все его свойства и методы Отображается диалоговое окно Additional Controls c элементами управления, которые можно добавлять в меню Тооls Открывается диалоговое окно Macros, в котором можно создавать, редактировать, запускать и удалять макросы В результате выполнения команды открывается диалоговое окно Options с четырьмя - 22 -
VBAProject Properties (Свойства проекта VBA) Digital Signature (Электронные подписи)
вкладками (Editor, Editor Format, General и Docking) (рис.4). С помощью этого окна можно задавать базовые настройки редактора Команда настройки свойств проекта, которая позволяет задать имя проекта, файлы помощи, которые нужно подключать к проекту, и закрыть проект паролем Отображается диалоговое окно Цифровая подпись, в котором задается цифровая подпись для проекта
Команда настройки оболочки (Options…) вызывает окно (рис.5), которое содержит несколько закладок, содержащих ряд настроек, которые можно изменить под себя. Рассмотрим их подробно: § Закладка (Editor) содержит настройки общей системы ввода программного кода. Здесь можно указать необходимость показа информации по параметрам процедур. Проводить контроль при вводе формальных параметров. Вывод Рис.5. Окно настроек, закладка Редактор свойств объекта, после ввода точки в его имени и показ констант при вводе знака равенства после имени свойства объекта. Все эти вспомогательные функции можно здесь отключить, сняв галочки перед ними, и вызывать эти функции принудительно соответствующими командами меню View. Здесь же задается размер табулятора, который определяет отступ в программном коде. § Закладка (Editor Format) настраивает форматирование окна с кодом программы, здесь задается имя, размер и начертание шрифта, а также выделение цветом различных объектов (служебные слова, идентификаторы) и состояний выполнения программного - 23 -
кода (закладки, точки останова, исполняемая команда и т.д.). Обычно нет необходимости изменять эти настройки, так как они хорошо продуманы. § Закладка (General) содержит ряд настроек, которые задают размеры сетки для форм пользователя и необходимость привязки объектов к ней, режимы редактирования, срабатывания на ошибки и компиляции программы. § Закладка (Docking) определяет какие из окон и панелей должны быть привязаны к определенным местам рабочей области экрана или располагаться поверх рабочей области экрана. Как несложно заметить, для команд меню Tools не предусмотрены комбинации клавиш, посредством которых эти команды вызываются. Принимая во внимание специфику выполняемых этими командами действий, можно порекомендовать в том случае, если настройки системы часто меняются, выносить на панель инструментов кнопки для соответствующих команд. Замечание. Здесь еще раз хочется напомнить, что даже если для команды не указана специальная пиктограмма, кнопку все равно можно разместить на панели инструментов. Делается это точно так же, как и в процессе настройки панелей инструментов приложения Excel. · Add-Ins позволяет включать Add-In объекты в проект. В этом меню находится всего одна команда, которая приводит к отображению диалогового окна Add-Ins Маnаgеr. Это окно позволяет регистрировать, загружать или выгружать и определять поведение дополнений. · Windows (Ctrl+W) – набор команд управления окнами, которые являются стандартными во всех приложениях MS Office. С их помощью можно различными способами расположить окна и выбрать любое из них. · Help (Ctrl+H) – команды вызова системы помощи и комментарии к пакету. Теперь кратко рассмотрим кнопки на панелях управления. Они дублируют основные команды меню. Панелей всего четыре: · первая Стандартная (Standard) содержит основные команды работы с файлами, редактирования, поиска и т.п. Она обычно расположена под строкой меню, однако при помощи мышки ее можно перетаскивать в другие области окна VB; - 24 -
· вторая панель Редактирование (Edit) включает команды работы с кодом и установки различных закладок. Команды простейшего текстового редактора: копирование и перемещение текста в буфер обмена, вставка текста из буфера, поиск и/или замена слов и фраз в тексте программы и т.д.; · третья панель Отладка (Debug) – команды по отладке кода; · четвертая панель Пользовательская форма (UserForm) содержит команды создания пользовательских окон. Как в любом пакете имеется команда Настройка… панелей инструментов, которая становится доступной в контекстном меню панели инструментов или строки меню. С ее помощью можно изменить набор кнопок любой из панелей. Для выяснения назначения любой кнопки достаточно просто зафиксировать на ней курсор и система выведет текстовый комментарий по команде, которая привязана к этой кнопке. Стандартные приемы программирования в среде VBA Введение Прежде чем перейти к основным приемам создания программ вспомним основные элементы программного кода и стандартные алгоритмы, которые обычно используются при программировании. При написании программного кода рекомендуется пользоваться структурированием записи, когда каждый внутренний цикл или оператор, который выполняется внутри предыдущего оператора, должен иметь отступ. Такой подход позволяет легче читать код. В нем сразу видно, что выполняется в следующий момент. Для увеличения отступа используется клавиша Tab, и клавиши Shift+Tab для его уменьшения. Для перемещения группы операторов можно пользоваться этими же клавишами, предварительно выделив фрагмент кода, который надо переместить. Размер табуляции можно задать в настройках Tools ð Options на закладке Editor в поле Tab Width. По умолчанию стоит значение 4 символа. Для оптимального использования памяти лучше явно описывать все переменные, которые используются в программе. По умолчанию все переменные имеют тип Variant, в котором можно хранить любые данные, но такой подход приведет к дополнительному выделению памяти для этой переменной. В языках программирования существуют ключевые (служебные) - 25 -
слова, которые используются только в конструкциях языка. Ключевые слова нельзя использовать в качестве имен программ и переменных в программах. По умолчанию среда VBA настроена таким образом, чтобы при наборе текста программы в окне кода все ключевые слова выделялись синим цветом, комментарии – зеленым цветом и синтаксические ошибки - красным. Отладка программы Отладка программы – важное и ответственное мероприятие. Для этого используются режимы пошагового исполнения программы, точки останова программы и опросы значений переменных или выражений. Чтобы запустить пошаговое исполнение программы надо встать курсором на заголовке исполняемой программы, и нажать клавишу F8. Текущая строка меняет цвет фона на желтый. Повторное нажатие клавиши F8 выполнит команды текущего оператора и перейдёт к следующему оператору. Иногда бывает удобно пропустить часть строк, которые уже были проверены. Для этого надо встать на последнюю проверенную строку программного кода и запустить исполнение программы воспользовавшись комбинацией клавиш Ctrl+F8. Система выполнит все строки программы и остановится на строке, где стоит курсор. Если вы отлаживаете программу, которая имеет внутренние подпрограммы и функции, то вы можете выполнить любую подпрограмму без захода в ее код, если воспользоваться комбинацией клавиш Shift+F8. Для выхода из подпрограммы надо пользоваться командой Ctrl+Shift+F8. В любой момент вы можете завершить исполнение программы либо, выполнив ее до конца командой Continue (F5), или просто прервать ее исполнение командой Reset. Если заранее известно проблемное место программы, то на этой строке можно поставить точку останова (Toggle BreakPoint). Для этого достаточно щелкнуть слева от этой строки на серой вертикальной полосе или просто нажать клавишу F9. Строка окрасится в коричневый цвет, а на вертикальной полосе появится кружок такого же цвета. После этого можно просто запустить программу, и как только текущей строкой станет отмеченная, программа остановится, и можно будет продолжить ее исполнение в пошаговом режиме. Для контроля над программой надо иметь возможность следить за значениями переменных. Для этого в момент остановки программы достаточно подвести курсор к имени переменной, и под курсором появится небольшая панелька с информацией о ее значении. - 26 -
Иногда для сложных объектов система не выдает такую подсказку, в этом случае можно воспользоваться окном Quick Watch (Shift+F9) (рис.6). Для этого надо выделить нужный объект или выражение, и нажать комбинацию клавиш Shift+F9. Если необходимо постоянно следить за Рис.6. Окно быстрого просмотра значений некоторыми переменными, то их лучше добавить в панель Watches командой Add Watch (рис.7). В ней можно указать область видимости переменных и условия остановки программы, реализуемой в двух вариантах: когда значение становится равным True или когда оно меняет значение. Рис.7. Окно добавления переменных на панель Watches Умение быстро и эффективно проводить режим отладки программы позволит вам хорошо разрабатывать сложные программы. Теперь остановимся на основных элементах языка программирования. Основные элементы программного кода в среде VBA Описание переменных Переменные в программировании имеют такой же смысл, как в математике. Перед тем, как использовать переменную, ее рекомендуется описать (объявить). Объявление переменных выполняется с помощью следующих описаний: · Dim – стандартное описание, описывающее переменные для данного объекта, в котором это описание используется; - 27 -
· Private – описание переменных только внутри объекта; · Public – описание переменных для нескольких однородных объектов при описании в одном из них. Видимость переменных будет определяться размещением их описания в проекте. Рассмотрим структуру проекта и области видимости переменных, в зависимости от места их описания (рис.8). В каждом из объектов (Лист1(Лист1), ЭтаКнига, UserForm1 и Module1) может находиться код программы и в нем область (General) (см. рис.2), которая содержит блок Рис.8. Дерево проекта (Declaration) для описания переменных. Для доступа к переменным во всем проекте, их надо объявить в Module1 с использованием описания Public, Dim описывает переменные для всех Modules, и использование Private описывает переменные только для текущего модуля. В других объектах (Лист1(Лист1), ЭтаКнига, UserForm1) можно использовать описание Dim, и обычно это описание касается только данного объекта. Попытка описания там общих переменных для всего проекта приводит к ошибкам или созданию различных переменных в разных модулях проекта, что делает программу неработоспособной. Иногда можно описать переменные с помощью Dim внутри подпрограмм, эти переменные будут видны только внутри данной процедуры. Такой подход используется, когда стандартная процедура сделана раньше и импортирована в данный проект, но имена переменных, которые используются в ней, уже имеются в этом проекте, и могут быть изменены при обращении к подпрограмме. Синтаксис оператора описания переменной: Dim переменная
· · · ·
[As тип]
В этой конструкции: Dim (Dimension - размер) - ключевое слово, свидетельствующее о том, что объявляется переменная; переменная - имя объявляемой переменной; Аs (как) - ключевое слово, используемое при задании типа данных; тип – тип данных для объявляемой переменной. - 28 -
Здесь и далее квадратными скобками выделяется необязательная часть конструкции (которая может отсутствовать). Когда при выполнении программы компьютер встречает оператор Dim, он выделяет переменной необходимую область своей оперативной памяти. Размер выделенной памяти, исчисляемый в байтах, определяется типом переменной. Одним оператором Dim можно описать несколько переменных, перечислив их через запятую. Пример: Dim i As Bite, j As Integer, k As Integer
При использовании русских букв следует иметь в виду следующее: хотя некоторые из них (а, е, о, р, с, у, х) имеют такое же написание, как английские буквы, для компьютера буквы с одинаковым русским и английским написанием - разные символы (литеры). Например, переменные с буквами «о», «с», «а», набранные русскими и английскими буквами, являются разными переменными, и при выполнении программы им отводятся разные ячейки оперативной памяти. Поэтому для снижения вероятности ошибок при написании программного кода лучше использовать либо только русские символы или только английские для написания имен переменных и программ. Типы данных Вуtе, Integer, Long, Сиrrеnсу, Single и Double называются числовыми типами данных. Согласно описанию переменной типа Вуtе в ячейке оперативной памяти компьютера могут храниться только числа от 0 до 255; · в ячейке, соответствующей переменной типа Integer или Long, могут храниться положительные и отрицательные целые числа; · в ячейке, соответствующей переменной типа Сиrrеnсу (Денежный), Sinlе (Одинарной точности) или Double (Двойной точноный), могут храниться числа с дробной частью. Если при описании переменной программист не указывает тип данных (например, Dim W), то переменной (W) автоматически будет присвоен тип Variant. Это означает, что в ячейке, соответствующей этой переменной, может храниться информация любого вида, т.е. тип Variant аналогичен формату «Общий» таблиц Excel. Рассмотрим оператор Dim i, j
Если мы хотим, чтобы обе переменные (i, j) имели тип Integer, то должны их описать так: Dim i As Integer, j As Integer - 29 -
Или в два оператора Dim i As Integer Dim j As Integer
Константы Наряду с переменными в VBA используются константы. Как и переменной, константе соответствует область оперативной памяти. Однако в отличие от переменной, содержимое ячейки, соответствующей константе, в программе изменить нельзя. Существует две разновидности констант - пользовательские и встроенные. Пользовательские константы требуют объявления. Для этого используется оператор вида Const константа [As тип] = значение
· · · · ·
В этом операторе: Соnst – ключевое слово, которое показывает, что объявляется константа; Аs – ключевое слово, с которого начинается задание типа данных; константа – имя объявляемой константы; тип - тип данных для объявляемой константы или тип константы; значение – значение, присваиваемое константе. Примеры объявления констант:
Const Const Const Const Const
pi As Double = 3.141592654 e As Double = 2.718282828 Message = "3aвершение paботы" MyDate As Date = #10 Jan 2008# beta As Currency = 1/4 При помощи одного оператора Const можно объявить несколь-
ко констант, перечислив их через запятую. В качестве примера использования констант рассмотрим следующую программу перевода угла (аnglе) из градусной меры в радианную: Public Sub deg2rad() Dim angleD As Double Dim angleR As Double Const pi As Double = 3.141592654 angleD = 270 'Угол равен 270 градусам angleR = angleD * pi/180'Угол в радианах End Sub - 30 -
Обратите внимание, что константа рi объявляется оператором
Const pi As Double = 3.141592654 перед использованием в операторе angleR = angleD * pi/180
Встроенные константы не требуют объявления. Имена встроенных констант Visual Basic начинаются с префикса vb. Слово «префикс» переводится с латинского как «стоящий перед корнем», «приставка». Например нам встретятся следующие встроенные константы: vbCr – перевод строки в текстовой переменной, vbRed, – красный цвет и др. Операторы присваивания Оператор присваивания имеет следующий синтаксис: переменная = выражение В нем переменная – имя переменной, выражение – арифмети-
ческое, логическое выражение или строка, которую можно рассматривать как выражение. Оператор присваивания работает следующим образом: 1) компьютер рассчитывает значение выражения выражение; 2) полученное значение записывается в ячейку оперативной памяти компьютера, соответствующую переменной переменная, т.е. присваивает этой переменной результат вычисления.
Арифметические выражения Одной из основных конструкций любого алгоритмического языка является арифметическое выражение, очень похожее на математическое выражение. Оно содержит постоянные (числа, константы), переменные и/или функции, соединенные между собой знаками арифметических операций. Отдельно взятое число, константа, переменная или функция также является арифметическим выражением. Согласно синтаксису оператора присваивания, арифметическое выражение находится справа от знака присваивания =. Пример. z=5 * х + 12 * у
Арифметические операции обозначаются так: + (сложение), - (вычитание, изменение знака), * (умножение), / (деление), ^ (возведение в степень), \ (целочисленное деление, т.е. деление целых чисел с отбрасыванием остатка), Моd (определение остатка от деления целых чисел, являющегося целым числом). - 31 -
Пример. Public Sub Арифметика1() Dim m As Integer Dim n As Integer Dim x As Double m = 5: n = 2 x = m/n 'Результат: х = 2.5 x = m\n 'Результат: х = 2 x = m Mod n 'Результат: х = 1 End Sub
При наличии в выражении нескольких арифметических операций порядок их выполнения определяется правилом приоритетов арифметических операций – наивысший приоритет имеют функции, потом идет возведение в степень, далее операции умножения и деления и в конце сложение и вычитание. В арифметических выражениях могут присутствовать величины (переменные и постоянные) разных типов. Если тип, полученный при вычислении арифметического выражения в правой части оператора присваивания (справа от знака присваивания =), не совпадает с типом переменной в левой части оператора присваивания (слева от =), то при выполнении оператора присваивания производится преобразование результата к типу переменной. Типичной является ситуация, когда значение арифметического выражения справа от знака присваивания имеет дробную часть, а переменная слева имеет тип Integer или Long. При этом в ходе выполнения присваивания происходит преобразование значения согласно следующему правилу округления: · если дробная часть значения равна или больше 0.5, то это значение округляется до ближайшего большего целого числа; · в противном случае значение округляется до ближайшего меньшего целого числа. При выполнении операций \ и Моd над дробными числами происходит округление операндов до целых чисел, т.к. операции \ и Mоd применимы только к целым числам. Округление производится согласно сформулированному правилу. Результаты выполнения операций \ и Моd являются целыми числами.
- 32 -
Логические выражения Помимо арифметических выражений, в VBA можно использовать логические выражения (утверждения), принимающие одно из двух значений типа Bоо1еаn — Тruе (истина, логическая единица) или False (ложь, логический нуль). Примеры логических выражений: 5 >= 3 5 < 3 False
Знаки >= и < являются известными знаками сравнения «больше или равно» и «меньше». Первое логическое выражение имеет значение Тruе, второе - False, третье - False. Согласно синтаксису оператора присваивания, логическое выражение находится справа от знака присваивания =. Пример. Программа с четырьмя операторами присваивания: Public Sub Dim x As Dim y As Dim blnA x = 5 y = 2 blnA = x blnA = x End Sub
Логика1() Integer Integer As Boolean > y 'Результат: blnA = Тrue = y 'Результат: blnA = False
В программе Логика1 два логических выражения: х > у и х = у. Их значения при х = 5 и у = 2 приведены в комментариях. Текстовые выражения Иногда бывает необходимо построить текстовые строки программно в зависимости от ситуации. Это тоже выражения и требуют знания определенных приемов. Для работы с текстовыми выражениями используется один оператор сцепления строк &. Его лучше всегда ограничивать пробелами. В этих выражениях очень часто используются константы. Например, в выражении, Name=”Вася” X=”Привет “ & Name & VbCr & “Как ты себя чувствуешь?”
представленном следующим образом Привет Вася Как ты себя чувствуешь?
- 33 -
vbCr – константа перевода строки.
Линейные программы Программы пишутся построчно. Все операторы имеют одинаковый отступ и выполняются последовательно друг за другом. Такие программы называются линейными. Ряд операторов, выполняющих идентичные операции, можно располагать в одной строке через «:». Это уменьшает число строк кода, и иногда позволяет легче читать программу, однако при возникновении ошибок надо будет анализировать какой из операторов этой строки содержит ошибку. Поэтому, если пишется большая программа, лучше каждый оператор размещать в отдельной строке кода, что существенно упрощает отладку программы и поиск в ней ошибок. Оператор перехода Для изменения последовательности выполнения операторов (т.е. для ветвления программы) используется оператор перехода GоТо, имеющий следующий синтаксис: GoTo метка
В этом операторе метка - это целое неотрицательное число без знака (0, 1, 2, 3, ...) или последовательность букв и цифр, начинающаяся с буквы (например, start53а). Перед оператором, на который должен быть осуществлен переход (или должно быть передано управление), ставится метка с двоеточием. После выполнения оператора с меткой выполняется оператор, следующий за ним, если помеченный оператор не GоТо. Если меткой является целое неотрицательное число, то это число еще называют номером оператора (строки). Конструкции принятия решений Типичной является ситуация, когда в определенном месте программы необходимо выполнить те или иные операторы в зависимости от некоторых условий. Выбор операторов осуществляется с помощью одной из двух конструкций принятия решений – If … Then и Select … Case.
- 34 -
Ветвление по условиям Первая конструкция принятия решений – If...Then, называется условным оператором. На русский язык «If...Then» переводится как «если...то». Существует несколько разновидностей этой конструкции. Простейший условный оператор: If условие Then оператор
В этой конструкции условие представляет собой логическое выражение. Компьютер рассчитывает значение этого логического выражения. Если оно является Тruе, то будем говорить, что условие истинно. Если значением является False, то будем говорить, что условие ложно. При истинности условия выполняется оператор оператор, находящийся после ключевого слова Then, при ложности оператор не выполняется. Далее выполняется оператор, следующий за конструкцией If...Then, вне зависимости от того, выполнен оператор или нет (если оператор не является оператором перехода GоТо). Рассмотрим следующую программу: Public Sub IT1() Dim X As Byte X = 12 'начальное значение X If (X > 9 And X < 12) Then X = X + 1 X = X + 2 X = X * 2'конечное значение X End Sub
Задание 1) Поставьте точку останова напротив строки End Sub; 2) запустите программу, кликнув на стрелке панели инструментов; 3) убедитесь в том, что в момент останова х равняется 28; 4) объясните этот результат; 5) кликните на стрелке на панели инструментов для окончания выполнения программы; 6) в конструкции If...Then измените условие так, чтобы в момент останова переменная х имела значение 30; 7) текст программы IТ1 верните в исходное состояние. Частным случаем рассмотренной конструкции If...Then является оператор условного перехода, включающий в себя оператор перехода GоТо. Синтаксис оператора условного перехода: If условие Then GоТо метка
- 35 -
Согласно этому оператору, при истинности условия происходит переход на метку метка и выполняется помеченный оператор. Пример Public Sub IT2() Dim X As Integer X = 12 2: If X > 9 And X < 12 Then GоТо LastLine X = X - 2 GoTo 2 LastLine: End Sub
Задание 1) Выполните программу IТ2 пошагово, следя за последовательностью выполнения операторов и изменением значения х; 2) объясните, почему значение х меняется так, а не иначе. Если при истинности условия требуется выполнить несколько операторов, то следует использовать конструкцию вида If условие Then операторы End If
Этот условный оператор работает таким образом. Если условие истинно, то выполняется блок операторов операторы, находящийся после ключевого слова Then. Если же условие Операторы до ложно, то блок операторы не выполняусловия ется. Далее выполняется оператор, следующий за служебным словосочетанием Истина Ложь Условие End If, вне зависимости от того, выОператоры Операторы полнен блок операторы или нет. До этого мы рассматривали операторы, имеющие одно условие, т.е. Операторы после условия неполные операторы, но операторы могут быть и полными (содержать оба условия). Алгоритм полного оператора Рис.9. Схема оператора показан на рис.9. If…Then Он может записываться в одну строку, если имеется не более чем по одному оператору на каждое из условий If Mx<0 Then K=1 Else K=1
Иначе он пишется в несколько строк - 36 -
If Mx<0 Then операторы по условию Истина Else операторы по условию Ложь End If
Эта конструкция условного оператора работает следующим образом. Если условие истинно, то выполняется блок операторы по условию Истина, находящийся после ключевого слова Then. Если условие ложно, то выполняется блок операторы по условию Ложь, находящийся после ключевого слова Else. После выполнения блока операторы по условию Истина или операторы по условию Ложь выполняется оператор, следующий за строкой End If. В качестве примера использования последней конструкции приведем следующую программу: Public Sub IT3() Dim X As Byte X = 12 'начальное значение X If (X > 9 And X < 12) Then X = X + 3 Else X = X + 2 End If X = X * 2'конечное значение X End Sub
В том случае, когда блок операторов нужно выполнять после проверки не одного, а нескольких условий, следует использовать такую конструкцию If…Then: If условие1 Then операторы1 ElseIf условие2 Then операторы2 ElseIf условие3 Then операторы3 ... [Else операторыN] End If
Если первое условие истинно (т.е. логическое выражение условие1 имеет значение Тrие), то выполняется блок операторы1. Если оно ложно, то проверяется второе условие, находящееся после ключе- 37 -
вого слова ElseIf. При истинности второго условия (т.е. если логическое выражение условие2 имеет значение Тrие) выполняется блок операторы2, и т.д. Если ни одно из условий не являются истинным, то выполняется блок операторыN, расположенный после ключевого слова Else. Далее выполняется оператор, следующий за служебным словосочетанием End If, вне зависимости от того, какой из блоков (операторы1, операторы2,... или операторыN) выполнен. Иногда можно пользоваться функцией условием переменная = IIf(условие, выражение1, выражение2) В ней условие представляет собой логическое выражение, а выражение1 и выражение2 — арифметические или логические вы-
ражения или строки, которые можно рассматривать как выражения. Функция IIf возвращает в программу значение выражения выражение1 или выражение2 в зависимости от того, какое значение принимает логическое выражение - Тrие или False. Пример Public Sub IT4() Dim intA As Integer Dim strA As String intA = 6 strA = IIf(intA Mod 2 = 0, "Четнoe", "Heчeтнoe") End Sub Примером может служить выражение К=IIf(Mx<0, 1,-1).
Однако надо помнить, что оба выражения внутри оператора должны всегда иметь решения. Например, если в выражении стоят не конкретные числа, а исполняемые операторы и какая-либо переменная в них определяется начальным условием, то оператор всегда будет выдавать ошибку, так как не сможет вычислить оператор полностью – X=IIf(Y<>0, Z/Y, Z). В данной ситуации программа всегда будет пытаться поделить Z на Y и при равенстве Y нулю будет выводиться ошибка. Это условие обязательно надо писать в нормальной структуре If. Вторая конструкция принятия решений (или ветвления) – Select Case, называемая оператором выбора: Sеlесt Саsе выражение Саsе значение1 операторы1 Саsе значение2
- 38 -
операторы2
… [Саsе Е1sе операторыN] Еnd Sеlесt В ней выражение — арифметическое или логическое выраже-
ние или строка. Работает оператор выбора следующим образом. Если выражение принимает значение значение1, то выполняется блок операторов операторы1. Если выражение принимает значение значение2, то выполняется блок операторы2 и т.д. Если выражение не равно ни одному из приведенных значений, то выполняется блок операторыN, находящийся после служебного словосочетания Саsе Еlsе. Далее выполняется оператор, следующий за строкой Еnd Sеlесt, вне зависимости от того, какой из блоков (операторы1, операторы2, ... или операторыN) выполнен. В том случае, когда при нескольких значениях выражения выражение необходимо выполнить один и тот же блок операторов, эти значения нужно перечислить после ключевого слова Саsе, разделяя их запятыми. Пример Public Sub Bыбop () Dim x As Integer x = 1 Select Case 2 * x + 1 Case 1 x = x + 1 Case 2, 3, 4 x = 10 Case Else x = 20 End Select x = x Mod 3 End Sub
Циклы в программе Часто в программах надо повторить часть операторов несколько раз. Для многократного выполнения блока операторов используется один из трех операторов цикла – For … Next:, While … Wend или Dо … Lоор. - 39 -
Часто заранее известно сколько раз надо повторить цикл, например, надо ввести данные в массив из 5 элементов, но бывают случаи, когда число повторений не известно, например, I=1,10,2 надо найти первую пустую ячейку на листе. Иногда возникают ситуации, когда блок внутри Операторы цикла может быть просто обойден (например, цикла первая ячейка пустая). Цикл For … Nехt используется в том случае, когда количество выполнений заданного блока операторов известно заранее. АлРис.10. Алгоритм цикла For … Next горитм цикла представлен на рис.10. Данная конструкция имеет следующий синтаксис: For счетчик = начало To конец [Step шаг] onepaтopы Next [счетчик] При положительном значении величины шаг цикл For … Next
работает следующим образом. Переменной счетчик сначала присваивается значение начало. Далее проверяется условие счетчик > конец. Если результатом проверки этого условия является значение Тruе, то происходит окончание работы цикла. При этом операторы цикла операторы ни разу не выполняются. Если результатом проверки условия счетчик > конец является False, то в этом случае операторы цикла выполняются первый раз. После этого происходит переход на начало цикла. Далее значение переменной счетчик увеличивается на величину шага шаг, после чего снова проверяется условие счетчик > конец. Если результатом является Falsе, то операторы цикла выполняются второй раз, и т.д. Выполнение цикла оканчивается, когда результатом проверки условия счетчик > конец становится Тruе. По окончании цикла выполняется оператор, следующий за циклом, т.е. за ключевым словом Next. Пример. Программа расчета факториал числа 6 имеет следующий вид: Public Sub Фaкториал1() Dim I As Byte Dim F As Long F = 1 - 40 -
For I = 1 To 6 Step 1 F = F * I Next I End Sub
Напомним, что факториал целого положительного числа n обозначается n! и (согласно определению) n! равняется произведению целых чисел от 1 до n: n! = 1 *2 * ... *n. Для результата отводится ячейка, в которую до начала простого цикла записывается 1, в данном случае F=1. Пример. Второй вариант программы расчета 6! Public Sub Фaкториал2() Dim I As Byte Dim F As Long F = 1 For I = 6 To 1 Step -1 F = F * I Next I End Sub
В случае отсутствия ключевого слова Step шаг изменения переменной счетчик полагается равным единице. В качестве параметров цикла начало, конец и шаг можно использовать не только числа, но и арифметические выражения. Важно, чтобы к моменту выполнения цикла For … Next все переменные в этих арифметических выражениях имели числовые значения (были определены). Зачастую требуется досрочно выйти из цикла. В этом случае цикл For … Next записывается в виде For счетчик = начало To конец [Step шаг] onepaтopы1 If условие Then Exit For onepaтopы2 Next [счетчик]
Досрочное окончание цикла обеспечивается оператором, обозначаемым служебным словосочетанием Exit For. Работает цикл следующим образом. При каждом значении переменной счетчик после выполнения блока операторы1 компьютер рассчитывает значение логического выражения условие. Если это значение равно False, то работа цикла продолжается. В противном случае работа цикла оканчивается: блок - 41 -
операторы2 не выполняется, а осуществляется переход на оператор,
следующий за циклом. Пример. Четвертый вариант программы расчета 6! Public Sub Фaктopиал4() Dim I As Byte Dim F As Long F = 1 For I = 1 To 13 Step 1 F = F * I If I = 6 Then Exit For Next I End Sub
Часто в примерах встречается задача накопления суммы, которая решается с помощью оператора цикла. Для результата, как и в случае вычисления произведения, отводится ячейка, в которую перед началом простого цикла записывается ноль, например S=0. Сумма накапливается в ячейке S путем многократного выполнения оператора присваивания S=S + слагаемое, который располагается внутри простого цикла. Результат получается в ячейке S по окончании работы простого цикла, т.е. печать S и другие действия с S выполняются после оператора Next. Пример Найдите сумму слагаемых вида 5х2, для х, изменяющегося от 5 до 15 с шагом 0,3. Public Sub Sum() S=0 For x = 5 To 15 Step 0.3 S=S+5*x^2 Next x End Sub
Существуют два варианта циклов – первый, который мы подробно рассмотрели ранее, выполняется по счетчику, определяемому в операторе. Второй вариант оператора – перебор всех объектов в коллекции (это все листы книги, ячейки листа или выделенного диапазона и др.). Этот оператор часто используется для работы со всеми листами книги, которые описаны коллекцией «Sheets» или других объектов. Записывается оператор следующим образом: - 42 -
For each Sh in ActiveWorkbook.Sheets … Next
Здесь нет в конце имени счетчика, переменная Sh является объектом коллекции. Цикл применяется в том случае, когда число выполнений операторов цикла заранее неизвестно. Синтаксис этого цикла: While условие oпepaторы Wend
Работа цикла While … Wend начинается с расчета значения логического выражения условие. Если условие = False, то работа цикла заканчивается, т.е. осуществляется переход на оператор, расположенный после ключевого слова Wend. Если условие = Тruе, то выполняются операторы цикла операторы. После этого опять рассчитывается значение логического выражения условие, и т.д. Пример. Пятый вариант программы расчета 6! Sub Факториал5() Dim I As Byte Dim F As Long F = 1: I = 1 While I <= 6 F = F * I I = I + 1 Wend End Sub Цикл Do … Lоор, как и цикл While … Wend, применяется, ко-
гда число выполнений операторов цикла заранее неизвестно. Он имеет два варианта оформления – с предусловием и постусловием (рис.11). Предусловие
Операторы цикла
Операторы цикла
Постусловие
Рис.11. Алгоритмы цикла Do … Loop с предусловием и постусловием, соответственно. - 43 -
Для проверки условий используются две формы, которые оформляются служебными словами – While (Пока), когда цикл выполняется пока условие «Истина» и Until (До тех пор), в нем цикл выполняется пока условие «Ложь». Это позволяет легко находить варианты условий. Существует четыре разновидности данной конструкции. Первой разновидностью является цикл Do While … Lоор, имеющий следующий синтаксис: Do While условие операторы Loop Работа цикла Do While … Lоор начинается с расчета значения логического выражения условие. Если условие = False, то работа
цикла оканчивается, т.е. осуществляется переход на оператор, расположенный после ключевого слова Lоор. Если условие = Тruе, то выполняются операторы цикла операторы. После этого опять рассчитывается значение логического выражения условие, и т.д. Цикл Do While … Lоор эквивалентен рассмотренному ранее циклу While … Wend. Пример. Шестой вариант программы расчета 6! Sub Факториал6() Dim I As Byte Dim F As Long F = 1: I = 1 Do While I <= 6 F = F * I I = I + 1 Loop End Sub
Пример. Программа «шагания» по оси координат:
Sub Stepsl() Dim x As Single Dim h As Single h = 0.5 'величина шага равна 0.5 x = 44 'начальное значение х равно 44 Do While x < 55 'конечное значение х равно 55 x = x + h 'значение х увеличивается на h Loop ‘do while… - делай пока выполняется … End Sub - 44 -
Упрощенная форма цикла с предусловием и проверкой по While записывается в форме While X<10: X=X+1: Wend Вторая разновидность конструкции Do … Lоор - цикл Do Until … Lоор. Синтаксис этого цикла:
Do Until условие операторы Lоор Работа цикла Do Until … Lоор начинается с расчета значения логического выражения условие. Если условие = Тruе, то работа
цикла оканчивается, т.е. осуществляется переход на оператор, расположенный после ключевого слова Lоор. Если условие = False, то выполняются операторы цикла операторы. После этого опять рассчитывается значение логического выражения условие, и т.д. Пример. Второй вариант программы «шагания» по оси координат: Sub Steps2() Dim x As Single Dim h As Single h = 0.5 'величина шага равна 0.5 x = 44 'начальное значение х равно 44 Do Until x >= 55 'конечное значение х равно 55 x = x + h 'значение х увеличивается на h Loop 'do until… - делай до выполнения End Sub Видно, что в циклах Do While … Lоор и Do Until … Lоор
существует ситуация, когда операторы цикла не выполняются ни разу, т.к. условие окончания цикла проверяется перед выполнением этих операторов. Третья разновидность конструкции Do … Loop - цикл Do … Lоор While - имеет синтаксис Do
операторы Loop While условие Работа цикла Do … Lоор While начинается с выполнения операторов цикла операторы. После этого рассчитывается значение логического выражения условие. Если условие = False, то работа
цикла оканчивается. В противном случае опять выполняются операторы цикла, и т.д. - 45 -
Пример. Третий вариант программы «шагания» по оси координат: Sub Steps3() Dim x As Single Dim h As Single h = 0.5 x = 44 Do x = x + h Loop While x < 55 End Sub
'величина шага равна 0.5 'начальное значение х равно 44 'значение х увеличивается на h 'конечное значение х равно 55
Четвертая разновидность конструкции Do … Loop - цикл Do … Lоор Until - имеет синтаксис Do
операторы Loop Until условие Работа цикла Do … Lоор Until начинается с выполнения операторов цикла операторы. После этого рассчитывается значение логического выражения условие. Если условие = Тruе, то работа
цикла оканчивается. В противном случае опять выполняются операторы цикла, и т.д. Пример. Четвертый вариант программы «шагания» по оси координат: Sub Steps4() Dim x As Single Dim h As Single h = 0.5 x = 44 Do x = x + h Loop Until x >= 55 End Sub
'величина шага равна 0.5 'начальное значение х равно 44 'значение х увеличивается на h 'конечное значение х равно 55
Видно, что в последних двух разновидностях цикла Do … Loop операторы цикла операторы хотя бы один раз обязательно выполняются, т.к. условие окончания цикла проверяется после выполнения этих операторов. Внутри цикла Do … Loop может находиться оператор Ехit Dо, предназначенный для досрочного выхода из цикла. Употребляется этот оператор так же, как Ехit For в цикле For … Next, - он входит в состав условного оператора. - 46 -
Отметим, что для цикла While … Wend не существует оператора досрочного выхода из цикла. Массивы Массивом называется последовательность или таблица переменных одного типа, называемых элементами массива. В обращении к элементу указывается имя массива и один или несколько индексов. Прежде чем использовать массив, его следует описать (объявить). Кроме того, для каждого индекса должны быть определены нижняя и верхняя границы, в пределах которых индекс может меняться. Существует два вида массивов - статические и динамические. Для каждого вида массивов изложение будем вести по такой схеме: сначала рассмотрим одномерные массивы, имеющие один индекс, а затем - многомерные, имеющие несколько индексов, и одномерные как частный случай многомерных. Статические массивы. При описании статического одномерного массива задаются нижняя и верхняя границы для индекса, определяющие количество элементов массива, причем заданные границы не могут быть изменены в программе. Статические массивы описываются в программе так же, как и переменные, т.е. при помощи ключевых слов Dim и Аs. Границами являются целые числа в круглых скобках. Между нижней и верхней границами ставится ключевое слово То. Примеры Dim arrB(l To 10) As Integer Dim A(-10 To 10) As String
Если в скобках указано только одно целое число, то это - верхняя граница. При этом нижняя граница полагается равной нулю. Пример Dim arrA(9) As Byte
Этот оператор эквивалентен оператору Dim arrA(0 To 9) As Byte
Если нужно, чтобы нижней границей массивов была единица, то перед первой строкой программы следует набрать строку Option Base 1
При этом оператор последнего примера будет эквивалентен следующему: Dim arrA(l To 9) As Byte - 47 -
В качестве примера рассмотрим следующую программу: Sub СтатическиеMaccивы() Dim B1(1 To 6) As Byte, S1 As Byte Dim B2(1 To 6) As Integer, S2 As Integer Dim B3(1 To 6) As Long, S3 As Long Dim I As Byte ‘Определение первых пяти элементов массивов: For I=1 To 5 B1(I) = I B2(I) = I ^ 2 B3(I) = I ^ 3 Next I ‘Определение шестых элементов массивов: S1 = 0 S2 = 0 S3 = 0 For I = 1 To 5 S1 = S1 + B1(I) S2 = S2 + B2(I) S3 = S3 + B3(I) Next I B1(6) = S1 B2(6) = S2 B3(6) - S3 End Sub В программе СтатическиеМассивы:
· первый оператор цикла используется для определения первых пяти элементов массивов В1, В2 и BЗ; по окончании этого цикла первые пять элементов массивов имеют числовые значения, равные 1-ой, 2-ой и 3-ей степеням значений I: В1(1)= 1, В1(2)= 2, ..., В1(5)= 5;
В2(1)= 1, В2(2)= 4, ..., В2(5)= 25;
В3(1)= 1, В3(2)= 8, ..., В3(5) = 125;
· второй оператор цикла используется для суммирования определенных ранее элементов массивов; по окончании этого цикла суммы первых пяти элементов массивов В1, В2 и В3 соответственно равны S1 = 15, S2 = 55 и S3 = 225; · в конце программы шестые элементы массивов полагаются равными найденным значениям сумм: В1(6) = 15, В2(6) = 55 и - 48 -
В3(6) = 225.
Как уже говорилось, массивы бывают одномерными и многомерными. Выше рассмотрены одномерные массивы. Одномерный массив аналогичен строке или столбцу таблицы Ехсеl и вектору в математике. Для описания многомерных массивов (имеющих несколько индексов) используются конструкции, аналогичные рассмотренной. Отличие состоит в том, что указывается несколько границ, через запятую. Примеры Dim A(4, 4) As Byte Dim B(l To 5, -5 To -1) As Byte
В данных примерах объявленные массивы A и В являются двумерными и содержат одинаковое количество элементов, равное 5 ´ 5 = 25. Двумерный массив аналогичен прямоугольному диапазону ячеек таблицы Ехсеl и матрице в математике. Обращение к элементу многомерного массива осуществляется при помощи имени массива и индексов, перечисленных через запятую. Примеры обращений: A(i, j + 1) =17 B(2, -3) = 25.5 b = C(K, 25)
Пример описания трехмерного массива, содержащего 5´5´5= 125 элементов: Dim C(l To 5, -5 To -1, 4) As Byte
Максимальное число «измерений» массива очень велико - 60. Динамические массивы используются в том случае, когда количество элементов массива заранее неизвестно, а определяется в процессе выполнения программы. По окончании работы с динамическим массивом можно освободить память, которую он занимает. Это важно для задач, требующих большого объема оперативной памяти. Описание динамического массива осуществляется в два этапа. 1. Объявляется массив с использованием оператора Dim, но без указания размерности. Признаком массива являются скобки после его имени. 2. В нужном месте программы описывается данный массив с указанием размерности при помощи оператора ReDim, причем в качестве границ можно использовать не только целые числа, но и арифметические выражения. Важно, чтобы к моменту выполнения опера- 49 -
тора ReDim все переменные в этих арифметических выражениях имели числовые значения. Пример Sub ДинамическийМассив() Dim A() As Byte ‘объявление массива Dim M As Integer Dim N As Integer M = 3 ReDim A(-5 To M^2) ‘указание размерности For N = -5 To M^2 A(N) = N + 30 Next N ReDim A(5) ‘указание размерности N = 0 Do A(N) = N^3 N = N + 1 Loop Until N^2 >10 End Sub
Задание. После ввода последней программы в окно кода выполните следующие операции. 1. Установите мигающий курсор на переменной А (точнее, слева или справа от А) и выполните Debug (Отладка) ð Аdd Watch (Добавить контрольное значение). Появится окно Аdd Watch (Добавление контрольного значения), содержащее А в текстовом поле Ехрression (Выражение). 2. Нажмите кнопку ОК. Появится окно Watches (Контрольные значения) со строкой, соответствующей массиву А. 3. Установите мигающий курсор в любом месте текста программы. 4. Произведите пошаговое выполнение программы, наблюдая за изменением значений элементов массива А с помощью окна Watches (Контрольные значения). Чтобы в окне Watches (Контрольные значения) появились элементы массива А, надо кликнуть на знаке «плюс» слева от А. 5. Удалите строку из окна Watches (Контрольные значения), кликнув на ней (для выделения) и нажав клавишу Dеlеtе. При помощи оператора Redim можно задавать любые размерно- 50 -
сти массива. Пример Dim arrA() As Byte ReDim arrA(1, 1) 'двумерный массив arrA(0, 0) = 13 arrA(l, 1) = 14 ReDim arrA(3, 3, 1 To 3) ‘трехмерный массив
Следует иметь в виду, что при каждом выполнении оператора ReDim (т.е. при каждом переопределении массива) значения элементов массива будут потеряны, т.к. оператор ReDim обнуляет все элементы массива. Для того чтобы при переопределении массива значения элементов не пропали, следует использовать ключевое слово Рreservе. Пример Sub Сохранение1() Dim J As Integer Dim arrA() As Integer ReDim arrA(-5 To 1) ‘указание размерности For J = -5 To 1 arrA(J) = J^2 Next J ReDim Preserve arrA(-5 To 4) ‘указание размерности For J = 2 To 4 arrA(J) = J^3 Next J End Sub Задание. Произведите пошаговое выполнение программы Сохранение1, наблюдая за значениями элементов массива arrА с по-
мощью окна (Контрольные значения). Отметим, что в последней программе ключевое слово Preserve используется при изменении верхней границы одномерного массива. При изменении нижней границы Preserve использовать нельзя. В случае многомерного массива ключевое слово Preserve можно использовать только при изменении верхней границы последнего «измерения» массива. Пример Sub Сохранение2() Dim I As Integer Dim J As Integer Dim arrA()As Integer
‘объявление массива - 51 -
ReDim arrA(2, -5 To 1) ‘указание размерности For I = 0 To 2 For J = -5 To 1 arrA(I, J) = (I + 1) * J^2 Next J Next I ReDim Preserve arrA(2,-5 To 4) 'указание размерности For I = 0 To 2 For J = 2 To 4 arrA(I, J) = (I + 1) * J^3 Next J Next I End Sub
Задание. Произведите пошаговое выполнение программы Сохранение2, наблюдая за значениями элементов массива аrrА с помощью окна Watches (Контрольные значения). Существует возможность определения значений нижней и верхней границ массива любой размерности. Для этого следует использовать функции LBound и UBound соответственно. Пример. Использование функций LBound и UBound для определения границ одномерного массива аrrА: Dim Low As Long Dim Up As Long Low = LBound(arrA) 'Low – нижняя граница массива Up = UBound(arrA) 'Up - верхняя граница массива Функция UBound необходима, например, когда значение верх-
ней границы одномерного массива неизвестно и при этом необходимо увеличить это значение на определенное число. Как говорилось выше, преимуществом динамического массива перед статическим является то, что оперативная память, занимаемая динамическим массивом, может быть освобождена. Для этого используется оператор Еrasе. Пример Sub Память() Dim A() As Byte Dim B() As Byte ReDim A(8) 'Память для А: 9+4+20=33 байта Erase A 'Память для А: 0 байтов ReDim B(2) 'Память для В: 9+8+20=37 байтов - 52 -
End Sub
Задание. После ввода программы Память в окно кода нового модуля выполните следующее. 1. Дважды выполнив Debug (Отладка) ð Аdd Watch (Добавить контрольное значение), в окне Watches (Контрольные значения) сгенерируйте строки, соответствующие массивам А и В. 2. Кликните в любом месте текста программы для установки там мигающего курсора. 3. Произведите пошаговое выполнение программы Память, наблюдая за распределением памяти с помощью окна Watches (Контрольные значения). Для решения многих математических задач требуются массивы случайных чисел. Пример. Программа, рассчитывающая 10 случайных чисел от 0 до 1, имеет вид Sub Случайные числа() Dim N As Long Dim I As Long Dim S() As Single N = 10 ReDim S(1 To N) Randomize For I = 1 To N S(I) = Rnd Next I End Sub
Случайные числа рассчитываются с помощью функции Rnd. В данном случае обращение к ней производится в цикле For … Next. Перед серией обращений к функции Rnd должен находиться оператор Randomize, который разгоняет генератор случайных чисел, что обеспечивает получение различных наборов случайных чисел. Задание. Выполните последнюю программу пошагово, наблюдая за значениями элементов массива 5 с помощью окна Watches (Контрольные значения). Пользовательские процедуры Блок операторов, предназначенный для многократного выполнения в разных точках программы, целесообразно оформить как процедуру. При этом блок записывается один раз и ему присваивается имя с пара- 53 -
метрами (формальными). Эта запись блока операторов называется описанием процедуры. В общем случае процедура имеет: · входные параметры, которые считаются заданными; · выходные параметры, рассчитываемые в ходе выполнения блока операторов. После того, как произведено описание процедуры, в программу помещаются обращения к этой процедуре с нужными параметрами (фактическими). Эти обращения помещаются в те точки программы, в которых по смыслу должен присутствовать блок операторов, оформленный как процедура. Процедуры делятся на функции и подпрограммы. Функции можно использовать в арифметических и логических выражениях и строках (т.к. функция принимает значение); подпрограммы в выражениях и строках использовать нельзя. В этом состоит основное отличие функций от подпрограмм. Описание пользовательской функции имеет следующий синтаксис: Function название (формальные_параметры) [Аs тип] операторы End Function где название - имя функции; формальные_параметры - имена параметров, перечисленные через запятую; тип - тип значения функции; операторы - блок операторов. В блоке операторы обязательно должен присутствовать хотя бы
один оператор присваивания, в левой части которого (слева от знака присваивания =) находится имя функции название. Обращение к функции (находящееся в программе) имеет вид
название(фактические_параметры) где фактические_параметры - массивы, переменные, константы,
числа и/или строки, перечисленные через запятую. В результате обращения к функции название в программу возвращается значение этой функции, соответствующее заданным параметрам. Рассмотрим следующий код программы и описания функции, находящихся в одном модуле: Sub Program1() Dim L As Long Dim W As Double L = Fact(12) - 54 -
W = 4.2 + Fact(10)/2 End Sub Function Fact(N) As Long Dim I As Byte Dim J As Long J = 1 For I = 1 To N J = J * I Next I Fact = J End Function
’N<13
Первая группа операторов - это программа Рrogram1. Вторая группа операторов - описание функции Fасt, которая рассчитывает факториал целого положительного числа N, являющегося формальным параметром. В программе два обращения к функции Fасt, с фактическими параметрами 12 и 10. 1. Обращение к функции Fасt фигурирует в правой части оператора присваивания L = Fасt(12). В результате выполнения этого оператора значение функции Fасt при N = 12 (т.е. значение, возвращаемое функцией Fасt в программу) присваивается переменной L. 2. Обращение к функции Fасt фигурирует в арифметическом выражении 4.2 + Fасt (10)/2. Значение этого арифметического выражения присваивается переменной W. Описание пользовательской подпрограммы имеет следующий синтаксис: Sub название (формальные_параметры) операторы Еnd Sub где название - имя подпрограммы; формальные_параметры - имена параметров, перечисленные через запятую; операторы - блок
операторов. Имеется два эквивалентных оператора обращения к подпрограмме: Саll название (фактические_параметры) название фактические_параметры
где фактические_параметры - список фактических параметров, как в - 55 -
обращении к функции. При наличии ключевого слова Саll список фактические_параметры заключается в скобки, в отсутствие Саll скобки не ставятся. Рассмотрим следующий код программы и описания подпрограммы, находящихся в одном модуле: Sub Program2() Dim aa As Single Dim bb As Single Dim ccl As Single Dim cc2 As Single Dim cc3 As Single aa = 3 bb = 4 Call Hypotenuse (aa, bb, cc1) '1-е обращение к подпрограмме Call Hypotenuse (3, 4, cc2) '2-е обращение к подпрограмме Hypotenuse aa, bb, cc3 '3-е обращение к подпрограмме End Sub Sub Hypotenuse(ByVal A, ByVal B, ByRef C) C = Sqr(A^2 + B^2) End Sub Первая группа операторов - это программа Рrogram2, вторая описание подпрограммы Hypotenuse, рассчитывающей длину ги-
потенузы прямоугольного треугольника. В программе Рrogram2 имеется три оператора обращения к подпрограмме Hypotenuse, причем два из них содержат ключевое слово Саll, а одно не содержит. Формальные параметры А и B (в описании подпрограммы) являются входными. Это - длины катетов. Ключевое слово ВуVаl перед А и B в первой строке подпрограммы означает, что эти параметры вызываются по значению (vа1uе - значение). В этом случае при обращении к подпрограмме ей передаются значения А и B. Это - соответственно 3 и 4 при всех трех обращениях к подпрограмме Hypotenuse. Формальный параметр C является выходным. Это - длина гипотенузы. Ключевое слово ВуRef перед C в первой строке подпрограммы означает, что параметр C вызывается по ссылке (referenсе - ссыл- 56 -
ка). В этом случае при обращении к подпрограмме ей передается адрес ячейки оперативной памяти, соответствующей переменной сс1 (при первом обращении к подпрограмме Hypotenuse), сс2 (при втором обращении) или сс3 (при третьем обращении). Ключевое слово ВуRef можно опускать. В рассмотренном коде параметры А, В и С - простые переменные (не массивы). Если параметрами подпрограммы являются массивы, то все они (и входные, и выходные) вызываются по ссылке. Рассмотрим следующий код: Dim N1 As Integer Sub Program3() Dim xx(50) As Double, yy(50) As Double Dim i As Integer N1 = 3 For i = N1 To 30 xx(i) = 0.1 * i Next i Call XSINX(30, xx, yy) 'обращение к программе End Sub Sub XSINX(ByVal N2, ByRef X() As Double, _ ByRef F() As Double) Dim j As Integer For j = N1 To N2 F(j) = X(j) * Sin(X(j)) Next j End Sub
Кроме использования массивов в качестве параметров подпрограммы, в последнем коде есть еще нечто новое: переменная N1 объявлена перед первой строкой программы. Это сделано для того, чтобы переменная N1 была «видима» (в плане возможности использования) и в программе, и в подпрограмме. Вернемся к вопросу объявления переменных. До сих пор мы говорили о том, как объявлять переменные, но не говорили, где их объявлять. Их можно объявлять в двух местах: · внутри программы или процедуры; · в верхней части окна кода, которая называется областью общих объявлений модуля. Место объявления переменной определяет область ее использо- 57 -
вания. Если, например, переменная объявлена в процедуре (как переменная j в последнем коде), то только эта процедура ее видит. Другие процедуры (если они есть) и программа не могут использовать значение этой переменной и менять его. Такую переменную называют локальной. Говорят также, что переменная видима на уровне процедуры. Чтобы значение переменной было доступно всем процедурам данного модуля, ее надо объявить в области общих объявлений модуля (как объявлена переменная N1 в последнем коде). Тогда программа и все процедуры, определенные в данном модуле, могут использовать значение этой переменной и менять его. Такую переменную называют глобальной. Говорят также, что переменная видима на уровне модуля. Сказанное относительно переменных относится и к пользовательским константам, но значение константы, естественно, нельзя менять. Задание. Произведите выполнение программ Рrogram1, Рrogram2 и Рrogram3 с помощью клавиш F8 и Сtrl + F8. Перед первым нажатием клавиши F8 мигающий курсор должен находиться в тексте программы, а не процедуры. Среди параметров процедуры (функции или подпрограммы), кроме обязательных параметров, могут быть и необязательные, которые могут отсутствовать в обращении к процедуре. Объявление необязательности параметра осуществляется при помощи ключевого слова Орtiопаl, которое ставится перед именем этого параметра в первой строке описания процедуры. Необязательный параметр должен иметь тип Variant. Пример Sub Program4() Dim vntA As Byte Dim vntB As Byte Dim C As Integer vntA = 5 vntB =10 C = Apt (vntA, vntB) 'Peзультат: vntB = 6, C = 625 vntB = 10 C = Apt (vntA) 'Peзультат: vntB = 10, C = 625 End Sub Function Apt(ByVal a, Optional b As Variant) - 58 -
If Not IsMissing(b) Then b = a + 1 Apt = a^4 End Function В этом примере параметр b функции является необязательным, о чем говорит Орtiоnаl перед b. Словосочетание As Variant после b можно опустить. В описании функции Арt: · Not - логическая операция; · IsMissing – функция. Значение IsMissing (b) равно Тruе при отсутствии второго параметра в обращении к Арt и Fа1sе при наличии этого параметра.
Задание. Произведите пошаговое выполнение программы Program4, наблюдая за изменением значений переменных vntB и C. Существует возможность указывать значение, которое должен принимать необязательный параметр при его отсутствии в обращении к процедуре. Пример Sub Program5() Dim vntA As Byte Dim vntB As Byte Dim vntC As Byte vntA = 5 vntB = 10 Call Opt(vntA, vntC, vntB) vntB =10 Call Opt(vntA, vntC) End Sub
'Результат: vntC = 15 'Результат: vntC = 8
Sub Opt(ByVal a, c, Optional b = 3) c = a + b End Sub В приведенном примере параметр b подпрограммы Орt является необязательным, причем если в обращении к Орt присутствуют только два фактических параметра, то при выполнении оператора с = а + b полагается b = 3.
Задание. Произведите пошаговое выполнение программы Рrogram5, наблюдая за изменением значения переменной vntС. Рассмотренные программы использовали по одной пользовательской процедуре. Так, например, программа Рrogram1 использовала - 59 -
только функцию Fact (с помощью этой функции рассчитывались значения L и W). Однако пользовательских процедур может быть несколько. Две основные функции преобразования типов данных Строкой называется последовательность символов (текст), взятая в кавычки. Примеры строк: "Мир всем народам!" "75"
"100 рублей" "Х=96.12"
Часто бывает необходимо преобразовать строку в число. Для этого используется функция Val. Она преобразует числовое начало строки в число. Если функция Val этого сделать не может, то она возвращает 0. Аргументом функции Val является строка; а возвращает эта функция число. Для обратного преобразования (т.е. числа в строку) используется функция Str. Аргументом этой функции является число, переменная какого-либо из числовых типов или арифметическое выражение. Возвращает функция Str строку. Чтобы понять принципы преобразования посмотрите и исполните приведенную ниже программу. Задание. Путем пошагового выполнения (программу запускаете не командой Run, а выполняете ее пошагово с помощью клавиши F8) проверьте правильность работы следующей программы: Public Sub StrVal() Dim strA As String Dim curB As Currency strA = "45,77" curB = Val(strA) strA = Str(curB) сurB = Val("4,7 = X") curB = Val("X = 4,7") End Sub
'Результат: 'Результат: 'Результат: 'Результат:
curB strA curB curB
= 45,77 ="45,77" = 4,7 = 0
Первый комментарий соответствует случаю, когда при пошаговом выполнении программы желтым выделен оператор strA = Str(curB)
Этот комментарий означает следующее: если указатель мышки подвести к curB, то высветится curB = 45.77 - результат выполнения оператора, находящегося в одной строке с комментарием. Второй комментарий соответствует случаю, когда желтым выделен оператор сurB = Val("4.7 = X"). - 60 -
Этот комментарий означает: если указатель мышки подвести к strA, то высветится strA = " 45.77" и т.д. Аналогичный смысл имеют все комментарии в программах, начинающиеся со слова «Результат». Подчеркнем, что при остановах во время выполнения программы желтым цветом выделяется первый из невыполненных операторов. Ввод, вывод и генерация исходных данных В VВA имеется большое количество встроенных процедур, которые отличаются от пользовательских процедур тем, что их описания были запрограммированы разработчиками Visual Ваsic for Application. От пользователя компьютера тексты встроенных процедур скрыты. К встроенным функциям относится функция, предназначенная для ввода информации (в программу) с помощью стандартных окон Windows. Примером встроенной подпрограммы является подпрограмма, предназначенная для вывода информации (из программы) в стандартные окна Windows. Используем встроенные процедуры InputВох и МsgВох в программе расчета длины гипотенузы прямоугольного треугольника по длинам катетов. 1. В окно кода введем программу Sub Pythagoras() Dim a As Single Dim b As Single Dim c As Single Dim s As String 1: s = _ InputBox ("Введите длину 1 катета и нажмите ОК") 2: a = Val(s) 3: s = _ InputBox ("Введите длину 2 катета и нажмите ОК") 4: b = Val(s) 5: c = Sqr(a^2 + b^2) 6: s = Str(c) 7: MsgBox s End Sub 1. Запустим программу Pythagoras. Появится окно, предлагающее
ввести длину первого катета (рис.12). С помощью клавиатуры вве- 61 -
дем в текстовое поле, например, значение 400 (без кавычек), и нажмем кнопку ОК. 2. Появится окно, предлагающее ввести длину второго катета (рис.13). Введем, например, значение 300; после этого нажмем кнопку ОК. 2. Появится окно, содержаРис.12. Первое окно для ввода исходных щее рассчитанное значеданных ние длины гипотенузы (рис.14). 3. Кликнем на кнопке ОК для закрытия окна и завершения выполнения программы Pythagoras. Первый оператор программы (с меткой 1) содерРис.13. Второе окно для ввода исходных дан- жит функцию InputBox. ных Она используется для ввода информации с клавиатуры. Возвращает эта функция строку, введенную в текстовое поле окна на рис.12, т.е. "400". Эта строка присваивается переменной s строкового типа. Второй оператор преобразует значение строки s в число 400 и присваивает это значение переменной числового типа а. Третий оператор Рис.14. Окно с результатом расчета присваивает переменной s строку "300", введенную в текстовое поле окна на рис.13. Четвертый оператор преобразует значение строки s в число 300 и присваивает это значение переменной b. Пятый оператор рассчитывает длину гипотенузы по теореме Пифагора. Полученное значение 500 присваивается переменной числового типа с. Шестой оператор преобразует значение 500 в строку. В результате выполнения этого оператора переменная s принимает значение "500". Седьмой оператор, представляющий собой обращение к подпрограмме МsgВох, выводит на экран окно с рассчитанным значением 500 (рис.14). - 62 -
В обращениях к процедурам InputBox и МsgВох фигурирует один параметр (строкового типа), который является обязательным. Однако параметров может быть несколько. Назначение необязательных параметров можно посмотреть в справочной системе, вызываемой нажатием клавиши F1. В общем виде формат записи функции InputBox имеет следующий вид: InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]) где: prompt – комментарий к вводимой информации; title – заголовок окна; default – значение по умолчанию (оно будет ответом функции
при простом нажатии кнопки «Ok»; xpos, ypos – координаты левого верхнего угла окна; helpfile, context – имя файла с текстом помощи и соответственно контекстная ссылка на нужную статью помощи. Все формальные параметры, кроме первого, необязательные и могут быть опущены. Обязательно надо помнить, что выходом функции является строковая переменная, поэтому надо пользоваться дополнительными функциями для перевода данных в нужный формат. Примеры использования данной функции показаны ниже: · получение строковой переменной Nm=InputBox(“Как Вас зовут ?”); · ввод числа X=Val(InputBox(“Введите число от 1 до 10, Х=”)). Иногда надо получить более сложные данные, в этом случае можно пользоваться стандартной процедурой с этим же именем. В записи к описанным выше формальным параметрам добавлен параметр Type, который может иметь следующие значения: Значение Тип данных 0 формула для ячейки на листе 1 число 2 строковая переменная 4 логическая переменная (True, False) 8 ссылка на указанную ячейку 16 ошибка, например #N/A 64 массив данных Примеры использования процедуры: - 63 -
· получить на число X=Application.InputBox("Укажите ячейку", , , , , , , 1)
· получаем ссылку на указанную ячейку
Set X=Application.InputBox("Укажите ячейку", , , , , , , 8)
в данном случае мы создаем объект и присваиваем ему данные объекта, с которым мы хотим работать. Отметим, что в справочной системе подпрограмма МsgВох называется функцией, т.к. ее можно использовать в арифметических выражениях. При этом в программу возвращается значение типа Integer, соответствующее кнопке, на которой кликнул пользователь. Приведем пример использования этого: В программу Pythagoras введем расчет площади прямоугольного треугольника. Для этого седьмой оператор заменим тремя операторами: Sub Pythagoras() Dim a As Single Dim b As Single Dim c As Single Dim s As String 1: s = _ InputBox ("Введите длину 1 катета и нажмите ОК") 2: a = Val(s) 3: s = _ InputBox ("Введите длину 2 катета и нажмите OK") 4: b = Val(s) 5: c = Sqr(a^2 + b^2) 6: s = Str(c) Dim Ret As Integer Ret = MsgBox(s, vbYesNo, "Paccчитать площадь?") If Ret = vbYes Then MsgBox Str(a * b / 2) End Sub
При выполнении полученной программы изменится содержимое окна с результатом расчета длины гипотенузы (рис.15). При клике на кнопке Уеs появится окно с результатом расчета площади треугольника (рис.16). В ряде заданий вам надо будет получить набор произвольных данных, с которыми надо выполнить некоторые операции (найти максимальное или минимальное число, отсортировать, найти первое положительное или отрицательное число и т.п.). В этом случае можно пользо- 64 -
ваться генератор случайных чисел с помощью функции «Rnd()».
Рис.15. Первое окно с результатом расчета
Рис.16. Второе окно с результатом расчета
Функция возвращает случайное число в интервале от 0 до 1 с равномерным распределением. Для получения различных наборов можно строить различные комбинации вычислений с использованием этой функции: Public Sub InputDates() Dim X() As Integer N = InputBox("Введите размер массива(от 2 до 10") ReDim X(N) For i = 0 To N X(i) = Rnd() * 50 Next i End Sub
Здесь мы генерируем N целых чисел в интервале от 1 до 50 в виде одномерного массива Для генерации, например, чисел в интервале от -25 до 25 надо в строку X(i) = Rnd() * 50 дописать - 25. Чтобы получить вещественные числа достаточно просто описать массив как Double. Можно записать общую формулу для генерации чисел в заданном диапазоне, которая будет иметь вид X=Xнач +СлЧисло*dX, где Хнач – начало набора, dX – размер диапазона и СлЧисло – случайное число. Приемы работы в среде программирования VBA Теперь разберем пошагово весь процесс создания своей программы, начиная от простой функции пользователя до создания своей оконной формы пользователя. Запуск среды VBA Находясь в любом пакете MS Office, можно вызвать оболочку VBA комбинацией клавиш Alt+F11 или по следующей команде СервисðМакросðРедактор Visual Basic. Открывается окно похожее на рис.1 в зависимости от настроек системы. Переходы между оболоч- 65 -
кой программирования и самим пакетом происходят через указанную выше комбинацию горячих клавиш Alt+F11. Создание функции пользователя Создадим свою функцию, например, нам нужно часто использовать какое-либо достаточно большое уравнение. Назовем функцию «My_fun» и в дальнейшем будем использовать в наших расчетах. В качестве простейшего примера создадим полином следующего вида: Y = A0 + A1 × X + A2 × X 2
В первом варианте примем, что наши коэффициенты А0, А1 и А2 известны и имеют соответственно следующие значения 21, 5 и 0.5. Нам надо задать значение Х и получить значение Y. Начинаем создавать свою первую программу. Сначала вставляем в наш проект новый модуль, который собственно и содержит программный код. Для этого выполняем команду InsertðModule, здесь нельзя ошибаться и выбрать не Module, а Class Module, который создаст специальный модуль нового объекта, что нам пока не надо. В рабочей области экрана появляется чистая область модуля, куда теперь можно вносить программный код. Теперь можно вводить программу, хотя гораздо проще пользоваться мастерами создания необходимых процедур. Для этого выполняем команду InsertðProcedure, которая была до создания модуля не активна. Появляется окно, показанное на рис.17. В нем заполняем необходимую информацию. Вносим имя процедуры (Name) – это может быть любое имя, которое начинается с русской или латинской буквы и может содержать также цифры и Рис.17. Вставка процедуры знак подчеркивания, если хотите разделить слова в имени. Обязательно помните, что начинать имя процедуры с цифры и ставить пробелы внутри него недопустимо!!! Во-вторых, выбираем тип процедуры – функция (Function), так как мы хотим иметь ее в качестве функции пользователя на листах данной книги. Затем выбираем область видимости процедуры - 66 -
(Scope) как общую (Public). Если мы укажем ее как внутреннюю (Private), то она не будет видна на листах книги. Данное свойство надо использовать только для внутренних процедур, о которых разговор будет далее. Теперь можно нажимать кнопку Ok, и в окне модуля получаем заготовку самой процедуры в виде следующего текста: Public Function My_fun() End Function
Начинаем писать программный код. Так как функция имеет входной параметр Х, то мы должны внести его имя в строку после имени процедуры внутри скобок. В пустую строку записываем код вычисления значения Y, используя правило – надо присвоить к переменной с именем процедуры (без скобок, которые имеются в заголовке) возвращаемое значение. Самый простой вариант записи будет выглядеть так Public Function My_fun(X) My_fun = 21 + 5 * Х + 0.5 * Х ^ 2 End Function
Если необходимо выполнить более сложные вычисления, то перед присвоением результата имени функции могут располагаться и другие операторы. Это может выглядеть так Y = 21 + 5 * Х + 0.5 * Х ^ 2 My_fun = Y
Теперь надо сохранить книгу Excel и перейти на ее рабочий лист и попробовать использовать созданную функцию. Для этого на листе книги Excel в ячейку А1 введем любое число, например, 10, и в ячейку В1 запишем следующую формулу «=My_fun(A1)». Для этого вводим знак =, который автоматически вызывает мастер создания функции (рис.18.),
Рис.18. Мастер построения функций - 67 -
выбираем категорию функции – Определенные пользователем, и в списке видим имя созданной нами функции, выбираем ее и нажимаем Ok. Далее открывается окно мастера этой функции (рис.19), где в поле Х вводим ссылку на ячейку А1. Внизу окна сразу же выводится результат вычисления. Теперь попробуем сделать данную функцию более гибкой в своем использовании. Сделаем коэффициенты уравнения параметрическими, то есть они будут передаваться как аргументы функции.
Рис.19. Окно ввода аргументов в функцию пользователя
Внесем следующие изменения в программный код функции: добавим за именем функции в скобках перед параметром Х новые имена в список формальных параметров и пропишем их в самой функции. Для этого заменим наши константы 21, 5 и 0.5 в вычисляемом уравнении на соответствующие параметры А0, А1, А2. Чтобы сохранять все созданные процедуры, будем перед исправлениями копировать весь код и изменять имя процедуры, добавляя к нему очередной номер. В приведенном ниже примере имя функции изменено на My_fun1. Public Function My_fun1(A0, A1, A2, X) My_fun1 = A0 + A1 ^ X + A2 * X ^ 2 End Function
Чтобы использовать эту функцию на листе книги, необходимо подготовить исходные данные на листе. Для этого введем в ячейки А1–А3 имена коэффициентов, чтобы наглядно видеть в какие ячейки вводить исходную информацию, и сразу же иметь готовую таблицу для ее использования в отчетах. В ячейки В1–В3 введем значения самих коэффициентов уравнения. - 68 -
A0
21
X
A1 5 10 Попробуем подготовить таблицу значеA2 0,5 12 ний нашей функции. Для этого сделаем заго14 товку таблицы, введя заголовки столбцов X иY 16 в ячейки D1 и E1. Значение параметра Х 18 введем в столбец D. В ячейки D2 и D3 вве20 дем 10 и 12 соответственно, выделив 22 неячейки 10 и 12 и схватив за маркер заполния (это черный Ë в правом нижнем углу выделенных ячеек), растянем эти данные до числа 22 (таблица справа). Теперь введем саму функцию в ячейку Е2, используя мастер функций, и увидим окно с аргументами функции (рис.20). Оно изменилось, в нем появились дополнительные параметры – коэффициенты уравнения. Введем необходимые данные, причем значения коэффициентов вводим как ссылки на ячейки с абсолютной адресацией, используя клавишу F4. После ввода функции, растягиваем эту формулу с помощью маркера заполнения на группу ячеек Е3 – Е8. Попробуем создать следующую функцию My_fun2, которая будет вычислять полином любого порядка. Ее аргументами должны быть – степень полинома (N), массив коэффициентов Ai из N+1 элементов и значение параметра Х. Программа показана ниже. Рекомендуем создать заготовку процедуры My_fun2, как было показано выше, и в заголовок ввести формальные параметры, а внутри заготовки записать сам код
Рис.20. Окно ввода аргументов в функцию пользователя My_fun1
Public Function My_fun2(N, Ai, X) - 69 -
Dim Aa() ReDim Aa(N) i = 0 For Each Cl In Ai.Cells Aa(i) = Cl.Value i = i + 1 Next Y = Aa(0) For i = 1 To N Y = Y + Aa(i) * X ^ i Next i My_fun2 = Y End Function
Разберем процедуру более подробно. Первая строка после заголовка описывает динамический массив. Во второй строке массив переопределяется под необходимый размер, здесь мы указываем его размер N. Далее заполняем его значениями коэффициентов, перебирая все ячейки, которые переданы в качестве аргумента Ai в процедуру, и присваивая их значения элементам массива коэффициентов Аа. Подготавливаем переменную Y для суммирования членов полинома, приравнивания ее нулевому коэффициенту полинома. Потом реализуем алгоритм вычисления полинома любого порядка суммированием коэффициентов, умноженных на значение Х в степени равной индексу коэффициента. Введем третью функцию на наш лист. Окно ввода аргументов функции показано на рис.21.
Рис.21. Окно ввода аргументов в функцию пользователя My_fun2 - 70 -
Список коэффициентов уравнения вводится как группа ячеек, которые так же задаются абсолютным адресом. Попробуем свести все результаты вычислений в одну таблицу для оценки точности их результата. Как видим, результат вычисления во всех случаях остается одинаковым (см. таблицу ниже). A0 A1 A2
21 5 0,5
X My_fun My_fun1 My_fun2 10 121 121 121 12 153 153 153 14 189 189 189 16 229 229 229 18 273 273 273 20 321 321 321 22 373 373 373
Создание макрокоманды (макроса) Макрокоманды – это укрупненные наборы стандартных команд, которые могут выполняться одновременно друг за другом. Макрокоманды оформляются как подпрограммы (Sub) и могут вызываться по команде Excel СервисðМакросы… или комбинацией горячих клавиш Alt+F8. По ней открывается окно со списком всех, имеющихся в проекте макросов, из которых надо выбрать нужный и нажать кнопку Выполнить. При создании макроса можно существенно упростить процесс программирования, воспользовавшись режимом записи макроса по команде Excel Сервисð Начать Запись…. Попробуем создать макрос, который будет форматировать фрагмент листа, как показано на таблицах выше: наружная рамка будет нарисована двойной линией, а внутренние линии – одинарными линиями. Каждая отдельная программа или группа связанных между собой программ могут располагаться в своем модуле, их число в проекте не ограничено, но названия программ должны быть разными. Поэтому для нашей новой процедуры лучше создать новый модуль, но мы этого пока делать не будем, а познакомимся с записью макроса. Начнем запись нашего макроса по команде Excel Сервисð Начать Запись…. Появляется окно, в котором должны быть заполнены исходные данные по записываемому макросу (рис.22). Здесь - 71 -
можно задать имя макроса, сочетание горячих клавиш, которыми он будет вызываться, и внести небольшой комментарий к подпрограмме. После нажатия кнопки Ok появляется панель инструментов с элементами управления записью, и начинается запись. Теперь все команды, которые мы выполняем, записываются в кодах VBA. Выполним следующие действия на новом листе книги: · выделим несколько ячеек в виде прямоугольника, например, пряРис.22. Окно параметров макроса моугольник из 3 столбцов и 5 строк; · вызовем команду форматирования ячеек с помощью горячих клавиш Ctrl+1 или по команде ФорматðЯчейки. В открывшемся окне выбираем закладку Границы (рис.23);
Рис.23. Оформление границ ячеек
· на ней выбираем тип линии «двойная» и щелкаем по кнопке Внешние на панели Все; · потом выбираем тип линии «одинарная» и щелкаем по кнопке - 72 -
Внутренние на панели Все; · заканчиваем запись макроса, нажимая кнопку Остановить запись. Переходим в VBA и смотрим изменения в нашем проекте. Там появился новый модуль2, и в нем подпрограмма Макрос1, которая имеет следующее содержание Sub Макрос1() ' Макрос1 Макрос ' Макрос записан 02.09.2007 (Ves) ' Range("B3:D7").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .Weight = xlThin - 73 -
.ColorIndex = xlAutomatic End With End Sub
Рассмотрим полученный код. В первой строке процедуры выделяется область фрагмента таблицы, и дальше задаются свойства для границ ячеек в следующей последовательности – диагонали сверху вниз и снизу вверх, потом левая граница, верхняя, нижняя и правая и в конце внутренние вертикальные границы и внутренние горизонтальные. Для диагоналей тип линии (LineStyle) задается отсутствие линии (xlNone), для наружных границ – двойной линией (xlDouble) и для внутренних границ – одинарной линией (xlContinuous). Теперь надо эту программу сделать универсальной. В самом простом варианте надо удалить строку, где выделяется область таблицы, и считать, что запускать макрос будем только после выделения заданной области таблицы. Попробуем это сделать. Удаляем строку – Range("B3:D7").Select. Затем на листе книги выделяем новый фрагмент таблицы, вызываем макрос (Alt+F8) и выполняем его. Получаем тот же результат, что и при записи макроса. Вот мы и создали свою макрокоманду. Попробуем оптимизировать программный код. В нем имеется четыре одинаковых фрагмента, которые отличаются только параметрами. Попробуем заменить их внутренней подпрограммой. Сначала создадим внутреннюю подпрограмму (рис.24), например, Draw_Line с четырьмя формальными параметрами: · Typ_Border – тип бордюра в который мы передадим константу, Рис.24. Окно вставки процедуры определяющую месторасположения границы (xlDiagonalDown, xlDiagonalUp, xlEdgeLeft, xlEdgeTop, xlEdgeBottm, xlEdgeRight); · Line_Style – тип линии, который будет задаваться константой (xlNone, xlDouble, xlContinuous); · Weight – толщина линия, в нашем случае это только xlThin, хотя имеется гораздо больше вариантов; - 74 -
· Color_Index –цвет линии, который задается его индексом, для нас это только xlAutomatic. Она должна быть внутренней (Private), как отмечено в окне вставки процедуры, показанной на рис.24. Ее программный код показан ниже. Private Sub Draw_Line(Typ_Border, _ Line_Style, _ Optional Weight, _ Optional Color_Index) With Selection.Borders(Typ_Border) .LineStyle = Line_Style If Line_Style <> xlNone Then .Weight = Weight .ColorIndex = Color_Index End If End With End Sub
Часть кода можно просто скопировать из записанного макроса с исправлением констант, чтобы уменьшить вероятность ошибок при наборе служебных слов. Список формальных параметров введен построчно только для удобства представления данных на листе. Однако надо помнить, что строка кода может занимать несколько строк текста, и для указания этого используется символ подчеркивания, который перед собой имеет пробел, а за ним идет символ конца строки. Разрывать текст кода можно около разделителей и знаков операций. Служебное слово Optional, которое встречается перед двумя последними параметрами, говорит о том, что они необязательные к передаче, и могут быть просто опущены в списке фактических параметров, что вы увидите дальше. Теперь напишем код нашего макроса. Дадим ему имя «Мой_макрос», это будет подпрограмма общего типа. Попробуйте создать ее самостоятельно, и потом введите необходимый код, который показан ниже Public Sub Мой_макрос() Draw_Line xlDiagonalDown, xlNone Draw_Line xlDiagonalUp, xlNone Draw_Line xlEdgeLeft,xlDouble,xlThick, xlAutomatic Draw_Line xlEdgeTop, xlDouble,xlThick, xlAutomatic Draw_Line xlEdgeBottom,xlDouble,xlThick,xlAutomatic Draw_Line xlEdgeRight,xlDouble,xlThick,xlAutomatic Draw_Line xlInsideVertical,xlContinuous,xlThin, _ - 75 -
Draw_Line End Sub
xlAutomatic xlInsideHorizontal,xlContinuous,xlThin,_ xlAutomatic
В результате размер нашего кода уменьшился, а результат остался тот же. А можно ли еще внести какие-либо изменения? Например, перед каждой строкой рисования определенной линии границы можно запросить нужный тип линии, ее размер и цвет, что позволит получать более сложные формы оформления таблицы, но об этом мы поговорим после знакомства с пользовательскими формами. Создание пользовательской формы Любое окно, которое открывается по командам программ, представляет собой форму. Такая же форма может быть создана и нами. Чтобы форма и элементы на ней работали, для их событий пишутся программы, которые должны выполняться при наступлении этих событий. Попробуем создать самую простую форму с двумя элементами на ней – текстовой меткой, которая выводит текст, и кнопкой, которая может нажиматься и отжиматься мышкой. В эти моменты текстовая метка должна менять свой текст. Сначала создадим форму, используя команду Insert ð UserForm. В рабочей области экрана появляется форма (рис.25), которая по умолчанию имеет имя UserForm1. С помощью курсоров по углам и сторонам формы можно изменять ее размеры. В окне свойств объекта имеется набор всех свойств, которые имеются у формы. Разберем их более подробно. Если перейти в режим расположения свойств по категориям, то их легче рассмотреть: · в первой группе свойств задают заголовок формы (Caption). Имеются свойства для оформления формы – цвета фона (BackColor), цвета текста (ForeColor), который будет по умолчанию применяться в любых ее элементах, и цвета рамки (BorderColor), которая будет видна вокруг рабочей области объекта, если вид рамки (BorderStyle) - одинарная линия (fmBorderStyleSingle). Для обрамления можно выбрать и другой вид рамки, используя свойство специальных эффектов (SpecialEffect); · во второй группе обычно интерес представляет свойство показа окна (ShowModal). При установке этого свойства в состояние True окно захватывает все события и выполняет только свою про- 76 -
грамму. Это приводит к тому, что передача управления самой программе произойдет только после закрытия окна. Если в этом нет необходимости, то устанавливаем значение False;
Рис.25. Форма пользователя на рабочей области VBA
· следующая группа содержит настройки шрифта по умолчанию для всех элементов формы; · в четвертой группе основные характеристики формы, из них нам могут понадобиться ее имя (Name), и наличие на форме дополнительных кнопок (WhatsThisButton) и (WhatsThisHelp), которые выводят в ее заголовок кнопки контекстной помощи по элементам формы; · затем идет группа команд, позволяющих расположить на форме рисунок, и задать параметры его расположения; · в пятой группе свойства, определяющие размер и место расположения окна на экране, а так же место его расположения при начальном запуске; - 77 -
· в последней категории свойства, позволяющие расположить на форме линейки для изменения видимой части рабочей области формы, если она больше размеров самого окна. Справа расположена панель элементов формы (ToolBox), на которой мы будем выбирать нужные элементы. Сначала в верхней части формы расположим текстовую метку и зададим для нее следующие свойства: · изменим шрифт (Font), увеличив размер до 16 и выбрав написание жирное с наклоном, сменим цвет на красный (ForeColor); · для метки определим центровку текста (TextAlign) по центру, с переносом слов (WordWrap). Теперь под этой меткой располагаем кнопку (ToggleButton), и зададим для нее заголовок (Caption) – «Нажмите кнопку». Остается вписать для формы программный код, и она будет готова. Надо выбрать событие, которое нам нужно – это нажатие на кнопку. Чтобы создать эту процедуру достаточно просто щелкнуть на этой кнопке левой кнопкой мышки. После этого форма скрывается и на рабочей области появляется процедура обработки события, которая зовется ToggleButton1_Click. Нам остается вписать необходимы код. Private Sub ToggleButton1_Click() If ToggleButton1.Value = True Then Label1.Caption = "Кнопка нажата" Else Label1.Caption = "Кнопка отжата" End If End Sub
Суть кода заключается в том, что если кнопка нажата (ToggleButton1.Value = True) то в текстовую метку вписывается текст – «Кнопка нажата», в противном случает текст – «Кнопка отжата». Наша форма готова к работе, но она имеет один недостаток – в момент первого запуска текст в метке отсутствует, поэтому в событие инициализации формы надо вписать обращение к показанной выше программе. Чтобы вызвать событие на самой форме, щелкните по ней мышкой, в окне кода появится событие щелчка по форме. После этого открываем список в правой части окна кода, и находим в списке нужное событие, выбираем его, и вносим нужный код Private Sub UserForm_Initialize() ToggleButton1_Click End Sub - 78 -
Работа с листами книги Мы познакомились с основными приемами работы в среде программирования VBA. Теперь познакомимся с приемами управления данными книги. Данные приемы можно использовать только в подпрограммах (Sub), так как при обращении к данным листа при выполнении функции происходит пересчет всех данных, что может зациклить систему. Для получения данных с листа и переноса результатов на лист можно прямо обращаться к ячейкам листа по их адресам через объект .Range(“A1”) или по номерам строки и столбца через объект .Cells(1,1). Обе записи ссылаются на первую ячейку активного листа. Для работы с различными листами надо данные объекты привязать к нужным листам, добавив объект .Sheets(“Лист1”) с нужным именем листа. Так же можно продолжить цепочку объектов и работать с различными книгами, добавив коллекцию открытых книг объектом Workbooks("Имя_книги”). Существуют специальные объекты, которые позволяют обращаться к активным (открытым в данные момент листам, книгам и ячейкам), они имеют следующие имена: ActiveWorkBook – активная (видимая в данный момент) книга Excel; ActiveSheet – активный лист; ActiveCell – выделенная ячейка (в ней в данный момент находится курсор ввода). Пользуясь этими объектами, мы можем попадать в объекты, которые мы только что активировали. Например, новая открытая книга всегда становится – ActiveWorkBook. Если нам надо выполнить какие-либо действия на листе, мы можем написать программный код с использованием объекта ActiveSheet и запускать его на исполнение после выбора нужного листа и т.п. Часто надо бывает работать с двумя книгами – одна содержит сам код программы, а в другой находятся данные, которые надо оттуда забрать, обработать и сохранить в основной книге, где записан код программы. В этом случае мы может использовать два объекта: ThisWorkBook – книга с программным кодом и ActiveWorkBook – книга, которую мы открываем, обрабатываем и снова закрываем. В результате мы можем обработать несколько книг, которые мы будем открывать и закрывать друг за другом, все они будут отвечать объекту ActiveWorkBook. Иногда бывает удобно не вносить данные непосредственно в активную ячейку, что снижает мерцание экрана, а пользоваться смещением от активной ячейки на ячейку, куда надо поместить данные – - 79 -
.OffSet(2,4) указывает на ячейку, которая лежит на 2 строки ниже и на 4 столбца правее от активной ячейки. Рассмотрим несколько примеров реализации этих задач: 1. Предположим, что нам нужна программа, которая будет строить график функции, которая записана в определенную ячейку активного листа для инРис.26. Лист «Данные» тервала, заданного двумя числами на том же листе. Программа считывает интервал, делит его на десять отрезков, готовит по ним таблицу, которая привязана к построенному графику. Сначала готовим лист, с которым мы будем работать. Для этого создаем новую книгу, переименовываем первый лист на «Данные» и заполняем следующую информацию на нем (рис.26.). Светло-зеленым цветом отмечены ячейки, куда будет вводиться информация о интервале графика. В ячейку функции записываем формулу, например =SIN(B4). Заполняем любыми данными таблицу в 10 строк, которая является исходным материалом для графика, и после на отдельном листе с именем «График» строим сам график, и настраиваем его параметры. Теперь разберем алгоритм, который должен быть реализован в программе. Сначала делаем активным лист с данными, и определяем активную ячейку «А1» (первая ячейка листа), после очищаем данные таблицы. Теперь можем готовить новые данные, считываем начало и конец интервала, определяем шаг при его делении на 10 точек и в цикле вычисляем эти данные, помещая их таблицу. Переходим на лист «График». Теперь все готово для создания программы. Открываем редактор VBA (Alt+F11), создаем модуль (InsertðModule) и в него вставляем подпрограмму (InsertðProcedure) с именем «Make_Graf» и записываем следующий код: Public Sub MakeGraf() Sheets("Данные").Activate ActiveSheet.Range("A1").Activate N = 10: Ir = 6 - 80 -
For i = 0 To N ActiveCell.Offset(Ir + i, 0) ActiveCell.Offset(Ir + i, 1) Next i xl = ActiveCell.Offset(1, 1) xr = ActiveCell.Offset(1, 3) H = (xr - xl) / N For i = 0 To N ActiveCell.Offset(3, 1) = xl y = ActiveCell.Offset(3, 3) ActiveCell.Offset(Ir + i, 0) ActiveCell.Offset(Ir + i, 1) Next i Sheets("График").Activate End Sub
= "" = ""
+ H * i = xl + H * i = y
В двух первых строках определяем активный лист и активную ячейку. Потом задаем число интервалов (N) и смещение (Ir) для таблицы данных. Потом очищаем таблицу, считываем границы интервалов, определяем шаг (H) и далее в цикле вычисляем значения (Y) и помещаем их в таблицу для графика. Для вычисления функции мы сначала помещаем текущее значение параметра в ячейку «В4» командой ActiveCell.Offset(3, 1) = xl + H * i, потом получаем значение функции командой y = ActiveCell.Offset(3, 3), полученные данные заносим в таблицу. Последняя команда делает активным лист графика. Результаты работы показаны на (рис.27). Можно повысить информативность графика, помещая на лист данных заголовки самого графика и его осей. Для этого выделим три ячейки, которые будут содержать данную информацию (рис.28), и свяжем их с графиком. График исследуемой функции 1,50
1,00
0,50
0,00 0,00
Y -4,00
-3,00
-2,00
-1,00
1,00
2,00
-0,50
-1,00
-1,50
Х
Рис.27. Результаты работы программы: лист данных и сам график - 81 -
3,00
Чтобы выполнить последнее действие, надо на графике выделить нужные заголовки Рис.28. Пример оформления ячеек для редактирования, перейти в с данными строку редактирования и вписать туда формулу вида «=Адрес_Ячейки». В представленном выше примере ячейки с текстами заголовков находятся в столбце «G» с 3 по 5 строки. Для них формулы будут иметь следующий вид «=Данные!$G$3», «=Данные!$G$4» и «=Данные!$G$5». Для ввода этих формул достаточно в строке формулы при выделении нужного заголовка написать «=» и потом с помощью мышки выбрать нужную ячейку на листе «Данные». 2. Реализуем вариант программы для сбора данных из других книг Excel. Например, предположим, что мы проводим эксперименты на установке, которая записывает результаты на первый лист книги Excel. Нам надо указать программе нужную книгу, открыть ее, считать два столбца данных до первой пустой ячейки в любом из двух столбцов. Затем эти данные мы должны сохранить в книге Excel на листе «Эксперименты» по следующей схеме: находим первый свободный столбец, в первой строке заносим текущие дату и время получения данных, во второй – имя файла данных, который был открыт для чтения данных, в третьей – число пар данных и далее сами данные. Сначала определим основные этапы программы: - на первом этапе мы должны получить файл для обработки, здесь можно воспользоваться стандартным диалоговым окном «Открыть файл…»; - если файл указан и открыт, проверяем наличие данных на первом листе в открытом файле, если они есть тогда: o готовим место для сохранения данных – записываем текущие дату, время и имя файла, находим свободный столбец на листе «Эксперимент»; o начинаем считывать и сохранять данные, иначе просто выходим из программы; o заносим число пар данных в третью строку; o закрываем файл с данными. - иначе просто завершаем программу. Теперь начнем создавать саму книгу. Нам нужна новая книга с одним листом с именем «Эксперименты». Создаем ее, удаляем лиш- 82 -
ние листы и переименовываем первый с «Лист1» на «Эксперимент». Теперь переходим в редактор VBA (Alt+F11) и начинаем писать саму программу. Создаем модуль и вставляем в него процедуру «Sub Get_Dates». Теперь вызываем стандартный диалог R = Application.Dialogs(xlDialogOpen).Show
Для этого определяем переменную, которая вернет нам результат операции, т.е. при открытии файла переменная R будет иметь значение True. После знака равенства вводим служебное слово Application, которое определят саму программу Excel. Ставим точку и выбираем из появившегося списка Dialogs. В этот момент можно начинать вводить данное слово, пока курсор сам не найдет нужную позицию списка. Вводим скобку и в следующем списке находим тип окна диалога. Ставим точку и выбираем метод «Show». После можно задать набор дополнительных аргументов типа маски файла, типа файла и т.п. В следующей строке проверяем, открыт ли файл, если нет, сообщаем в окне «MsgBox» об этом MsgBox "Для работы укажите файл с данными", _ vbInformation + vbOKOnly
Если файл открыт, определяем два объекта для упрощения записей в коде программы для листа с данными и листа экспериментов соответственно Set AW = ActiveWorkbook.Sheets(1) Set TW = ThisWorkbook.Sheets("Эксперимент")
Теперь проверяем наличие данных в первой строке открытого файла If Not IsEmpty(AW.Cells(1, 1)) And _ Not IsEmpty(AW.Cells(1, 2)) Then
Если их (данных) нет, то выводим сообщение об этом и закрываем книгу без сохранения сделанных изменений MsgBox "На листе открытой книги данных нет", _ vbInformation + vbOKOnly ActiveWorkbook.Close False
Иначе подготавливаем место для сохранения данных на листе «Эксперимент». Для этого определяем переменную ic = 1 (номер первого столбца на листе «Эксперимент») и ищем свободный столбец с приращением в 2 столбца: - 83 -
ic = 1 Do While Not IsEmpty(TW.Cells(1, ic)) ic = ic + 2 Loop
Теперь вносим начальные данные по серии – дату, время и имя файла TW.Cells(1, ic) = Date TW.Cells(1, ic + 1) = Time TW.Cells(2, ic) = ActiveWorkbook.Name
Остается перенести сами данные, и сосчитать их количество. Для этого используем две переменные ir = 1 – текущий номер строки в файле данных и ke = 0 – число экспериментов в серии. Хотя можно воспользоваться и одной переменной с прибавлением или отниманием 1. Потом в цикле с предусловием переносим данные: ir = 1: ke = 0 Do While Not IsEmpty(AW.Cells(ir, 1)) Or _ Not IsEmpty(AW.Cells(ir, 2)) TW.Cells(ir + 3, ic) = AW.Cells(ir, 1) TW.Cells(ir + 3, ic + 1) = AW.Cells(ir, 2) ir = ir + 1: ke = ke + 1 Loop
Строки в листе «Эксперимент» будут отличаться от строк на листе с исходными данными на 3 из-за наличия дополнительной информации в 3-х первых строках. Если возникнут другие требования, то можно просто изменить это число и добавить или уменьшить число строк с дополнительными данными. После переноса всех данных остается только закрыть файл с данными, и внести в третью строку данных на листе «Эксперимент» число пар данных в серии: ActiveWorkbook.Close False TW.Cells(3, ic) = ns
В полном виде программа показана ниже: Public Sub Get_Dates() R = Application.Dialogs(xlDialogOpen).Show If R Then Set AW = ActiveWorkbook.Sheets(1) Set TW = ThisWorkbook.Sheets("Эксперимент") If Not IsEmpty(AW.Cells(1, 1)) And _ Not IsEmpty(AW.Cells(1, 2)) Then ic = 1 Do While Not IsEmpty(TW.Cells(1, ic)) - 84 -
ic = ic + 2 Loop TW.Cells(1, ic) = Date TW.Cells(1, ic + 1) = Time TW.Cells(2, ic) = ActiveWorkbook.Name ir = 1: ke = 0 Do While Not IsEmpty(AW.Cells(ir, 1)) Or _ Not IsEmpty(AW.Cells(ir, 2)) TW.Cells(ir + 3, ic) = AW.Cells(ir, 1) TW.Cells(ir + 3, ic + 1) = AW.Cells(ir, 2) ir = ir + 1: ke = ke + 1 Loop ActiveWorkbook.Close False TW.Cells(3, ic) = ns Else MsgBox "На первом листе книги данных нет", _ vbInformation + vbOKOnly End If Else MsgBox "Для работы укажите файл с данными", _ vbInformation + vbOKOnly End If End Sub
Здесь мы рассмотрели приемы записи и считывания данных на листах книги. Наряду с этими приемами мы можем управлять непосредственно событиями, как книги, так и отдельными ее листами. Для этого мы должны писать свой программный код в специальные модули самих объектов. Причем в них обычно пишутся программы обработки событий, которые характерны этим объектам. Так, например, для книги могут быть реализованы события: · Activate – происходит в момент активации листа. В этот момент мы может настроить вид листа (выбрать масштаб просмотра, определить активную ячейку, вывести определенную область листа на экран и т.п.); · Deactivate – противоположное событие, происходящее перед выбором другого листа. Здесь можно проверить правильность введенных данных, и при выявленных ошибках вернуть пользователя для их исправления, выполнить какие-либо расчеты, которые требуют времени и были деактивированы при вводе данных на листе, и другие операции; - 85 -
· Change – в момент изменения данных в ячейках листа. Здесь обычно проводят проверки правильности ввода данных; · SelectionChange – изменение положения курсора ввода данных с одной ячейки на другую. Тут отслеживаются ситуации, когда требуется контролировать ввод только в разрешенные ячейки. Имеются и другие события, которые можно использовать для управления листом при различных действиях мышки, пересчетах формул на листе и др. Свои события имеют и книги. Чаще всего используются события управления книгой: · Open – в момент открытия книги. Здесь настраиваются вид оболочки Excel, запускаются пользовательские формы, выполняются первоначальные расчеты и подготовка памяти для дальнейших работ; · Группа событий Before… Close, Save, Print и другие. В них можно выполнить действия перед выполнением указанных выше операций закрытия книги, печати и сохранения или проверить правомочность этих действий и отказаться от их выполнения; · Имеются операции, привязанные к листам, которые были описаны выше, и в них можно писать процедуры и привязывать их к различным листам, так как в формальном параметре программы присутствует имя листа. Попробуем расширить возможности наших программ, написанных выше с использованием операций с обработкой событий. Для программы построения графиков добавим событие Open, в котором запишем проверку на открытие листа «Данные». Для события листа «Данные» в событие SelectionChange введем контроль ввода данных только в разрешенные ячейки. И последняя проблема – поставить элемент управления для построения графика. Посмотрим, как выполнить эти исправления. Для этого открываем файл «VBA_График.xls», входим в редактор VBA, и открываем модуль «ЭтаКнига» (рис.29). В окне модуля (слева) выбираем в левом выпадающем списке объект –WorkBook и в правом событие Open.
- 86 -
Рис.29. Выбор модуля «ЭтаКнига» и ввод кода в событие Open
В предложенную заготовку вписываем одну строку: ThisWorkbook.Sheets("Данные").Activate
Теперь переходим к «Лист2(Данные)», выбираем объект WorkSheet и событие SelectionChange (Рис.30). Здесь надо подумать об алгоритме работы программы. Нам надо сделать так, чтобы программа могла проверить разрешен ввод данных в эту ячейку или нет. Вначале мы закрасили все ячейки светло-зеленым фоном, давайте примем правило, если ячейка имеет фон отличный от заданного, то ввод в нее недопустим, надо найти следующую ячейку с нужным цветом. Вспомним вид нашего листа с данными для графика:
Рис.30. Выбор модуля «Лист2(Данные)» и событие SelectionChange
- 87 -
Реально нам надо искать нужные ячейки в области от «B2:G4». Попробуем записать макрос, который будет искать нужные нам ячейки. Для этого выполняем все необходимые операции в режиме записи макроса, как было показано выше. Вызываем команду СервисðМакросыðНачать запись, соглашаемся с предложенным именем макроса и начинаем записывать саму программу: · Выделяем диапазон от ячейки B2 до G4; · Вызываем команду поиска ПравкаðНайти…; · На панели Найти и заменить нажимаем кнопку Параметрыð; · На открывшейся расширенной панели поиска нажимаем кнопку Формат; · В открывшемся окне Найти формат открываем закладку Вид и выбираем необходимый нам цвет; · Подтверждаем выбор цвета кнопкой Ok и нажимаем кнопку Найти далее; · Завершаем запись макроса. Переходим в редактор VBA и видим там новый модуль «Модуль2», в нем созданный нами макрос. Range("B2:G4").Select Application.FindFormat.Interior.ColorIndex = 35 Selection.Find(What:="", After:=ActiveCell, _ LookIn:=xlFormulas, LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=True).Activate
В первой строке мы выделили диапазон, а во второй задаем поиск по формату, и далее выполняем поиск внутри указанного диапазона. Ведем поиск по рядам со следующей ячейки после активной. Теперь остается доработать код программы до нужного нам вида. Наиболее сложная задача возникает, если пользователь делает активной ячейку вне диапазона поиска, эта ситуация приведет к ошибке. Второй задачей является отказ от поиска, если ячейка нас удовлетворяет. В результате получаем следующий код: Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Interior.ColorIndex = 35 Then Exit Sub Ok = False If Target.Row < 2 Then r = 2: Ok = True - 88 -
ElseIf Target.Row > 4 Then r = 4: Ok = True Else r = Target.Row End If If Target.Column < 2 Then c = 2: Ok = True ElseIf Target.Column > 7 Then c = 7: Ok = True Else c = Target.Column End If If Ok Then Cells(r, c).Activate Range("B2:G4").Find(What:="", _ After:=ActiveCell, _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, _ SearchFormat:=True).Activate End Sub
Разберем его более подробно. В первой строке проверяем, удовлетворяет нас ячейка, которая в данный момент выбрана, и выходим из программы, если это так. Дальше проверяем, находится ли активная ячейка внутри диапазона поиска. Если это не так, выбираем ближайшую к ней ячейку внутри диапазона, и делаем эту ячейку активной. Переменная Ok сообщает о необходимости перемещения активной ячейки внутри диапазона. Теперь можно выполнять поиск необходимой ячейки. Ясно, что для полнофункциональной версии работы программы надо вывести на лист элемент управления, который будет вызывать подпрограмму построения графика. Воспользуемся формами для управления объектами. Вызовем стандартную панель инструментов Формы, и выберем кнопку. Нарисуем ее на листе ниже заголовков для графика. Как только мы завершаем рисование кнопки, открывается меню выбора макроса, который будет привязан к этой кнопке, и выбираем MakeGraf. После этого предлагается изменить заголовок кнопки. Пишем «Строим график», и получаем кнопку вида . Можно настроить и ряд других параметров, если вызвать с помощью контекстного меню - 89 -
свойства этого объекта. Лабораторные задания по темам Целочисленное программирование Все входные и выходные данные в заданиях этой группы являются целыми числами. Все числа, для которых указано количество цифр (двузначное число, трехзначное число и т.д.), считаются положительными. 1. Даны две целые переменные а, b. Составить фрагмент программы, после исполнения которого значения переменных поменялись бы местами (новое значение а равно старому значению b и наоборот). 2. Дано расстояние L в сантиметрах. Используя операцию деления нацело, найти количество полных метров в нем (1 метр = 100 см). 3. Дан размер файла в байтах. Используя операцию деления нацело, найти количество полных килобайтов, которые занимает данный файл (1 килобайт = 1024 байта). 4. Даны целые положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Используя операцию взятия остатка от деления нацело, найти длину незанятой части отрезка A. 5. Определить, является ли данное целое число четным. 6. Определить, верно ли, что при делении неотрицательного целого числа а на положительное целое число b получается остаток, равный одному из двух заданных чисел r или s. 7. Дано двузначное число. Найти сумму и произведение его цифр. 8. Дано двузначное число. Вывести число, полученное при перестановке цифр исходного числа. 9. Дано натуральное число (n ≤99). Выяснить верно ли, что равно n2 кубу суммы цифр числа n. 10. Дано натуральное число n (n ≤ 100). а) Сколько цифр в числе n? б) Чему равна сумма его цифр? в) Найти последнюю цифру числа n. г) Найти первую цифру числа n. д) В предположении, что n≥10, найти предпоследнюю цифру числа n.
- 90 -
Ввод и вывод данных, оператор присваивания Все входные и выходные данные в заданиях этой группы являются вещественными числами. 1. Дана сторона квадрата a. Найти его периметр P = 4·a. 2. Даны стороны прямоугольника a и b. Найти его площадь S = a·b и периметр P = 2·(a + b). 3. Дан диаметр окружности d. Найти ее длину L = π·d. 4. Дана длина ребра куба a. Найти объем куба V = a3 и площадь его поверхности S = 6·a2. 5. Даны длины ребер a, b, c прямоугольного параллелепипеда. Найти его объем V = a·b·c и площадь поверхности S = 2·(a·b + b·c + a·c). 6. Найти длину окружности L и площадь круга S заданного радиуса R: L = 2·π·R, S = π·R2. 7. Даны два неотрицательных числа a и b. Найти их среднее геометрическое, то есть квадратный корень из их произведения: а × b 8. Даны два ненулевых числа. Найти сумму, разность, произведение и частное их квадратов. 9. Даны катеты прямоугольного треугольника a и b. Найти его гипотенузу c и периметр P: с = (а 2 + b 2 ) , P = a + b + c . 10. Даны два круга с общим центром и радиусами R1 и R2 (R1 > R2). Найти площади этих кругов S1 и S2, а также площадь S3 кольца, внешний радиус которого равен R1, а внутренний радиус равен R2: S1 = p × (R1 )2 , S 2 = p × (R2 )2 , S3 = S1 - S 2 . Логические выражения: группа Boolean Во всех заданиях данной группы требуется вывести логическое значение True, если приведенное высказывание для предложенных исходных данных является истинным, и значение False в противном случае. Все числа, для которых указано количество цифр (двузначное число, трехзначное число и т.д.), считаются целыми положительными. 1. Дано целое число A. Проверить истинность высказывания: «Число A является положительным». 2. Дано целое число A. Проверить истинность высказывания: «Число A является нечетным». 3. Даны два целых числа: A, B. Проверить истинность высказывания: «Справедливы неравенства A > 2 и B ≤ 3». 4. Даны два целых числа: A, B. Проверить истинность высказывания: «Справедливы неравенства A ≥ 0 или B < –2». - 91 -
5. Даны три целых числа: A, B, C. Проверить истинность высказывания: «Число B находится между числами A и C». 6. Даны два целых числа: A, B. Проверить истинность высказывания: «Хотя бы одно из чисел A и B нечетное». 7. Даны три целых числа: A, B, C. Проверить истинность высказывания: «Хотя бы одно из чисел A, B, C положительное». 8. Дано целое положительное число. Проверить истинность высказывания: «Данное число является четным двузначным». 9. Дано целое положительное число. Проверить истинность высказывания: «Данное число является нечетным трехзначным». 10. Проверить истинность высказывания: «Среди трех данных целых чисел есть хотя бы одна пара взаимно противоположных». 11. Дано трехзначное число. Проверить истинность высказывания: «Все цифры данного числа различны». 1. 2. 3. 4. 5.
6.
Условный оператор: группа If Петя встал утром в 7 часов, Коля - на 13 минут раньше него, Сережа на 4 минуты позже Коли, а Саша встал на 10 минут позже Сережи. Кто встал раньше, Петя или Саша? У Сережи 145 рублей. Он решил купить 3 блокнота по 48 рублей. Хватит ли денег на покупку? Из куска ткани можно сшить 17 детских плащей, расходуя на каждый 2 м ткани. Можно ли из этого куска сшить 8 плащей для взрослых, расходуя по 4 м ткани на каждый плащ? В коробке 3 кг лимонов и апельсинов. Лимоны вынули и взвесили отдельно. Их масса оказалась 1 кг 760 г. Каких цитрусовых больше и на сколько? Валя взяла у подруги книгу на 3 дня. В первый день она прочитала А страниц, во второй день прочитала в В раз больше, чем в первый, в третий день она прочитала на С страниц меньше, чем во второй. Успела ли Валя прочитать книгу вовремя, если в книге 194 страницы? Решить задачу при следующих значениях переменных: а) А = 28, В = 3, С = 25; b) А = 30, В = 3, С = 16. Мотоциклист должен прибыть в город через Т часов после выезда из пункта, находящегося на расстоянии S км от города. Успеет ли он вовремя прибыть в город, если в первый час он проедет А км, а - 92 -
все оставшееся время будет ехать со скоростью В км/ч? Решить задачу при следующих значениях переменных: a) Т = 4, S = 320, А = 75, В = 70; b) Т = 5, S = 300, А = 65, В = 60. 7. В театр пришло А зрителей. Из них В человек купили билеты по 30 рублей, остальные - по 20 рублей. Получит ли театр прибыль, если расходы на спектакль составили Z рублей? Решить задачу при следующих значениях переменных: a) А = 800, В = 300, Z = 15000; b) А = 600, В = 100, Z = 15000. 8. Расстояние между городами А и В равно S. Из города А в город В выехал велосипедист со скоростью Vr, через Т часов вслед ему выехал 2-й велосипедист со скоростью Vt. Догонит ли 2-й велосипедист 1-го, прежде чем тот доедет до города B? Решить задачу при следующих значениях переменных: a) S = 50, Vr = 12, ,= 16, Т = 2; b) S = 50, Vr= 12, Vt = 16, Т= 1. 9. Дано целое число. Если оно является положительным, то прибавить к нему 1; если отрицательным, то вычесть из него 2; если нулевым, то заменить его на 10. Вывести полученное число. 10. Даны пять целых числа. Найти количество положительных и количество отрицательных чисел в исходном наборе. 11. Даны два числа. Вывести их на экран дисплея в порядке возрастания. 12. Даны два числа. Вывести на экран первое число, если оно больше второго, и оба числа, если это не так. 13. Даны две переменные вещественного типа: A, B. Перераспределить значения данных переменных так, чтобы в A оказалось меньшее из значений, а в B - большее. Вывести новые значения переменных A и B. 14. Даны четыре числа. Найти разницу между максимальным ц минимальным числами. 15. Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной сумму этих значений, а если равны, то присвоить переменным нулевые значения. Вывести новые значения переменных A и B. - 93 -
16. Даны три числа. Меньшее из этих чисел заменить их полусуммой, а большее - удвоенным произведением. 17. Даны три числа. Найти сумму двух наибольших из них. 18. Даны три числа. Выяснить, существует ли треугольник с такими сторонами. (Условие существования треугольника следующее: сумма любых двух сторон треугольника должна быть больше третьей стороны.) а) 3, 4, 5; b) 10, 8, 3. 19. При выполнении условия x - y < 0 вычислить z = (x + y ) / 2 + 1 , в противном случае проверить условие x - y = 0 и если оно выполняется, вычислить z = (x + y ) / 2 , в противном случае z=3.2. 20. Для данного целого x найти значение следующей функции f, принимающей значения целого типа: ì2 × x, если х < -2 или x > 2 f (x ) = í î- 3 × x, в противном случае
1. 2.
3. 4. 5. 6.
Оператор выбора Составить программу, которая и зависимости от порядкового номера дня недели (1. 2. .... 7) выводит на экран его название (понедельник вторник .... воскресенье). Дано целое число K. Вывести строку-описание оценки, соответствующей числу K (1 - «плохо», 2 - «неудовлетворительно», 3 «удовлетворительно», 4 - «хорошо», 5 - «отлично»). Если K не лежит в диапазоне 1–5, то вывести строку «ошибка». Дан номер месяца - целое число в диапазоне 1–12 (1 - январь, 2 февраль и т.д.). Вывести название соответствующего времени года («зима», «весна», «лето», «осень»). В киоске продается газета стоимостью 3 рубля и журнал стоимостью 20 рублей. Составить программу, которая спрашивает, что вы хотите купить, принимает деньги и выдает сдачу. Составить программу, моделирующую работу продавца мороженого с выбором сорта мороженого. Арифметические действия над числами пронумерованы следующим образом: 1 - сложение, 2 - вычитание, 3 - умножение, 4 - деление. Дан номер действия N (целое число в диапазоне 1–4) и вещественные числа A и B (В не равно 0). Выполнить над числами указанное действие и вывести результат. - 94 -
7. Пусть элементами круга являются радиус (первый элемент), диаметр (второй элемент), длина окружности (третий элемент). Составить программу, которая по номеру элемента и по его значению вычисляла бы площадь круга. 8. Дата некоторого дня характеризуется двумя натуральными числами m (порядковый номер месяца) и n (число). По заданным m и n определить: а) дату предыдущею дня (принять, что m и n не характеризуют 1 января); б) дату следующего дня (принять, что m и n не характеризуют 31 декабря). 9. Для натурального числа k напечатать фразу "мы нашли k грибов в лесу", согласовав окончание слова "гриб" с числом k. 10. Работа светофора для водителей запрограммирована следующим образом: начиная с начала каждого часа, в течение трех минут горит зеленый сигнал, затем в течение одной минуты - желтый, в течение двух минут - красный, в течение трех минут - опять зеленый и т.д. Дано вещественное число t, означающее время в минутах, прошедшее с начала очередного часа. Определить, сигнал какого цвета горит для водителей в этот момент. Цикл с параметром: группа For 1. Даны два целых числа A и B (A < B). Вывести в порядке убывания все целые числа, расположенные между A и B (не включая числа A и B), а также количество N этих чисел. Cos2 Sin 3 a ü ì , a 2= ,..., a n -1 - n - 2 ý ía1= 12 15 21 þ . î
2. Дана числовая последовательность Найти сумму отрицательных элементов при n=100. 3. Даны два целых числа A и B (A < B). Найти произведение всех целых чисел от A до B включительно. 4. Даны два целых числа A и B (A < B). Найти сумму квадратов всех целых чисел от A до B включительно. ì1 1 1 1 1
ü
5. Дана числовая последовательность íî 7 , 9 , 11 , 13 , 15 ,...ýþ . Найти произведение членов последовательности от пятого до двадцать пятого. x 3 x 5 x 7 x 9 x11 x13 . x+ + + 3! 5! 7! 9! 11! 13!
6. Дано действительное число х. Вычислить 7. Дано целое число (N > 1) и две вещественные точки на числовой оси: A, B (A < B). Отрезок [A, B] разбит на N равных отрезков. - 95 -
Вывести H - длину каждого отрезка, а также набор точек A, A + H, A + 2·H, A + 3·H, …, B, образующий разбиение отрезка [A, B]. (х - 2)(х - 4)(х - 8)K(х - 64) 8. Дано действительное число х. Вычислить (х - 1)(х - 3)(х - 7 )K(х - 63) . 9. Пусть а 0 = 1; а k = ka k -1 + 1 / k, k = 1,2,K Дано натуральное n. Получить an . 10. Пусть a1 = b1 = 1; a k = 3b k -1 + 2a k -1 b k = 2a k -1 + b k -1 , k = 2,3,K Дано натуn
2k 1 + a 2k + b 2k k! .
ральное n. Найти å k =1 ( 11. Пусть
x 0 = 1; x k =
)
2 - x 3k -1 , k = 1, 2, K 5
Найти первый член хn, для кото-
рого x n - x n -1 < 10-5 . 12. Даны действительные числа а, b, натуральное число n (b>а). По-
13.
1.
2. 3. 4. 5. 6. 7.
æ 1ö a + ç i - ÷h b-a . è 2ø , fi = , i = 1, 2, K, n лучить (f1 + ... + fn)×h, где h = 2 n æ æ 1ö ö 1 + çç a + ç i - ÷h ÷÷ è 2ø ø è Даны целые числа n, k (n≥k≥0). Вычислить n (n - 1)K(n - k + 1) . k!
Цикл с условием: группа While Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A. Дано целое число m> 1. Получить наибольшее целое k, при котором 4×k< m. Дано натуральное число n. Получить наименьшее число вида 2×r, превосходящее n. Спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от результата предыдущего дня. Найти какой путь пробежит спортсмен в 7-й день. Сколько чисел нужно взять в последовательности 1+2+3+4+ … , чтобы получить число, большее чем N. Вычислить наибольшее целое положительное число а удовлетворяющее условию 3×a2-127×a<0. Дано целое число (N > 0). Найти наименьшее целое положительное число K, квадрат которого превосходит N: K2 > N. Функцию извлечения квадратного корня не использовать. - 96 -
8.
Дана числовая последовательность
¥
1 2 n =1 n
S( x ) = å
.Подсчитать сумму с
точностью 0,00000001. 9. Начальный вклад в банке равен 1000 руб. Через каждый месяц размер вклада увеличивается на P процентов от имеющейся суммы (P - вещественное число, 0 < P < 25). По данному P определить, через сколько месяцев размер вклада превысит 1100 руб., и вывести найденное количество месяцев K (целое число) и итоговый размер вклада S (вещественное число). 10. Спортсмен-лыжник начал тренировки, пробежав в первый день 10 км. Каждый следующий день он увеличивал длину пробега на P процентов от пробега предыдущего дня (P - вещественное, 0< P <50). По данному P определить, после какого дня суммарный пробег лыжника за все дни превысит 200 км, и вывести найденное количество дней K (целое) и суммарный пробег S (вещественное число). 11. Дано число a (1 <а≤ 1.5) Из чисел 1 + ½, 1+ 1 , … напечатать те, 3
которые не меньше а. 12. Среди чисел 1, 4, 9, 16, 25, ... найти первое число, большее n. 1.
2. 3.
4.
5.
Массивы Заполнить массив х нулями. (Это означает, что нужно составить фрагмент программы, после выполнения которого все значения х[1] - х[n] равнялись бы нулю, независимо от начального значения переменной х. Найти максимальное число, встречающееся в заданном векторе х[1] … х[n]. Ввести и напечатать значения элементов массива целого типа с заданной размерностью. Вычислить и напечатать сумму элементов массива, расположенных до минимального элемента. Ввести и напечатать значения элементов массива вещественного типа с заданной размерностью. Упорядочить массив по возрастанию значений элементов. Отсортированный массив напечатать. Ввести и напечатать значения элементов массива вещественного типа с заданной размерностью. Преобразовать массив таким образом, чтобы в первой половине располагались элементы, стоящие в - 97 -
6.
7.
8.
9. 10.
11.
12. 13.
14.
15.
16.
четных позициях, а во второй половине - элементы, стоящие в нечетных позициях. Модифицированный массив напечатать. Ввести и напечатать значения элементов массива целого типа с заданной размерностью. Преобразовать массив таким образом, чтобы нулевые элементы располагались в конце массива. Модифицированный массив напечатать. Для заданной квадратной матрицы найти минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали. Составить программу нахождения максимального значения элемента вектора среди отрицательных и минимального значения – среди положительных элементов. Составить программу печати значений элементов той строки матрицы, сумма элементов которой минимальна. Подсчитать в одномерном массиве целого типа размером 100 элементов индекс и значение последнего из положительных элементов. Сформировать одномерный массив с элементами z[i ] (0 £ i < N ),= N 20 из двух заданных массивов целого типа х[i], y[i] по правилу: z[i ] = min{x[i ], y[i ]}, i = 0,1,..., N - 1 Получить одномерный массив z из двух заданных массивов вещественного типа х, y по правилу z[i] = ( x[i] + y[i ]) / 2, i = 0, 1, ..., 29 Найти величину и номер первого отрицательного и последнего положительного элемента в массиве вещественного типа заданного размера. Поменять местами первый и последний элемент, второй и предпоследний и т.д. в одномерном массиве вещественного типа заданного размера. Найти количество нулевых элементов в одномерном массиве целого типа заданного размера, и сформировать новый массив из ненулевых элементов исходного массива. В одномерном массиве вещественного типа заданного размера найти сумму элементов, расположенных между максимальным и - 98 -
минимальным элементами. Функции и процедуры 1. Даны действительные числа S, t. Получить f (t, -2s, 1.17) + f (2.2, t, s-t), где f (a , b, c ) =
2a - b - sin c . 5+ c
2. Дано действительное число y. Получить
1.7 t (0.25) + 2 t (1 + y ) , 6 - t y2 - 1
(
)
где
x 2 k +1 å (2k + 1)! t ( x ) = k= 010 2 k . x å k= 0 ( 2 k )! 10
3. Даны действительные числа а, b, Получить u=min(a, b), v=min(ab, a+b), min(u+v2, 3.14). 4. Определить значение z = max(a, 2b) × maх(2f - b,b), где min(х, у) максимальное из чисел х, у. Задачу решить, не используя функцию mах; ì- 1 при а < 0 ï 5. Определить значение z=Sign(X)+ Sign(Y) где Sign a = í 0 при а = 0 . ï 1 при а > 0 î
6. Даны основания и высоты двух равнобедренных трапеций. Найти сумму их периметров. (Определить функцию для расчета периметра равнобедренной трапеции по ее основаниям и высоте). 7. Даны две последовательности целых чисел: а1, а2,..., а8 и b1, b2, ..., b8. Найти количество четных чисел в первой из них и количество нечетных во второй. (Определить функцию, позволяющую распознавать четные числа). 8. Найти значение выражения
2 × 5!+3 × 8! , 6!+4!
где n! означает факториал
числа n (n!= 1×2×... ×n). (Определить функцию для расчета факториала натурального числа). 9. Даны два натуральных числа. Выяснить, в каком из них сумма цифр больше. (Определить функцию для расчета суммы цифр натурального числа). 10. Даны шесть различных чисел. Определить максимальное из них. - 99 -
(Определить функцию, находящую максимум из двух различных чисел). 11. Составить программу, в результате которой величина а меняется значением с величиной b, а величина с - с величиной d. (Определить процедуру, осуществляющую обмен значениями двух переменных величин). 12. Даны стороны двух треугольников. Найти сумму их периметров и сумму их площадей. (Определить процедуру для расчета периметра и площади треугольника по его сторонам). 13. Даны основания и высоты двух равнобедренных трапеций. Найти сумму их периметров и сумму их площадей. (Определить процедуру для расчета периметра и площади равнобедренной трапеции по ее основаниям и высоте). Контрольные вопросы Целочисленное программирование 1. Какие операции можно выполнять над величинами целого типа? Укажите приоритет их выполнения при расчете значения арифметического выражения. 2. Как определить остаток от деления одной величины целого типа на другую? 3. Можно ли при делении одной величины целого типа на другую использовать знак "/"? Ввод и вывод данных, оператор присваивания 1. Как оформляется оператор вывода на экран? 2. Что можно указывать в качестве элементов списка вывода? Какой символ используется для разделения элементов списка вывода? 3. Что будет выведено на экран, если в списке вывода записано: а) число? б) имя величины? в) текст в кавычках? г) арифметическое выражение? 4. Как оформляется оператор ввода? Что можно указывать в качестве элементов списка ввода? Как работает оператор ввода (что происходит при его выполнении)? 5. Как оформляется арифметическое выражение? - 100 -
6. Какие знаки арифметических операций используются в арифметических выражениях? Укажите приоритет выполнения арифметических операций при расчете значения выражения. 7. Можно ли в арифметическом выражении использовать круглые скобки? С какой целью? А квадратные? 8. Как оформляется оператор присваивания? Как он работает (что происходит при его выполнении)? Логические выражения: группа Boolean 1. Что такое простое условие? Какие операции отношения используются в нем? 2 Что является результатом выполнения операции отношения? 3. Что такое составное условие? Какие логические операции используются в нем? Каков приоритет их выполнения? Как изменить этот приоритет? 4. В логическом выражении (составном условии) используются две величины логического типа (два простых условия) А и В. Сколько возможно различных вариантов сочетаний значений А и В? 5. В логическом выражении (составном условии) используются три величины логического типа (три простых условия) - А, В и С. Сколько возможно различных вариантов сочетаний значений А, В и С? Условный оператор: группа If 1. Какие виды условных операторов вы знаете? 2. В каких случаях в программе используется полный условный оператор? Как он оформляется? Как он работает (что происходит при его выполнении)? Нарисуйте алгоритмическую схему выполнения. 3. В каких случаях в программе используется неполный условный оператор? Как он оформляется? Как он работает (что происходит при его выполнении)? Нарисуйте алгоритмическую схему выполнения. 4. В каких случаях в программе используется вложенный условный оператор? Как он оформляется? 5. В каких случаях в программе используется оператор выбора? Как он оформляется? Как он работает (что происходит при его выполнении)? Нарисуйте алгоритмическую схему выполнения. Цикл с параметром: группа For - 101 -
1. В каких случаях используется оператор цикла с параметром? Как он оформляется? Как он работает (что происходит при его выполнении)? Нарисуйте алгоритмическую схему выполнения. 2. Что такое "тело оператора цикла"? 3. Может ли тело оператора цикла с параметром не выполниться ни разу? 4. Как должен быть оформлен оператор цикла с параметром, чтобы тело цикла выполнялось при уменьшающихся значениях параметра цикла? Как он будет работать (что будет происходить при его выполнении)? Нарисуйте алгоритмическую схему выполнения. 5. Чему равно количество повторений тела оператора цикла с параметром, если параметр цикла принимает: а) все целые значения от 1 до 10? б) все целые значения от а до b? в) все нечетные значения от 1 до 20? г) все нечетные значения от 1 до n? д) все значения от 10 до 100 с шагом 7? е) все значения от 1,5 до 10,3 с шагом 0,4? ж) все значения от а до b с шагом stер? 6. Можно ли в теле оператора цикла использовать условный оператор? 7. Какие вы знаете операторы для принудительного (преждевременного) выхода из оператора цикла? Можно ли вместо такой конструкции использовать оператор цикла с постусловием? А оператор цикла с предусловием? 8. Дан фрагмент программы: For a=1 to 10 MsgBox а If a=10 then a=a-1 Next a
Что произойдет при выполнении программы? Вложенные циклы
1. В каких случаях используются вложенные операторы цикла? 2. Как оформляются вложенные операторы цикла? Как они работают (что происходит при их выполнении)? Нарисуйте алгоритмическую схему выполнения.
- 102 -
3. Внешний цикл образован оператором цикла с параметром i, меняющимся от 1 до 5, внутренний - с параметром j, меняющимся от 3 до 7. Опишите последовательность изменения значений i и j. 4. Вложенный цикл образован двумя операторами цикла с параметром. Что является телом внешнего цикла? Что является телом внутреннего цикла? 5. Вложенный цикл образован двумя операторами цикла с параметром. Можно ли во внешнем и внутреннем циклах использовать один и тот же параметр цикла (переменную цикла)? 6. Может ли внешний оператор вложенного цикла а) не выполниться ни разу? б) выполняться бесконечное число раз (или до того момента, когда пользователь прервет его выполнение)? Операторы цикла с условием 1. В каких случаях используются операторы цикла с условием? 2. В каких случаях используется оператор цикла с предусловием? Как он оформляется? Как он работает (что происходит при его выполнении)? Нарисовать алгоритмическую схему выполнения. 3. Что такое "тело оператора цикла с предусловием"? 4. Может ли тело оператора цикла с предусловием: а) не выполниться ни разу? б) выполняться бесконечное число раз (или до тех пор, когда пользователь прервет его выполнение)? 5. В каких случаях используется оператор цикла с постусловием? Как он оформляется? Как он работает (что происходит при его выполнении)? Нарисовать алгоритмическую схему выполнения. 6. Что такое "тело оператора цикла с постусловием"? 7. Внешний цикл образован оператором цикла с параметром. Можно ли в качестве внутреннего цикла использовать оператор цикла с предусловием? А оператор цикла с постусловием? 8. Внешний цикл образован оператором цикла с предусловием. Можно ли в качестве внутреннего цикла использовать оператор цикла с параметром? А оператор цикла с постусловием? 9. Внешний цикл образован оператором цикла с постусловием. Можно ли в качестве внутреннего цикла использовать оператор цикла с параметром? А оператор цикла с предусловием? Массивы - 103 -
1. Что такое одномерный массив? Для чего используются одномерные массивы? Как они описываются? 2. Как называется номер элемента одномерного массива? 3. Как в программе использовать значение конкретного элемента одномерного массива? 4. Как можно заполнить одномерный массив? 5. Для чего в программах используются двумерные массивы? Как они описываются? 6. Сколько индексов характеризуют конкретный элемент двумерного массива? 7. Как в программе использовать значение конкретного элемента двумерного массива? 8. Как можно заполнить двумерный массив? 9. Какую структуру данных описывает двумерный массив? 10. Какой индекс двумерного массива изменяется быстрее при последовательном размещении элементов массива в оперативной памяти? Функции и процедуры 1. Что такое процедура? 2. В чем различие между функцией и процедурой? 3. Какие виды функций и процедур используются в программах? 4. Перечислить несколько стандартных функций и процедур. 5. В каких случаях целесообразно использовать нестандартные (определенные в программе) функции? 6. Как оформляются нестандартные (определенные в программе) функции и процедуры? 7. Могут ли в одной программе процедура и функция иметь одно и то же имя? 8. Может ли программист дать функции имя Sin? 9. Что такое формальные параметры функции или процедуры? 10. Как в программе выполнить функцию или процедуру? 11. Что такое фактические параметры функции или процедуры? Каковы правила их использования? 12. Какие преимущества дает использование нестандартных (определенных в программе) функций и процедур?
- 104 -
Список литературы 1. Гарбер, Г.3. Основы программирования на Visual Ваsiс и VВА в Excel 2007. Сер. «Библиотека студента». /Г.3. Гарбер. – М.: СОЛОН-ПРЕСС, 2008. - 192 с. 2. Уокенбах, Дж. Microsoft Office Ехсеl 2007. Библия пользователя. /Дж. Уокенбах: пер. с англ. - М.: ООО "И.Д. Вильямс", 2008. - 816 с. 3. Уокенбах, Дж. Профессиональное программирование на VBA в Excel 2003. /Дж. Уокенбах: пер. с англ. - М.: Диалектика, 2005. – 800 с. 4. Программирование в пакетах МS Office. /С.В. Назаров [и др.]. М.: Финансы и статистика, 2007. - 656 с. 5. Златопольский, Д.М. Сборник задач по программированию. /Д.М. Златопольский. – СПб.: БХВ-Петербург, 2007. - 240 с. 6. Голицына, О.Л. Основы алгоритмизации и программирования: учебное пособие. /О.Л. Голицына, И.И. Попов. - М: ФОРУМ, 2008. - 432 с. 7. Роман, С. Использование макросов в Ехсel. /С. Роман. - СПб.: Питер, 2004 - 507 с. 8. Гладкий, А.А. Ехсеl. Трюки и эффекты. /А.А. Гладкий, А.А. Чиртик. - СПб.: Питер, 2006. - 368 с. 9. Эйткен, Питер. Интенсивный курс программирования в Excel за выходные: учебное пособие. /Питер Эйткен: пер. с англ. - М.: ООО "И.Д. Вильямс", 2004. - 432 с. 10.Xорев, В.Д. Самоучитель программирования на VВА в Мicrosoft Office. /В.Д. Xорев. - К.: Юниор, 2001. - 320 с. 11.Демидова, Л.А. Программирование в среде Visual Ваsic for Аррlications: практикум. /Л.А. Демидова, А.Н. Пылькин. - М.: Горячая линия – Телеком, 2004. - 175 с. 12.Семакин, И.Г. Основы программирования: учебник. /И.Г. Семакин, А.П. Шестаков. - М.: Мастерство, 2002. - 432 с. 13.Харрис, Мэтью. Освой самостоятельно программирование для Мicrosoft Ехсеl 2000 за 21 день: учебное пособие. /Мэтью Харрис: пер. с англ. - М.: ООО "И.Д. Вильямс", 2000 - 880 с. 14.Штайнер, Г. VВА 6.3: справочник./ Г. Штайнер. - М.: Лаборатория базовых знаний, 2002. - 784 с.
- 105 -
Содержание Введение ................................................................................................................... 3 Основные понятия объектно-ориентированного программирования ................... 6 Модули ..................................................................................................................... 7 Основные элементы управления в редакторе VBA ............................................... 9 Стандартные приемы программирования в среде VBA ..................................... 25 Введение ............................................................................................................ 25 Отладка программы .......................................................................................... 26 Основные элементы программного кода в среде VBA ................................... 27 Приемы работы в среде программирования VBA................................................ 65 Запуск среды VBA ............................................................................................ 65 Создание функции пользователя...................................................................... 66 Создание макрокоманды (макроса) ................................................................. 71 Создание пользовательской формы ................................................................. 76 Работа с листами книги .................................................................................... 79 Лабораторные задания по темам ........................................................................... 90 Целочисленное программирование.................................................................. 90 Ввод и вывод данных, оператор присваивания ............................................... 91 Логические выражения: группа Boolean.......................................................... 91 Условный оператор: группа If .......................................................................... 92 Оператор выбора ............................................................................................... 94 Цикл с параметром: группа For ........................................................................ 95 Цикл с условием: группа While ........................................................................ 96 Массивы............................................................................................................. 97 Функции и процедуры ...................................................................................... 99 Контрольные вопросы ......................................................................................... 100 Список литературы .............................................................................................. 105 Содержание .......................................................................................................... 106
- 106 -
УЧЕБНОЕ ИЗДАНИЕ
Ф.И. Воробьева, Е.С. Воробьев
ПРИЕМЫ ПРОГРАММИРОВАНИЯ В СРЕДЕ VISUAL BASIC FOR APPLICATION MS OFFICE
Ответственный за выпуск Ефанова Э.А.
Лицензия № 020404 от 6. 03. 97 г. Подписано в печать 26.02.10. Бумага офсетная 6,5 уч.-изд. л.
Формат 60х84/16 Печать Riso Тираж 100 экз.
6,04 усл. печ. л. Заказ
“C”
Издательство Казанского государственного технологического университета Офсетная лаборатория Казанского государственного технологического университета 420015, Казань, К. Маркса, 68
- 107 -