Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Код затр Затрата Стоимость Дата



12 Проектирование линии электропередач 305.00 02.04.98

11 Строительство трансформаторной подстанции 480.00 15.05.98

Итоги для 'Организация' = ОАО "Всестрой" (2 записей)

Сумма 785.00

ИТОГО 2 970.00

21 августа 1999 г.Страница 1 из 1


Рис. 9.5. Типичный вид отчета, получаемого с помощью СУБД Access

Завершая краткое рассмотрение СУБД Access, подчеркнем важную роль запросов. Именно с помощью запросов в любой СУБД можно отбирать данные по многим критериям, сортировать записи и, вообще, выполнять многие операции манипулирования данными. В основе этих операций – инструкции языка структурированных запросов (SQL). Когда мы создаем запрос, используя через процедуру Конструктор его визуальное конструирование, Access формирует текст этого запроса на языке SQL. Этот текст можно увидеть и при желании изменить в момент просмотра запроса. Для просмотра запроса мы нажимаем в окне базы данных кнопку Запросы (вверху), выделяем щелчком мыши требуемый запрос, и нажимаем кнопку Открыть (в окне базы данных, справа). Эти действия приведут к появлению на экране нашего запроса в виде таблицы содержащей отобранные данные. Если теперь в меню приложения Access выбрать пункт Вид/Режим SQL, то мы увидим наш запрос не в виде таблицы отобранных данных, а в виде SQL-инструкций. Эти инструкции можно изменить и с помощью пункта меню Запрос/Запуск или кнопки Запуск на панели инструментов (красный восклицательный знак) выполнить запрос и получить новую таблицу с отобранными данными.

Кроме выполнения SQL-запросов в рамках базы данных, созданной на локальном компьютере, Access позволяет (пункт меню Запрос/Запрос SQL/К серверу) посылать запросы на SQL-сервер (см. подраздел 5.3), поддерживающий ODBC (Open Data Base Connectivity) – взаимодействие баз данных открытой архитектуры. Легче всего организовать такое использование Access в рамках технологии клиент/сервер, если в качестве SQL-сервера применяется Microsoft SQL Server, но и в этом случае требуется установка необходимых драйверов ODBC. Такие вопросы обычно решаются системными программистами и выходят за рамки этой книги. Но основные инструкции (команды) языка SQL мы считаем полезным рассмотреть, т.к. представление о языке SQL позволяет лучше понять возможности манипулирования данными, имеющиеся в современных СУБД. В русских переводах компьютерной литературы инструкции SQL и других языков программирования часто называют операторами. В англоязычных изданиях применяются термины statement или instruction.

9.4. Основные возможности языка структурированных запросов (SQL)

Сразу заметим, что в этой небольшой книге мы не ставим задачу дать описание SQL, а всего лишь приведем обзор основных команд и на нескольких примерах покажем возможности SQL-запросов. Что касается точного описания инструкций SQL, то это описание не совсем совпадает для различных СУБД. Наиболее известные серверы реляционных баз данных (Oracle, MS SQL Server, Cybase, Informix и некоторые другие) поддерживают ту или иную версию или уровень стандарта ANSI / ISO SQL (ANSI – Американский национальный институт стандартов, ISO – Международная организация стандартизации), но для повышения эффективности каждый коммерческий SQL-сервер применяет некоторые расширения стандарта. Приведенные ниже примеры проверены в рамках СУБД Access. Кстати, справочная система Access достаточно полно разъясняет инструкции SQL. Ясное и полное описание технологии клиент/сервер, включающее также классификацию и описание команд SQL, применительно к СУБД Oracle 7 приведено в [14].

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

Можно выделить несколько классов команд SQL: определения данных, манипулирования данными, управления транзакциями, управления данными (доступом к ним). Последние два класса инструкций применяются в запросах к SQL-серверам, а первые два класса – и в запросах к локальным СУБД.

Команды языка определения данных (DDL – Data Definition Language) – это команды SQL, которые можно использовать для создания (CREATE), изменения (ALTER) и удаления (DROP) различных объектов базы данных (таблиц, процедур и др.). В качестве примера рассмотрим команду, с помощью которой можно создать таблицу Objects [ КодОб, ИмяОб]:

CREATE TABLE Objects(КодОб LONG CONSTRAINT obj PRIMARY KEY, ИмяОб TEXT(40))

В этой инструкции CREATE TABLE указывается имя создаваемой таблицы (Objects), и затем в скобках, через запятую описываются поля записей. Поле КодОб имеет тип LONG (см. раздел 3), а после слова CONSTRAINT (ограничение) указывается имя индекса (obj) для этого поля и параметр PRIMARY KEY – ведь поле КодОб должно быть первичным ключем. Описание второго поля таблицы включает его имя (ИмяОб), тип (TEXT) и длину в байтах (40). Пример показывает, что при хорошем знании синтаксиса языка SQL структуру любой таблицы базы данных можно создать не только с помощью имеющихся в Access (но не в каждой СУБД) средств визуального конструирования, но и с помощью команды SQL.

К числу команд языка манипулирования данными (DML) относятся инструкции SELECT (отбор данных), INSERT (вставка записей в таблицу), UPDATE (обновление записей), DELETE (удаление записей). Приведем пример инструкции SELECT:

SELECT Затраты.[Код затр], Объекты.Объект, Работы.Работа, Организации. Организация, Затраты.Дата, Затраты.Стоимость

FROM Затраты, Организации, Работы, Объекты

WHERE Объекты.[Код об] = Затраты.[Код об] AND Работы.[Код раб] = Затраты.[Код раб] AND Организации.[Код орг] = Затраты.[Код орг] AND Затраты.Дата >= #3/31/98# AND Затраты.Дата < #7/1/98# AND Работы.Работа='Строительство'

ORDER BY Затраты.[Код затр];

В этом примере создается виртуальная таблица, состав полей которой определен во фразе SELECT, до фразы FROM: поле Код затр из таблицы Затраты, поле Объект из таблицы Объекты и т.д. Имя таблицы и имя поля указываются через точку. Имя поля Код затр заключено в квадратные скобки, т.к. содержит пробел. В некоторых СУБД для ограничения имен с пробелами применяются апострофы.

Во фразе FROM указываются имена исходных таблиц.

Во фразе WHERE задаются условия отбора записей. Так, из таблицы Затраты отбираются только те записи, в которых дата больше (позже) или равна 31.03.98 и меньше (раньше) 01.07.98 (даты в текстах запросов задаются в формате #мм/дд/гг#). Одновременно требуется, чтобы вид работ (поле Работа) был строительством. Для того, чтобы к записи из таблицы Затраты “привязать” через коды объекта, работы и организации соответствующие записи из других таблиц, во фразе WHERE заданы еще условия равенства этих кодов. Все условия заданы через И (AND), поскольку в этом примере требуется выполнение и первого, и второго, и остальных условий. В некоторых запросах условия задаются через ИЛИ (OR) – тогда для отбора записи требуется выполнение или первого, или второго условия.


Во фразе ORDER BY указано поле, по которому надо упорядочить (отсортировать) записи в виртуальной таблице результатов. Эта таблица не хранится в базе данных, а создается только в оперативном порядке, например, когда запрос является источником данных для формирования отчета. На рис. 9.6 показан результат запроса, содержащего рассмотренную инструкцию SELECT.

Рис. 9.6. Результат запроса, содержащего инструкцию SELECT

Приведем также примеры инструкции DELETE:

DELETE * FROM Объекты - удаление всех записей из таблицы Объекты,

DELETE * FROM Организации WHERE Город IN (‘Париж’,’Ницца’,’Чикаго’) - удаление из таблицы Организации записей, соответствующих тем организациям, которые расположены в городах, входящих в указанное множество. Если в таблице таких записей не окажется, то ничего удалено не будет.

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

COMMIT - сохранить (зафиксировать) внесенные текущей транзакцией изменения,

ROLLBACK – отменить изменения, вносимые текущей транзакцией,

SAVEPOINT – назначить промежуточную точку сохранения.

Промежуточные точки позволяют разбить выполняемую транзакцией работу на фрагменты:

INSERT …

DELETE …

SAVEPOINT one

UPDATE …

DELETE …

SAVEPOINT two

INSERT …

UPDATE …

Используя точки сохранения можно отменить одни части транзакции и оставить другие:

ROLLBACK TO SAVEPOINT two

Эта команда отменит действие всех SQL-инструкций после точки сохранения two.

Команды языка управления данными (DCL) используются для управления доступом пользователей к базе данных. Эти команды, как и инструкции управления транзакциями применяются при работе с SQL-серверами. Например, в СУБД Oracle 7 [14] введено понятие ролей. Каждая роль имеет имя и определенный набор полномочий: право создавать или удалять таблицы, изменять определенные таблицы и т.п. Если пользователь знает пароль некоторой роли, например, роли с именем role7, то он может установить эту роль в текущем сеансе и тем самым получить полномочия этой роли:

SET ROLE role7 IDENTIFIED BY x77y - устанавливается роль role7 с паролем x77y.

Кроме обширного набора команд языка SQL, серверы реляционных баз данных предоставляют средства для создания процедур и триггеров базы данных (триггер - особый тип процедур – см. далее). Так, Oracle 7 предлагает для SQL процедурные языковые расширения, называемые PL/SQL. Сам SQL – непроцедурный язык: мы не видим деталей обработки, конкретных процедур, в которые сервер транслирует наш запрос. Отсюда и простота использования SQL. Процедурные языки, такие как Си, Паскаль, Бейсик, требуют детальной записи действий. Поэтому их использовать сложнее, но они обладают большей гибкостью и более широкими возможностями. PL/SQL сочетает возможности SQL с возможностями процедурного языка. Как и в программе на процедурных языках (раздел 10), в процедуре на PL/SQL можно описать переменные и константы, использовать инструкции проверки условий, организовывать циклы и т.д. В виде процедур и их пакетов можно запрограммировать сложные алгоритмы обработки данных, что иногда невозможно или неэффективно сделать с помощью одних только команд SQL. Особым видом процедур являются триггеры базы данных. Триггер – это процедура, связываемая с таблицей. Когда дается команда SQL, соответствующая условиям триггера, СУБД запускает триггер на выполнение. Поэтому триггеры используют для того, чтобы СУБД реагировала на различные ситуации, например, на ввод в таблицу определенных данных. Таким образом, в рамках технологии «клиент/сервер» на сервере хранятся не только данные, но и многочисленные процедуры их обработки.

Приведенные сведения о языке SQL и возможностях реляционных СУБД показывают, что на основе СУБД можно создавать сложнейшие информационно-обрабатывающие системы, причем их разработка резко облегчается благодаря языку SQL и расширяющим его возможности инструментальным средствам программирования.

Контрольные вопросы к разделу 9: что такое база данных, предметная область, структурирование данных; структуры данных – таблица, запись, поле; назначение ключа, индекса; что такое реляционная база данных; понятие информационно-логической модели предметной области; назначение СУБД; нормализация отношений; что такое первая, вторая и третья нормальные формы; обеспечение целостности данных в базе данных; схема обобщенной технологии работы с СУБД; работа с СУБД Access – создание новой базы данных, создание структуры таблиц, ввод данных в таблицы, создание и применение форм, запросов, отчетов; что такое SQL, классы команд SQL; команды языка определения данных; команды языка манипулирования данными; команды управления транзакциями; команды языка управления данными (доступом к данным); что такое процедуры и триггеры базы данных.


10. Введение в программировние. Создание приложений на языке Visual Basic for Applications

10.1. Основные понятия

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

Этот раздел не претендует на то, чтобы сделать из читателя программиста. Каждый, кто любит строгую логику, и имеет склонность к формализованному мышлению, может сам стать программистом, но для этого требуется желание и продолжительная практика. В этом отношении обучение программированию очень похоже на обучение шахматам: кроме знания теории и типовых приемов, необходимо накопить опыт и натренировать мозг, сформировав в нем множество “хранимых процедур”. В шахматах это процедуры принятия решений во многих сходных позициях, реализации множества уже встречавшихся комбинаций и т.п. В программировании это процедуры организации циклов, работы с данными различных типов и многие другие. Поэтому цель этого раздела – помочь читателю вступить в мир программирования, научить его делать первые шаги, познакомив с современными инструментальными средствами и методами создания программ. Эти знания, во-первых, должны облегчить понимание логики готовых приложений, а, во-вторых, должны дать возможность разрабатывать собственные, пусть небольшие, но необходимые в практической деятельности программы.

В качестве инструмента для создания приложений в данной работе выбран VBA –Visual Basic for Applications (Visual Basic для приложений). Этот выбор объясняется следующими причинами:

· VBA – это интегрированная среда визуального программирования, позволяющая создавать современные событийно-объектно-ориентированные приложения с унифицированным графическим интерфейсом (см. раздел 2);

· языковые средства VBA по гибкости и полноте не уступают языковым средствам других современных систем программирования и, следовательно, позволяют освоить типовые методы и приемы разработки программных процедур;

· VBA является общей языковой платформой для всех приложений MS Office и позволяет в создаваемых программах работать с объектами Word, Excel, Access, Power Point, OutLook, Binder; мы будем рассматривать VBA во взаимосвязи с Excel, размещая на листах Excel исходные данные и результаты решения задач.

Последняя из перечисленных причин чрезвычайно важна. Дело в том, что среда программирования VBA, в отличие от VB (Visual Basic), работает только совместно с другим, основным приложением, например, Excel. Создаваемое приложение в этом случае встраивается в книгу Excel. Эта особенность в значительной мере определяет область применения VBA. Если надо создать автономное многофункциональное приложение, то лучше использовать VB, Delphi или Си++. Если же мы хотим расширить возможности основного приложения, например, Excel или преследуем учебные цели, то лучше VBA трудно что-нибудь придумать. Ведь VBA, как мы увидим, дает возможность моментально создать интерфейс пользователя, Excel предоставляет средства для оперирования табличными данными, и, следовательно, все внимание можно сосредоточить на реализации событийных и общих процедур (см. раздел 2), т.е. на алгоритмизации и, собственно, программировании. Немаловажно также то, что среда разработки VBA встроена в MS Office, и поэтому на компьютерах в учебных классах не требуется установка и поддержка дополнительных средств программирования.

Предварительные сведения о создании приложений с помощью инструментальных сред визуального программирования уже приводились в подразделе 6.2. Здесь мы рассмотрим создание интерфейса пользователя, а также переменные, константы, инструкции и другие языковые конструкции Бейсика, с помощью которых строятся событийные и общие процедуры.

10.2. Создание интерфейса пользователя

Рассмотрим создание интерфейса пользователя на простом примере. Пусть на листе Excel размещены столбцы чисел. Требуется, чтобы проектируемое приложение позволяло пользователю выбрать столбец для сортировки, выбрать вариант сортировки (по возрастанию или по убыванию) и, наконец, выполнить саму сортировку. Из поставленной задачи следует, что наше приложение надо “оснастить” элементами управления (см. подраздел 2.2) для выбора номера столбца (поле во взаимосвязи со счетчиком), варианта сортировки (переключатели) и для запуска событийной процедуры сортировки (командная кнопка). С помощью VBA эти элементы управления можно разместить или прямо на листе Excel (рис. 10.1), или же на диалоговой форме, которая будет появляться в диалоговом окне (поверх листа Excel) при нажатии на кнопку Сортировать – кнопку целесообразно оставить на листе Excel и в этом случае. Рассмотрим первый вариант.

С помощью пункта меню Вид/Панели инструментов/Visual Basic разместим панель инструментов VBA рядом с другими панелями инструментов Excel (см. рис.10.1). На этой панели нас будут интересовать два значка: Элементы управления (значок в виде молоточков) и Редактор Visual Basic (соседний слева). Второй значок нам понадобится позже, во время разработки процедур, для переключения на окно редактора. А нажатие на кнопку с первым значком приведет к появлению в пределах листа Excel окна, содержащего палитру элементов управления (на рис. 10.1 – справа) и три кнопки: Режим конструктора, Свойства и Исходный текст.

Первая из этих кнопок позволяет перейти в режим конструктора. В этом режиме работа пользователя с таблицей Excel блокируется, но есть возможность создавать приложение VBA. Вторая кнопка позволяет открыть окно Свойства – оно показано на рисунке для счетчика, имеющего имя SpinButton1 (он выделен шелчком мыши). Третья кнопка позволяет переключиться в окно редактора, причем именно на процедуру обработки события, связанного с выделенным элементом управления – на рис.10.2 это событийная процедура, срабатывающая в тот момент, когда пользователь изменяет значение счетчика.

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

· Надпись со статическим текстом, для которой установлено свойство Caption (Заголовок) – Номер столбца;

· поле, для которого установлено свойство Value (Значение) – 1; если пользователь не изменит это значение, то сортироваться будет первый столбец;

· счетчик; для него установлены свойства Min =1, Max =100, Value =1;

· переключатели, для которых установлены свойства Caption и Value; у одного из переключателей заголовок - По возрастанию, а у второго – По убыванию; у одного свойство Value = True (истина – истинным считается утверждение о выборе этого переключателя), у второго Value = False (ложь);

· командная кнопка; для нее установлено свойство Caption = Сортировать.

Каждому элементу управления VBA присваивает имя по умолчанию. Например, первому переключателю – OptionButton1, второму – OptionButton2, счетчику – SpinButton1, т.е. берется английское название элемента, и к нему присоединяется порядковый номер. Имя можно изменить, как всякое свойство объекта. Например, переключатели можно назвать короче: Option1, Option2. Имена элементов управления участвуют в образовании имен событийных процедур. Так, при двойном щелчке мышью по элементу SpinButton1 произойдет переключение на окно Visual Basic (Рис. 10.2), в котором автоматически появится пустая событийная процедура:

Private Sub SpinButton1_Change()

End Sub

Правила записи процедур мы рассмотрим в следующих подразделах. Сейчас важно понять, что процедура SpinButton1_Change будет автоматически выполняться, как только пользователь изменит значение счетчика (Change – изменять).

Панель инструментов

 
 

Режим конструктора
Visual Basic

Свойства
Элементы управления
Свойства объекта SpinButton1
Рис. 10.1. Лист Excel в момент создания интерфейса приложения средствами VBA

Переключение на окно Excel


Создание формы

Рис. 10.2. Окно Visual Basic, в нем окна проекта и редактора

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

Private Sub CommandButton1_Click()

End Sub

Ее имя образовано из имени элемента управления (CommandButton1) и имени события (Click – щелчок).

Приведенный пример показывает, что создание интерфейса приложения, которое было трудной работой в более ранних системах программирования, в современных средах визуального программирования выполняется моментально – и это можно утверждать без преувеличений. Но поясним еще вариант размещения элементов управления не на листе Excel, а на отдельной форме. В этом варианте на лист Excel поместим только кнопку CommandButton1 с тем же заголовком Сортировать, а остальные элементы управления и дополнительно кнопку Ok поместим на диалоговую форму с именем Dialog1 и заголовком Параметры сортировки. Для создания этой формы надо переключиться в окно Visual Basic и с помощью кнопки на панели инструментов или через пункт меню Вставка/UserForm создать пустую форму. Она появится в окне Visual Basic. При щелчке мышью по форме появляется также окно Панель элементов, содержащее палитру элементов управления. Теперь остается с помощью кнопки на панели инструментов раскрыть в окне Visual Basic еще окно свойств, установить свойства формы и разместить на ней требуемые нам элементы управления точно так же, как это было сделано на листе Excel (Рис. 10.3). Такой подход почти освободит лист Excel от элементов управления, но потребует дополнительных усилий при разработке приложения.


Рис. 10.3. Окно Visual Basic во время создания диалоговой формы

Во-первых, теперь в начало событийной процедуры CommandButton1_Click (ее мы будем рассматривать позже) надо вставить команду для показа формы: Dialog1.Show. В этой инструкции записывается имя объекта (имя, присвоенное нами форме) и, через точку, имя метода – показать. Следовательно, как только пользователь нажмет командную кнопку на листе Excel, поверх этого листа появится диалоговое окно (Рис. 10.4). В нем пользователь выберет параметры сортировки и нажмет кнопку Ok.

Во-вторых, надо написать событийную процедуру для кнопки Ok. Эта процедура должна содержать команду Dialog1.Hide - скрыть форму Dialog1.

В-третьих, в процедурах, принадлежащих листу Excel, а не форме Dialog1 (см. процедуру CommandButton1_Click на рис. 10.2), изменится обращение к свойствам элементов управления. Так, теперь надо писать не TextBox1.Value, а Dialog1.TextBox1.Value – так указывается свойство Value (значение) объекта TextBox1 (редактируемое поле), принадлежащего форме Dialog1.

Приведенные сведения о конструировании интерфейса пользователя вполне достаточны для создания не слишком сложных приложений. При установке свойств элементов управления, кроме значений таких свойств, как Caption, Value, обычно изменяют еще некоторые свойства, предлагаемые по умолчанию, например, те, что определяют дизайн интерфейса: Font (шрифт), BorderStyle (стиль рамки – отсутствует, одинарная и т.п) и др. Теперь перейдем к рассмотрению основных конструкций и команд (инструкций) языка Visual Basic. Его знание необходимо для разработки событийных и общих процедур.

 
 

Рис. 10.4. Интерфейс приложения, созданный с применением диалоговой формы

10.3. Модули, процедуры, функции

Приложение, созданное на VBA, имеет модульную структуру. Это означает, что процедуры, входящие в приложение, группируются в модули. Когда в подразделе 10.2 мы создавали интерфейс приложения, размещая все элементы управления на листе Excel, приложение содержало только один модуль, который, подобно рамке, включал в себя все процедуры приложения (см. рис. 10.2). Этот модуль относился к объекту Excel, имеющему имя Лист1. Когда был применен второй вариант конструирования интерфейса (вариант с диалоговым окном Dialog1), наш проект (разрабатываемое приложение) стал содержать два модуля – переключаться на их тексты удобно с помощью пункта меню Окно (см. рис. 10.2, 10.3).

Первый модуль по-прежнему относится к объекту Лист1, а второй к форме Dialog1. В составе первого модуля осталась событийная процедура CommandButton1_Click(), не имеющая параметров (в скобках – пусто), и общая процедура Mrows(I1 As Integer, J1 As Integer, M As Integer), которая определяет номер M последней занятой ячейки в столбце J1, причем проверки ячеек столбца начинаются с ячейки I1. При вызове этой процедуры для конкретизации ее функций используются 3 параметра. Параметр I1 введен, чтобы расширить область применимости процедуры: ведь в общем случае столбцы чисел могут размещаться не с первой, а с любой другой строки таблицы Excel.

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

Private Sub SpinButton1_Change()

TextBox1.Value = SpinButton1.Value

End Sub

Смысл этой процедуры в том, что при изменении свойства Value счетчика, это изменение надо отобразить в поле TextBox1, изменив и его свойство Value. Вторая событийная процедура диалоговой формы реагирует на нажатие кнопки Ok:

Private Sub ButtonOk_Click()

Dialog1.Hide

End Sub

Эта процедура делает диалоговую форму скрытой, невидимой.

Те процедуры, которые начинаются со слова Private, являются собственностью модуля, в который они включены: к ним нельзя обратиться из других модулей. Процедуры, перед названием которых указано только слово Sub (сокращение от Subroutine – подпрограмма), доступны и из других модулей. Таким образом, процедура – это подпрограмма, имеющая заголовок, содержащая команды VBA (тело процедуры) и завершающаяся инструкцией End Sub. Заголовок процедуры определяет ее тип, имя и параметры, конкретизирующие ее функции. Поясним синтаксис процедуры на примере общей процедуры Mrows - ее параметры были пояснены выше. Эта процедура имеет вид:

Sub Mrows(I1 As Integer, J1 As Integer, M As Integer)

‘ J1 – номер столбца,

‘M – определяемый номер последней непустой ячейки в столбце

M = I1 ‘ I1 – номер (по вертикали) первой проверяемой в столбце J1 ячейки

Do Until IsEmpty(Cells(M, J1)) ‘ начало цикла

‘ цикл, завершающийся инструкцией Loop, выполняется, пока ячейка (M,J1) не пуста

M = M + 1 ‘ наращивание M – это переход к следующей ячейке столбца

Loop ‘ конец цикла

M = M - 1

End Sub

Параметры процедуры описываются в скобках, в строке заголовка, с указанием типов через ключевое слово As (как, в качестве). В эту процедуру вставлены комментарии –начинаются с апострофа. В каждой строке записывается одна или несколько инструкций. В последнем случае инструкции разделяются двоеточием (см. первую процедуру на рис. 10.2). Общую процедуру можно вызывать из других процедур. Так, с помощью процедуры Mrows событийная процедура CommandButton1_Click (см. рис. 10.2) определяет количество чисел в столбце, подлежащем сортировке.

Кроме подпрограмм-процедур, обозначаемых ключевым словом Sub, применяются подпрограммы- функции, обозначаемые ключевым словом Function. Так, вместо процедуры Mrows можно было написать функцию Mrows:

Function Mrows(I1 As Integer, J1 As Integer) As Integer

Dim i As Integer

i = I1 - 1

Do

i = i + 1

Loop Until IsEmpty(Cells(i, J1))

Mrows = i - 1

End Function

Подпрограмму оформляют в виде функции, если результатом является единственное значение. Если же надо сразу получить более одного результата, например, найти число непустых строк и столбцов таблицы, то можно использовать только процедуру Sub. Функция отличается от процедуры не только первой и последней инструкциями, но и присваиванием результата ей самой (см. предпоследнюю инструкцию функции Mrows). В функцию мы включили описание переменной i, а цикл (инструкции от Do до Loop) записали для разнообразия иначе, чем в процедуре. Вызов функции Mrows из событийной процедуры CommandButton1_Click (см. рис. 10.2) имел бы вид: M = Mrows(I1, J). Здесь обязательно надо подчеркнуть различие между формальными параметрами процедуры (или функции) и фактическими параметрами, используемыми при ее вызове. Так при написании функции Mrows второй параметр обозначен J1 – это формальный параметр, ему соответствует адрес ячейки, содержащей номер столбца. В момент написания функции этот адрес не известен и не важно, как он обозначен в тексте функции. Реальное значение этого адреса – фактический параметр - передается как второй параметр функции в момент ее вызова процедурой CommandButton1_Click. В этой процедуре номер столбца обозначен через J. Таким образом, важно не обозначение параметра при вызове функции, а его тип (здесь – целое число) и порядковый номер в списке передаваемых фактических параметров.

Обратим также внимание на то, что функция Mrows, в свою очередь, обращается к встроенной функции IsEmpty, а ее параметром является значение встроенной функции Cells. Функция Cells(i,j) предоставляет свойства, в том числе и значение, ячейки, расположенной на пересечении i-ой строки и j-го столбца того листа Excel, к которому относится модуль. Если потребуется ячейка на листе с именем Лист2, то надо написать: Лист2.Cells(i,j) или Лист2.Cells(i,j).Value - при доступе к конкретному свойству ячейки (i,j) – к хранимому в ней значению. Функция IsEmpty проверяет, является ли ячейка пустой. Если это так (ячейка не инициализирована – в ней хранится условный редкий код), то функция возвращает логическое значение (типа Boolean), равное True (истина), иначе – False (ложь). Другими словами, в функции Mrows значение переменной i наращивается в цикле до тех пор, пока не встретится пустая ячейка в столбце.

Нельзя забывать о различиях в вызове процедур и функций при программировании на VBA. При вызове процедуры указывают ее имя, пробел и параметры, разделяемые запятыми. Функцию используют в различных выражениях, например, в инструкциях присваивания. При этом указывают имя функции и далее, в скобках, параметры – аргументы функции. Функции могут использоваться и в качестве процедур, если возвращаемый результат не нужен. Так, встроенная в Visual Basic функция MsgBox, позволяет вывести сообщение или организовать простенький диалог. При выводе сообщения MsgBox вызывается как процедура:

MsgBox M,,”Номер последней строки”

В этом примере выводится диалоговое окно с заголовком ”Номер последней строки”. Окно содержит число M и одну кнопку Ok. Эту процедуру можно вызвать немного иначе:

MsgBox Str(M), 0,”Номер последней строки”

Результат будет тем же самым. Просто во втором варианте число M перед выводом преобразовано в строку символов (с помощью встроенной функции STR), и явно задан второй параметр. Вообще говоря, первый параметр этой процедуры должен быть именно строкой символов, а не числом, но VBA “понимает”, что M – это число, и сам преобразует его к строковому типу данных. Второй параметр – это код размещения в окне определенных кнопок. Код 0 – это значение по умолчанию, его можно не указывать между запятыми на месте второго параметра, и будет выведена только одна кнопка Ok. Второй параметр играет важную роль при организации диалога, т.е. при использовании MsgBox в качестве функции:

Dim Sort As Boolean

Sort=True ‘Сортировка по возрастанию

IF MsgBox(“По возрастанию?”, 4, “Вариант сортировки”)=7 Then Sort=False

В этом примере переменная Sort описана как логическая - она может принимать одно из двух значений: True (истина) или False (ложь). Сначала принимаем вариант сортировки по возрастанию (Sort=True), а затем выводим стандартное диалоговое окно с заголовком “Вариант сортировки”. В окне помещаем строку “По возрастанию?” и две кнопки: “Да” и “Нет”. Код 4 (второй параметр функции) задает вариант вывода в окне именно этих двух кнопок. Результатом функции является код выбранной кнопки. Код кнопки “Да” равен 6, а кнопки “Нет” – 7. Если пользователь выбрал “Нет”, то значение переменной Sort изменяется на False. Программисту трудно запомнить все эти коды вариантов вывода и выбора кнопок. Поэтому VBA хранит константы, имена которых запомнить легче - их можно указывать вместо числовых кодов. Приведем некоторые из них:

VbOkOnly=0, VbOkCancel=1, VbYesNoCancel=3, VbYesNo=4 - варианты вывода кнопок,

VbOk=1, VbCancel=2, VbYes=6, VbNo=7 – возвращаемые значения.

Процедура-функция MsgBox довольно удобна во многих случаях. Для получения подробной справки о ней или о другой встроенной функции (Таблица 10.1) достаточно ввести название функции в строку окна редактора VBA, поместить на это название курсор и нажать функциональную клавишу F1. В открывшемся окне справки полезно обратить внимание на ссылки См. также и Пример.

Теперь необходимо рассмотреть переменные и типы данных, применяемые в VBA. Но прежде сделаем еще два замечания по поводу модулей.

Таблица 10.1





Дата публикования: 2014-11-02; Прочитано: 334 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.025 с)...