8. основы программирования на языке Visual Basic for Applications
Конечно, написать программу в машинных кодах – это крайне трудоемкий процесс. В связи с этим появились языки программирования. Каждый язык программирования содержит набор инструкций, которые описывают те или иные действия на понятном человеку языке. Однако этот текст машина понять не может, поэтому каждый язык программирования имеет свой транслятор. Транслятором называется специальная программа, которая переводит текст программы, написанный на языке программирования, в машинные коды. Различают два вида трансляторов: компиляторы и интерпретаторы. Интерпретатор переводит одну строчку текста программы в машинный код, выполняет ее и тут же “забывает”. Если приходится второй раз обработать строку программы, интерпретатор заново переводит ее. Без интерпретатора такая программа работать не может. В отличие от интерпретатора, компилятор переводит в машинные коды сразу всю программу. Поэтому, откомпилированная программа может храниться и выполняться отдельно от компилятора. VBA является интерпретатором, его относят к объектно – ориентированным языкам высокого уровня. Программа, написанная на этом языке, не имеет единого кода (в отличие от структурных языков программирования). Приложение, написанное на Visual Basic (как и на любом объектно – ориентированном языке), представляет собой совокупность объектов, каждый из которых имеет свой набор свойств, обрамленный методами; они предписывают этим объектам выполнение определенных действий в той или иной ситуации. Схематично программа, написанная на Visual Basic, выглядит примерно так: Sub Имя_блока (параметры) Описательная часть Исполнимая часть
End SubВ описательной части содержится описание переменных и констант, которые используются в данном блоке. В исполнимой части содержатся операторы (или команды), записанные по правилам данного языка. Операторы выполняются последовательно, один за другим сверху вниз. 8.1. Основные понятия алгоритмического языка Visual Basic8.1.1. Алфавит языкаАлфавит языка программирования – набор символов, с помощью которого образовываются выражения, операторы и величины данного языка. Алфавит языка VBA включает в себя все символы из таблицы кодов (таблица кодов ASCII - американский стандартный код для представления информации). Каждому символу соответствует числовой код от 0 до 255. Символы с кодами от 128 до 255 относятся к расширенной таблице ASCII, в этой области находятся символы национальных алфавитов (например, русского языка) и символы псевдографики для изображения таблиц. VBA использует следующие подмножества набора символов кода ASCII:
8.1.2. Элементы программыИдентификаторы.Идентификаторы выступают в качестве имен констант, типов, переменных, процедур, функций, полей в записях и других объектов языка. Идентификатор может иметь любую длину, однако только первые его 63 символа являются значимыми. Имя или идентификатор должен начинаться с буквы или с символа подчёркивания (“_”) и не может содержать пробелов. После первого символа идентификатора можно, кроме букв, использовать цифры и символы подчеркивания. В идентификаторах можно использовать как строчные, так и прописные буквы (интерпретатор их не различает). Зарезервированные слова.Зарезервированные или служебные слова используются самим языком. Поэтому их использование в качестве идентификаторов недопустимо. Значения.Это числа (2; 3.25; 7.34567001Е+2), строки символов (“С”; “Ура !”) и др. Комментарии.Комментарии предназначены для пояснения текста программы. Они не влияют на выполнение программы. Начинаются комментарии со знака “ ‘ “. Операции и выражения.Одним из ключевых понятий в программировании является операция: определенное действие над одним или несколькими объектами языка, имеющими значение и называемыми операндами. Совокупность операндов, объединенных знаками операций, называется выражением. Константы.Константа – это идентификатор, имеющий фиксированное значение, которое не изменяется в процессе выполнения программы. Начинается описание константы с оператора Const. Например: Const N = 5 Переменные.В отличие от константы, переменная может изменять свое значение в процессе выполнения программы. Каждая переменная имеет свой тип, который назначается в описательной части программы. Некоторые типы переменных описаны в таблице 2.1. Переменную можно объявить с помощью оператора Dim следующим образом: Dim I As Integer. В Visual Basic объявление переменных не является обязательной процедурой. Таблица 2.1.
Переменные, описанные при помощи оператора Dim доступны внутри одного объекта. Другие объекты “не видят” эту переменную. Для того, чтобы сделать эту переменную доступной во всех объектах пользуются зарезервированным словом Public: Public S As String. Арифметическое выражение.Частным случаем выражения VBA является арифметическое выражение. Рассмотрим следующее арифметическое выражение: Знаки арифметических действий С = (А + В) ^ 2 Переменная Знак присвоения Операнды Константа Любое арифметическое выражение содержит знак “=“. Это знак “присвоить”, он отделяет переменную от выражения и говорит о том, что значение, полученное в результате вычисления арифметического выражения, будет помещено в эту переменную. Ниже, в таблице 2.2, приведены некоторые знаки арифметических действий в порядке следования при вычислениях: Таблица 2.2
Операторы сравнения используются для обозначения операций сравнения двух чисел. Результатом выполнения операции сравнения является логическое значение ИСТИНА или ЛОЖЬ.
Встроенные функции.При вычислении различных арифметических выражений часто возникает потребность в использовании сложных математических функций, таких как, синус, косинус, тангенс, логарифм, квадратный корень и др. В таких случаях используют встроенные математические функции. Visual Basic “знает” как их вычислять, поэтому достаточно только знать как они записываются. Каждая встроенная функция имеет свое имя и требует в качестве аргумента один и более параметров, которые записываются после имени функции в скобках. Например, записать в переменную А выражение 3 Sin 2X2. На Visual Basic это будет выглядеть следующим образом: А = 3 * Sin (2 * X^2) Основные математические функции:Функция Abs возвращает значение, тип которого совпадает с типом переданного аргумента, равное абсолютному значению указанного числа. Функция Atn возвращает значение типа Double, содержащее арктангенс числа. Функция Cos возвращает значение типа Double, содержащее косинус угла. Функция Exp возвращает значение типа Double, содержащее результат возведения числа e (основание натуральных логарифмов) в указанную степень. Константа e приблизительно равняется 2,718282. Функции Fix и Int возвращают значение типа, совпадающего с типом аргумента, которое содержит целую часть числа. Обе функции Int и Fix отбрасывают дробную часть числа и возвращают целое значение. Различие между функциями Int и Fix состоит в том, что для отрицательного значения аргумента число функция Int возвращает ближайшее отрицательное целое число, меньшее либо равное указанному, а Fix ближайшее отрицательное целое число, большее либо равное указанному. Например, функция Int преобразует -8.4 в -9, а функция Fix преобразует -8,4 в -8. Выражение Fix(число) эквивалентно следующему: Sgn(число) * Int(Abs(число)) Функция Log возвращает значение типа Double, содержащее натуральный логарифм числа. Функция Rnd возвращает значение типа Single, содержащее случайное число. Функция Rnd возвращает значение, меньшее 1 и большее или равное нулю. Ниже приведена формула, предназначенная для получения случайных целых чисел в заданном диапазоне: Int((верхняяГраница - нижняяГраница+ 1) * Rnd + нижняяГраница) Здесь верхняяГраница представляет максимальное число в диапазоне, а нижняяГраница минимальное число в диапазоне. Функция Sgn возвращает значение типа Variant (Integer), соответствующее знаку указанного числа. Функция Sin возвращает значение типа Double, содержащее синус угла. Функция Sqr возвращает значение типа Double, содержащее квадратный корень указанного числа. Функция Tan возвращает значение типа Double, содержащее тангенс угла.
Функция Комбинация встроенных функцийСеканс Sec(X) = 1 / Cos(X) Косеканс Cosec(X) = 1 / Sin(X) Котангенс Cotan(X) = 1 / Tan(X) Арксинус Arcsin(X) = Atn(X / Sqr(-X * X + 1)) Арккосинус Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1) Арккосеканс Arcsec(X) = Atn(X / Sqr(X * X - 1)) + Sgn((X) - 1) * (2 * Atn(1)) Арккосеканс Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) - 1) * (2 * Atn(1)) Арккотангенс Arccotan(X) = Atn(X) + 2 * Atn(1) Гиперболический синус HSin(X) = (Exp(X) - Exp(-X)) / 2 Гиперболический косинус HCos(X) = (Exp(X) + Exp(-X)) / 2 Гиперболический тангенс HTan(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X)) Гиперболический секанс HSec(X) = 2 / (Exp(X) + Exp(-X)) Гиперболический косеканс HCosec(X) = 2 / (Exp(X) - Exp(-X)) Гиперболический котангенс HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X)) Гиперболический арксинус HArcsin(X) = Log(X + Sqr(X * X + 1)) Гиперболический арккосинус HArccos(X) = Log(X + Sqr(X * X - 1)) Гиперболический арктангенс HArctan(X) = Log((1 + X) / (1 - X)) / 2 Гиперболический арксеканс HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X) Гиперболический арккосеканс HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X) Гиперболический арккотангенс HArccotan(X) = Log((X + 1) / (X - 1)) / 2 Логарифм по основанию N LogN(X) = Log(X) / Log(N)
3.2. ИнструкцииИнструкция - синтаксически завершенная конструкция, представляющая отдельное действие, описание или определение. Обычно инструкция занимает отдельную строку программы, хотя допускается использование двоеточия (:) для размещения в одной строке нескольких инструкций. Допускается также использование символа продолжения строки ( _ ) для продолжения одной логической программной строки на нескольких физических строках. Инструкция Visual Basic является полной командой. Она может содержать ключевые слова, операторы, переменные, константы и выражения. Любая инструкция относится к одной из следующих категорий:
Следующий пример содержит три описания. Sub ApplyFormat() – описание процедуры Const limit As Integer = 33 – описание константы Dim myCell As Range – описание переменной
Инструкции присвоения всегда включают знак равенства (=). В следующем примере переменной yourName присваивается возвращаемое значение функции InputBox. Sub Question() Dim yourName As String yourName = InputBox("Как Ваше имя?") MsgBox "Ваше имя - " & yourName End Sub
3.2.1. Инструкция If...Then...Else. Применение операторов ветвленияВетвление реализуется с помощью оператора IF. Оператор ветвления IF.Блочные структуры If – наиболее эффективные из структур логического ветвления. Их можно применять для создания логических структур практически любой сложности. В общем виде эта структура выглядит следующим образом: IF логическое_выражение THEN блок операторов END IF Когда логическое выражение принимает значение истина (true), то выполняется блок операторов, заключенный между операторами IF и END IF. Если логическое выражение принимает значение ложь (false), то этот блок не выполняется и управление переходит к оператору, следующему за оператором END IF. Структура IF может содержать оператор ELSE:
Управление переходит к блоку операторов, следующему за ELSE в том случае, если логическое выражение принимает значение ложь (false). Это был пример одноблочной структуры оператора IF. Одноблочная структура оператора IF преобразуется в многоблочную путем добавления оператора ElseIf. В этом случае структура выглядит следующим образом:
Когда встречается многоблочная структура IF, VB определяет значение логического выражения 1. Если оно равно true, то выполняется блок операторов 1, если false, то блок операторов 1 полностью пропускается и проверяется значение логического выражения 2 и т.д. Если ни одно из поставленных условий не выполняется, то управление передается блоку операторов 4. В приведенном ниже примере показано использование как блоковой, так и однострочной форм инструкции If...Then...Else: Dim Number, Digits, MyString Number = 53 ' Инициализирует переменную. If Number < 10 Then Digits = 1 ElseIf Number < 100 Then ' Условие является истинным, поэтому выполняется следующая инструкция. Digits = 2 Else Digits = 3 End If ' Использует однострочную форму для присвоения значения. If Digits = 1 Then MyString = "Один" Else MyString = "Больше 1" Инструкция Select CaseВыполняет одну из нескольких групп инструкций в зависимости от значения выражения. Синтаксис Select Case выражение [Case список Выражений-n [инструкции-n]] ... [Case Else [инструкции_else]]
В приведенном ниже примере инструкция Select Case используется для анализа значения переменной. Второе предложение Case содержит значение анализируемой переменной и следовательно выполняется только инструкция, связанная с этим предложением: Dim Number Number = 8 ' Инициализирует переменную. Select Case Number ' Анализирует число. Case 1 To 5 ' Число между 1 и 5. Debug.Print "Между 1 и 5" ‘Выводит текст в окно отладки
Case 6, 7, 8 ' Число между 6 и 8. Debug.Print "Между 6 и 8" Case Is > 8 And Number < 11 ' 9 или 10. Debug.Print "Больше 8" Case Else ' Другие значения. Debug.Print "Вне интервала 1 -- 10" End Select 3.2.2. Применение операторов цикла.Практически любой алгоритм содержит ряд операторов, которые нужно выполнить несколько раз подряд. Такая операция называется циклом. (Циклом называется участок программы, который выполняется многократно при различных значениях аргументов.) Операторы, которые выполняются циклически (повторяются), называются телом цикла. Цикл может иметь одну или несколько точек входа и обязательно один или несколько выходов. Если цикл не имеет выхода, то алгоритм составлен неправильно. Для всех операторов цикла характерна следующая особенность: повторяющиеся вычисления записываются всего лишь один раз. Они и называются телом цикла. Вход в цикл возможен только через его начало. Переменные оператора цикла должны быть определены до входа в циклическую часть (т.е. переменным должны быть присвоены какие-либо начальные значения). Не забывайте про условие продолжения цикла. С каждым повторением операторов циклической части (тела цикла) переменная цикла должна увеличиваться (уменьшаться) на заданную величину (шаг). Выход из цикла происходит или по его естественному окончанию, или по оператору перехода goto <метка>. Однако применение оператора безусловного перехода является нежелательным, т.к. это нарушает структурную целостность и наглядность программы. Рекомендуется применять инструкцию Exit. Если не задать приращения переменной цикла или не предусмотреть выход из цикла, то циклические вычисления будут повторяться бесконечно, произойдёт «зацикливание» программы. Циклы широко применяются для решения самых разнообразных задач:
Visual Basic имеет три оператора цикла. 1. Оператор цикла For.Наиболее распространенным оператором цикла является оператор FOR. В общем виде оператор FOR выглядит следующим образом: FOR счетчик = начало TO конец [STEP шаг] тело цикла NEXT счетчик где счетчик – целочисленная переменная, задающая количество повторений; начало – начальное значение переменной; конец – конечное значение переменной; шаг (необязательный параметр) – шаг приращения. Операторы, содержащиеся в теле цикла, повторяются до тех пор, пока значение счетчика не станет больше или равно значению конец. В приведенном ниже примере инструкция For...Next используется для создания строки, содержащей 10 наборов по 10 цифр (от 0 до 9); каждый набор отделяется от следующего одним пробелом. Внешний цикл использует переменную-счетчик, которая уменьшается на единицу при каждом выполнении цикла. Dim Words, Chars, MyString For Words = 10 To 1 Step -1 ' Цикл выполняется 10 раз.
MyString = MyString & Chars ' Добавляет цифру в конец строки. Next Chars ' Увеличивает счетчик MyString = MyString & " " ' Добавляет пробел. Next Words
В общем виде оператор WHILE выглядит следующим образом: WHILE условие тело цикла WEND Операторы, содержащиеся в теле цикла, повторяются до тех пор, пока условие не примет значение TRUE (истина). Этот оператор называется «с предусловием», потому что вначале проверяется условие, а после этого выполняются операторы, входящие в тело цикла. Пример: В данном примере инструкция While...Wend используется для увеличения переменной-счетчика. Инструкции в цикле выполняются до тех пор, пока указанное условие не True. Dim Counter Counter = 0 ' Инициализирует переменную. While Counter < 20 ' Анализирует значение счетчика. Counter = Counter + 1 ' Увеличивает счетчик. Wend ' Завершает цикл While,
Debug.Print Counter ' Выводит 20 в окно отладки. 3. Оператор цикла DO … LOOP.Инструкция Do...Loop используется для выполнения наборов инструкций неопределенное число раз. Набор инструкций повторяется, пока условие имеет значение True, либо пока оно не примет значение True. Синтаксис: Do [{While | Until} условие] [инструкции] [Exit Do] [инструкции] LoopДопустим также другой синтаксис: Do [инструкции] [Exit Do] [инструкции] Loop [{While | Until} условие] Синтаксис инструкции Do Loop содержит следующие элементы: Условие - числовое выражение или строковое выражение, которое имеет значение True или False. Если условие имеет значение Null,то аргумент условие рассматривается как значение False. Инструкции - одна или несколько инструкций, выполнение которых повторяется, пока условие имеет значение True или пока оно не приобретет значение True. В любом месте управляющей структуры Do…Loop может быть размещено любое число инструкций Exit Do, обеспечивающих альтернативные возможности выхода из цикла Do…Loop. Часто используемая вместе с определением некоторого условия (например, If…Then), инструкция Exit Do передает управление инструкции, непосредственно следующей за инструкцией Loop. Во вложенных циклах Do…Loop инструкция Exit Do передает управление циклу охватывающего уровня по отношению к циклу, в котором она вызывается.
В данном примере показано, как можно использовать инструкции Do...Loop. Внутренний цикл Do...Loop выполняется 10 раз, затем логической переменной присваивается значение False, после чего он преждевременно завершается с помощью инструкции Exit Do. Внешний цикл завершается немедленно после проверки значения логической переменной. Dim Check, Counter Check = True: Counter = 0 ' Инициализирует переменные. Do ' Внешний цикл. Do While Counter < 20 ' Внутренний цикл. Counter = Counter + 1 ' Увеличивает счетчик. If Counter = 10 Then ' Если условие истинно. Check = False ' Присваивает переменной
Exit Do ' Завершает внутренний цикл. End If Loop
Loop Until Check = False ' Немедленно завершает внешний цикл. 3.3. Ввод и вывод данных на экран3.3.1. Функция MsgBoxMsgBox выводит на экран диалоговое окно, содержащее сообщение, устанавливает режим ожидания нажатия кнопки пользователем, а затем возвращает значение типа Integer, указывающее, какая кнопка была нажата. Синтаксис: MsgBox (prompt[, buttons] [, title] [, helpfile, context]) Здесь prompt - обязательный элемент, строковое выражение, отображаемое как сообщение в диалоговом окне. Максимальная длина строки prompt составляет приблизительно 1024 символов и зависит от ширины используемых символов. Строковое значение prompt может содержать нескольких физических строк. Для разделения строк допускается использование символа возврата каретки (Chr(13)), символа перевода строки (Chr(10)) или комбинацию этих символов (Chr(13) & Chr(10)). Buttons- необязательный элемент, числовое выражение, представляющее сумму значений, которые указывают число и тип отображаемых кнопок, тип используемого значка, основную кнопку и модальность окна сообщения. Значение по умолчанию этого аргумента равняется 0. Title - необязательный элемент, строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, в строку заголовка помещается имя приложения. Helpfile – необязательный элемент, строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот аргумент указан, необходимо указать также аргумент context. Context – необязательный, числовое выражение, определяющее номер соответствующего раздела справочной системы. Если этот аргумент указан, необходимо указать также аргумент helpfile. Пример:
В данном примере функция MsgBox используется для вывода окна диалога с сообщением об ошибке и кнопками "Да" (Yes) и "Нет" (No). Основной является кнопка "Нет" (No). Значение, возвращаемое функцией MsgBox, зависит от того, какая кнопка была нажата пользователем. Предположим, что DEMO.HLP является файлом справки, содержащим раздел с номером, равным 1000. Dim Msg, Style, Title, Help, Ctxt, Response, MyString Msg = "Обнаружена ошибка. Продолжить?" ' Сообщение. Style = vbYesNo + vbCritical + vbDefaultButton2 ' Кнопки. Title = "Пример" ' Заголовок. Help = "DEMO.HLP" ' Файл справки. Ctxt = 1000 ' Контекст. ' Выводит сообщение. Response = MsgBox(Msg, Style, Title, Help, Ctxt) If Response = vbYes Then ' Нажата кнопка "Да" (Yes). MyString = "Да" ' Выполняет действие. Else ' Нажата кнопка "Нет" (No). MyString = "Нет" ' Выполняет действие. End If
3.3.2. Функция InputBoxФункция InputBox выводит на экран диалоговое окно, содержащее сообщение и поле ввода, устанавливает режим ожидания ввода текста пользователем или нажатия кнопки, а затем возвращает значение типа String, содержащее текст, введенный в поле. Синтаксис: InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]) Синтаксис функции InputBox содержит следующие именованные аргументы:
В данном примере приведены различные способы получения сведений от пользователя с помощью функции InputBox. Если аргументы x и y опущены, окно диалога автоматически выравнивается по центру по соответствующим осям. Переменная MyValue содержит значение, введенное пользователем, если была нажата кнопка OK или клавиша ENTER. Если пользователь нажмет кнопку Отмена, функция возвратит пустую строку. Dim Message, Title, Default, MyValue Message = "Введите число от 1 до 3" ' Сообщение-подсказка. Title = "Пример" ' Заголовок. Default = "1" ' Значение по умолчанию. ' Выводит на экран сообщение, заголовок и значение по умолчанию. MyValue = InputBox(Message, Title, Default) ' Получение справки. Кнопка "Справка" добавляется автоматически. MyValue = InputBox(Message, Title, , , , "DEMO.HLP", 10) ' Размещает верхний левый угол окна диалога в точке 100, 100. MyValue = InputBox(Message, Title, Default, 100, 100) 3.3.3. Использование формОбъект UserFormОбъект - комбинация кода и данных, которая может рассматриваться как единое целое, например, элемент управления, форма или компонент приложения. Объект UserForm представляет собой окно или диалоговое окно, являющееся составной частью интерфейса пользователя в приложении. Семейство UserForms является семейством, компоненты которого представляют все загруженные формы UserForm в приложении. У семейства UserForms имеются свойства Count и Item, а также метод Add. Свойство Count указывает число компонентов в семействе; свойство Item (компонент, используемый по умолчанию) указывает определенный компонент семейства; метод Add помещает в семейство новый компонент UserForm. Синтаксис: UserForm UserForms[.Item](индекс) Прототип индекс представляет собой значение типа Integer в диапазоне от 0 до UserForms.Count – 1. Item -- это используемый по умолчанию компонент семейства UserForms, поэтому его можно не указывать. Формы пользователя имеют свойства, определяющие внешний вид, как например, положение, размер, цвет и реакция на события. Формы пользователя также могут реагировать на события, инициированные пользователем или запущенные системой. Например, пользователь может написать подпрограмму обработки события Initialize (Инициализация) для UserForm, чтобы инициализировать переменные уровня модуля до того, как UserForm будет выведена на экран. Помимо свойств и событий для программной обработки форм пользователя могут использоваться методы. Например, можно использовать метод Move для изменения положения и размера формы UserForm. При конструировании форм пользователя следует задать свойство BorderStyle для определения границ и свойство Caption для занесения текста в область заголовка. В программе можно использовать методы Show и Hide, чтобы делать форму соответственно видимой и невидимой во время выполнения. Доступ к семейству элементов управления формы UserForm осуществляется с помощью семейства Controls. Например, чтобы скрыть все элементы управления формы UserForm, можно использовать код, подобный следующему:
Control.Visible = False Next Control
Метод ShowМетод Show выводит на экран объект UserForm. Синтаксис: [объект.]Show Необязательный прототип объект представляет собой объектное выражение, значением которого является один из объектов, перечисленных в списке "Применение". Если этот элемент синтаксиса опущен, предполагается, что объектом является форма UserForm, связанная с активным модулем UserForm. Когда UserForm выведена на экран, другие формы данного приложения недоступны, однако это не относится к другим приложениям.
жүктеу/скачать 0.84 Mb. Достарыңызбен бөлісу: |