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

Orlov_VBA

.pdf
Скачиваний:
23
Добавлен:
13.03.2016
Размер:
7.79 Mб
Скачать

Applications обьявление переменной проводится указанием ее имени и типа в соответствующем разделе модуля, который так и называется - Описания и располагается в самой верхней его части, до начала первой программы (рис. 4.4). Для размещения описания нужно поместить туда строчку вида "Dim x(переменная) As (тип данных)": "Dim a As Integer".

Вместо слова Dim могут также использоваться слова Public и Private, которые тоже служат для обьявления переменных. Переменная, обьявленная командой Public, может использоваться и программами из других модулей и форм, при этом она своего значения не теряет. Переменная же, обьявленная командой Private (или Dim), может использоваться только в программах модуля, в котором она обьявлена. При наличии одноименной переменной в программах другого модуля ее значение не будет передаваться в них при их вызове из программы модуля, где она обьявлена, - т.е. если вы поместите в программу команду, запускающую макрос из другого модуля, то в этом другом модуле одноименная переменная отнюдь не будет иметь то же значение, что и в исходной программе.

Рис. 4.4. Область описаний

Как Public или Private переменная может быть обьявлена только в разделе описаний переменных. С помощью же инструкции (команды, не выполняющей реальных действий) Dim она может быть обьявлена и в тексте программы. Однако тогда ее другие модули уже использовать не смогут никак.

В области работы с типами данных Visual Basic for Applications имеет еще одну достаточно уникальную особенность. При написании программ на этом языке можно, как ни странно, даже вообще не обьявлять специально переменные! Просто включите их в текст программы по мере надобности, и тогда Visual Basic for Applications автоматически присвоит им специальный тип для таких случаев - "Variant". В переменной, имеющей этот универсальный тип, может содержаться что угодно - хоть число, хоть текст. Однако следует помнить, что обьем памяти, отводимый под переменную типа Variant, весьма велик, - значительно больше, чем под любой другой тип данных, поэтому определять все переменные как тип Variant не всегда рационально. Впрочем, учитывая большой обьем оперативной памяти на современных компьютерах, потери памяти от использования Variant'а ощутимы крайне редко.

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

значение 2 (число), то после команды "x=Str(x)", которая преобразует число в строку, она уже будет иметь значение "2", то есть текстовая строка с цифрой "2". Такое преобразование было бы невозможно, если бы переменная "х" была бы обьявлена как Integer - целое число.

Если вы не обьявляете переменную заранее, а просто упоминаете ее в программе на Visual Basic for Application, то она обьявляется "автоматически", и так же "автоматически" ей присваивается тип Variant. Подобная тактика написания программы может показаться неплохой, так как убыстряет этот процесс, однако, к сожалению, необьявленные переменные не могут быть использованы в других модулях или формах - при таком использовании их значения будут потеряны4.

Можно запретить для себя использование необьявленных переменных, вставив в начало модуля, в верх раздела описаний инструкцию "Option Explicit", и тогда программа остановится и перейдет в режим отладки, если вдруг наткнется на такую переменную.

Стоит быть внимательнее с типами данных, так как в некоторых случаях неправильное их использование может дать ошибку. Например, переменная с типом Integer не может превысить значение 32 767; если же надо использовать большие числа, то следует определить ее тип как Long, а если она может быть еще и дробной, то - Double.

В именах переменных Visual Basic for Applications распознаёт строчные и прописные буквы русского алфавита как разные символы. А вот заглавные и строчные латинские буквы считаются одинаковыми.

3.Процедуры и функции.

Впринципе любая программа может быть написана в виде одного длинного блока текста. Однако такой код будет крайне нерациональным. Например, в программе необходимо несколько раз подсчитать сумму всех членов арифметической прогрессии для разных чисел. Можно, конечно, считать результат каждый раз по известной формуле, но это очень усложнит код. А если неизвестно, для какого количества чисел надо считать эту сумму (например, это определяет пользователь), то написание программы становится вообще невозможным! Поэтому в Visual Basic for Applications, как и в других современных языках программирования, есть понятие процедур и функций, иначе называемых

подпрограммами.

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

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

ВVisual Basic for Applications любая процедура, получающая данные из другой программы, имеет следующий формат:

Sub "Название процедуры"("Получаемая переменная" As "Тип данных получаемой переменной")

"Текст процедуры" End Sub

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

Вызов процедуры происходит так же, как и вызов любой команды Visual Basic for Applications - путем указания ее названия и передаче ей соответствующих значений переменных:

4Например, если вы в своей программе используете переменную "а", то в том случае, если ваша программа вызовет другую программу, в этой другой программе переменная "а" будет иметь именно то значение, которое ей было задано в первой программе только тогда, когда она в этой первой программе обьявлена (возможно, и как Variant - главное,

чтобы обьявление было). Скажем, если в первой программе переменной "а" присваивается значение "3", а во второй к этой переменной прибавляется 2, то в том случае, если в первой программе обьявление переменной "а" отсутствует, результатом сложения будет 2, а не 5, - так как вторая программа сочтет "а" новой переменной, равной нулю.

Sub Main()

Dim a As Integer a = 1

uvelich a, 3 MsgBox a End Sub

Sub uvelich(b As Integer, c As Integer) b = b + c

End Sub

В этом примере из процедуры Main вызывается процедура uvelich, которой передаются два параметра - a (равное 1) и второй - число 3. Процедура uvelich увеличивает первую переданную переменную на значение второго переданного числа, а затем Main отображает результат вычислений. Стоит помнить, что если в заглавии процедуры указываются типы данных переменных, то и в вызывающей процедуре передаваемые значения должны быть определены и иметь тот же тип, иначе

Visual Basic for Applications выдаст сообщение об ошибке5.

Переменные могут передаваться в процедуру двумя способами - только для чтения или и для изменения. По умолчанию переменные могут в функции изменяться. Как, скажем, в вышеприведенном примере - переменная "a" была передана в процедуру (под именем "b", чтобы лучше проиллюстрировать этот момент) и там изменилась (к ней прибавили величину переменной "с"), и затем в исходной программе она тоже стала иметь новое измененное значение.

Если же не нужно, чтобы переменная в процедуре менялась (скажем, процедура использует переменную для каких-то своих нужд, не связанных с исходной программой), то перед именем этой переменной в заголовке процедуры следует поместить инструкцию ByVal. Тогда процедура просто использует переменную так, как в этой процедуре описано, возможно, изменив ее значение, а программа, вызвавшая процедуру, дальше будет работать с прежним значением переменной. К

примеру, если бы заголовок процедуры uvelich имел вид Sub uvelich(ByVal b As Integer, c As Integer),

то никакого увеличения переменной "a" не произошло бы и программа отобразила бы в качестве результата число 1. Однако в самой процедуре uvelich соответствующая переменная увеличилась бы на 3 и, если бы ее последней командой было бы MsgBox b, то она бы отобразила значение 4.

Функция отличается от процедуры тем, что она возвращает определенное значение, которое может быть использовано в дальнейшей работе программы. В частности, вышеприведенный пример мог иметь такой вид:

Sub Main()

Dim a As Integer Dim d As Integer a = 1

d = uvelich(a, 3) MsgBox d

End Sub

Function uvelich(ByVal b As Integer, ByVal c As Integer) As Integer uvelich = b + c

End Function

Как нетрудно видеть, программа присваивает переменной "d" значение, вычисленное функцией. При создании функций следует помнить, что если перед описаниями переменных в ее заголовке не указана

5Кроме того, при вызове процедуры или функции иногда требуется указывать команду Call (подробнее смотрите

всправочной системе).

инструкция ByVal, то соответствующие переменные могут быть изменены. Так, если бы данный пример имел вид

Sub Main()

Dim a As Integer Dim d As Integer a = 1

d = uvelich(a, 3) MsgBox d

MsgBox a

End Sub

Function uvelich(b As Integer, c As Integer) As Integer uvelich = b + c

a=1555

End Function,

то исходная программа - Main в качестве значения переменной "а" отобразила бы число 1555, а не 1. Указания типов переменных в заголовке функции или процедуры необязательны - их можно опустить. Однако если типы переменных определены в этом заголовке, то они обязательно должны быть определены точно такими же типами и в вызывающей программе, если только они не определяются в функции или процедуре как Variant. Иными словами, если в функцию или процедуру передается переменная типа Integer, то в вызове функции или процедуры можно использовать только переменные именно этого типа, в противном случае возникнет ошибка. Так, если в заголовке функции указано, что первая переменная, передаваемая ей, имеет тип Integer, то та переменная, которая передается в функцию как первая (в последнем примере - "a"), должна быть определена именно как Integer до вызова функции (что мы и видим в этом примере). Если же в вышеприведенной программе

переменная "а" определялась бы как Byte или Long, то возникла бы ошибка.

Перед заголовком функции или процедуры можно поставить инструкции Public или Private (для вышеприведенного примера - "Private Function uvelich(b As Integer, c As Integer) As Integer"). Функция или процедура, обьявленная как Public, может вызываться и из других модулей, в то время как функция или процедура, обьявленная как Private, доступна только из данного модуля.

По умолчанию все функции и процедуры считаются обьявленными как Public (а переменные, как нетрудно заметить - обьявленные как Private).

Если в программе есть вложенные процедуры или функции (то есть процедура или функция вызывает другую процедуру или функцию, которая, в свою очередь, вызывает еще одну процедуру или функцию и.т.д.), то их взаимоотношения ("кто кого вызывает?") удобно при отладке отслеживать с помощью окна Стек Вызова (рис. 4.5), в котором видны все произошедшие вызовы.

Рис. 4.5. Окно Стек вызова.

В выпадающем меню в правом верхнем углу окна программы указаны все процедуры и функции данного модуля. Это меню можно использовать для быстрого перехода к необходимому месту модуля.

Главная процедура - собственно программа - не может иметь параметров (в ее заголовке должны стоять пустые скобки). Только таким процедурам можно назначать кнопки и сочетания клавиш для их вызова на выполнение, и только они будут присутствовать в диалоговом окне "Сервис - Макросы - Макросы". Это и понятно - ведь это окно не предусматривает возможности указывать параметры при запуске макросов, да и передавать параметр в сочетании клавиш весьма затруднительно.

Во время пошагового исполнения при отладке программы с процедурами или функциями имеется возможность отказаться от прохода по всем командам той или иной процедуры или функции, вызвав команду "Шаг с обходом" из меню Отладка или кнопкой на одноименной панели.

Рис. 4.6. Вызов команды Шаг с обходом.

Тогда вся процедура или функция будет выполнена безостановочно, как при обычном исполнении. Команда "Шаг с выходом" доступна в любой процедуре или функции, включая главную, и выполняет в обычном режиме все команды до конца процедуры или функции, переходя затем в режим пошагового исполнения в вызвавшей программе. Данные возможности позволяют отлаживать процедуры и функции по отдельности, что упрощает процесс поиска ошибок и их коррекции.

Разбивая программу на отдельные процедуры и функции, вы получаете возможность легко использовать повторно одни и те же фрагменты кода, обращаясь к ним из программы по мере надобности.

4. Операторы цикла и перехода.

Если необходимо повторить ту или иную группу операций несколько раз, то используются операторы цикла: Do...Loop, For...Next и While…Wend. Для проведения какой-либо операции или группы операций над однотипными обьектами используется оператор For Each...Next.

Если необходимо совершить те или иные действия в зависимости от наличия или отсутствия выполнения какого-либо условия или в зависимости от значения той или иной переменной, используются операторы условия: If...Then...Else и Select Case.

Если необходимо совершить переход к другой части той же программы, то используется оператор GoTo "имя метки". Там, куда должен быть совершен переход, на отдельной строке должна стоять метка с соответствующим именем, а после нее - двоеточие.

Подробное описание функций, особенностей и синтаксиса всех этих операторов можно получить в справочной системе редактора Visual Basic for Applications, поэтому не стоит здесь на них останавливаться.

5. Работа с формами.

Формы - это окна интерфейса программы. С их помощью можно сообщать пользователю необходимую информацию или получать ее от него. Для создания форм используются средства редактора Visual Basic for Applications.

Создав форму (из меню правой кнопки мыши в Менеджере проектов выберите команды "Вставить - UserForm") или дважды щелкнув на имени существующей формы, можно попасть в окно Дизайна форм. На появившейся панели инструментов "Панель управления" (если ее нет, то ее можно вызвать из меню "Вид - Панель элементов") представлены элементы, которые можно использовать в формах программ на Visual Basic for Applications (рис. 4.7). Этот набор на настоящее время идентичен во всех версиях Microsoft Office, так что рассмотрим его подробнее.

Итак, назначение элементов набора таково - если смотреть слева направо и идти сверху вниз.

Рис. 4.7. Панель инструментов с компонентами форм. Пояснение в тексте.

1. Поле отображения текста - отображает текстовую информацию (рис. 4.8).

Рис. 4.8. Поле отображения текста.

2. Поле ввода текста - дает пользователю возможность ввести текстовую информацию (рис. 4.9).

Рис. 4.9. Поле ввода текста.

У Поля ввода текста помимо очевидного отличия - собственно возможности ввода в него текста пользователем - есть еще та особенность, что находящийся в нем текст можно выделить и скопировать, в то время как обычное Поле отображения текста этого не позволяет. Поэтому для размещения на форме доступной для копирования пользователями через буфер обмена информации (например, e-mail- адреса автора, ссылки на его сайт) лучше использовать именно Поле ввода текста, при необходимости запретив его изменения и придав ему вид обычного текста, убрав границы (как это сделать - смотрите ниже).

Текст, отображаемый в полях отображения и ввода текста при запуске формы, можно задать как заранее - с помощью Окна Свойств, так и программно.

3. Несколько видов списков - средства выбора варианта, вроде выпадающего списка шрифтов в Word (рис. 4.10). Значения элементов списков задаются только в программе - при разработке формы с помощью окна "Дизайн форм" их задать нельзя.

Рис. 4.10. Выпадающий список.

4. Флажок (рис. 4.11) - элемент, который независимо от других может находиться в трех состояниях: включенном, выключенном (могут быть определены как пользователем - кликом на флежке, так и программистом) и неактивном (определяется программой).

Рис. 4.11. Флажки.

5. Переключатель (рис. 4.12) - элемент, который также может находиться во включенном, выключенном и неактивном состояниях. В отличие от флажка, переключатели должны быть обьединены в группы с помощью элемента №7 - рамки - и, если один из переключателей в группе включен, то остальные включены быть не могут.

Рис. 4.12. Переключатели.

В Microsoft Word имеются диалоговые окна, содержащие как флажки, так и переключатели. Так, почти все вкладки меню "Сервис - Параметры" состоят из флажков, а меню Вставка-Сноска - из переключателей. Так что оба эти элемента управления вы видели неоднократно.

6. Выключатель (рис. 4.13). Это кнопка, которая может находиться в нажатом или отжатом состоянии. Например, в Word так себя ведут кнопки показа скрытых символов или создания списков.

Рис. 4.13. Выключатели.

7.Рамка. Отображает прямоугольник с заголовком. В основном используется для обьединения групп переключателей (см.Рис. 4.12).

8.Командная кнопка. Обычная командная кнопка вроде кнопок "Ok" или "Отмена" в любом диалоговом окне (рис. 4.14).

Рис. 4.14. Командные кнопки.

9. Набор вкладок и 10. Набор страниц. Представляют из себя набор страничек-вкладок вроде вкладок "Общие", "Сохранение", "Печать" и др. в диалоговом окне Word Сервис-Параметры. Отличие между этими двумя элементами состоит в том, что 9-й элемент (Набор вкладок) при переключении на другую страничку совершенно не затрагивает другие элементы формы, даже и находящиеся на нем, и изменения в состоянии других элементов можно эадать только программно. 10-й же элемент (Набор страниц) при своем переключении принудительно (т.е. вне зависимости от программы) скрывает элементы на одной своей странице и показывает элементы на другой (рис. 4.15).

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

К сожалению, в настоящее время не сложилась твердая номенклатура этих двух элементов форм Visual Basic for Applications, поэтому в справочной системе, в различной литературе можно встретить разные названия для каждого из них.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]