Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

9_Ломтадзе В.В., Шишкина Л.П_Практическая информатика_2011

.pdf
Скачиваний:
163
Добавлен:
26.03.2016
Размер:
3.06 Mб
Скачать

10. ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ. СОЗДАНИЕ ПРИЛОЖЕНИЙ НА ЯЗЫКЕ VISUAL BASIC FOR APPLICATIONS

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

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

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

В качестве инструмента для создания приложений в данной работе вы-

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

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

131

языковые средства 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) при нажатии на кнопку

132

Сортировать – кнопку целесообразно оставить на листе 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. Имена элементов управления участвуют в образовании имен событийных процедур. Так, при двойном щелчке мышью по элементу

133

SpinButton1 произойдет переключение на окно Visual Basic (Рис. 10.2), в котором автоматически появится пустая событийная процедура:

Private Sub SpinButton1_Change( )

End Sub

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

(Change – изменять).

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

Visual Basic

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

Свойства

Свойства объекта

SpinButton1

Элементы

управления

Рис. 10.1. Лист Excel в момент создания интерфейса приложения средствами VBA

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

134

Private Sub CommandButton1_Click( )

End Sub

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

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

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

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

Приведенный пример показывает, что создание интерфейса приложения, которое было трудной работой в более ранних системах программирования, в современных средах визуального программирования выполняется моментально

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

135

При щелчке мышью по форме появляется также окно Панель элементов, содержащее палитру элементов управления. Теперь остается с помощью кнопки на панели инструментов раскрыть в окне 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), изменится обращение к

136

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

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

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

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

Приложение, созданное на VBA, имеет модульную структуру. Это означает, что процедуры, входящие в приложение, группируются в модули. Когда в подразделе 10.2 мы создавали интерфейс приложения, размещая все элементы управления на листе Excel, приложение содержало только один модуль, кото-

137

рый, подобно рамке, включал в себя все процедуры приложения (см. рис. 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 - ее параметры были пояснены выше. Эта процедура имеет вид:

138

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).

Здесь обязательно надо подчеркнуть различие между формальными параметра-

139

ми процедуры (или функции) и фактическими параметрами, используемыми при ее вызове. Так при написании функции 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 “по-

140