Язык программирования VBA

<

110313 0528 1 Язык программирования VBA 7.1. Данные и их описание

7.1.1. Алфавит и лексемы языка

Как и любой другой язык, Visual Basic имеет свой алфавит. В него входят:

  • прописные и строчные буквы латинского алфавита (Д — Z, a —z);
  • прописные и строчные буквы кириллицы (А — Я, а — я);
  • цифры от 0 до 9;
  • символ подчеркивания «_»

    Из этих символов конструируются идентификаторы — имена переменных, констант, процедур, функций, меток переходов, а также имена типов. Кроме этих символов в состав алфавита также входят:

  • неизображаемые символы («обобщенные пробельные символы»), используемые для отделения лексем друг от друга (пробел, табуляция, переход на новую строку);
  • специальные символы, участвующие в построении конструкций языка: +, — * / \ = >< [ ] ().,:;{}’& @;
  • составные символы, воспринимаемые как один символ: <= >= <> .

    Разделители в составных символах недопустимы.

    Программный код Visual Basic представляет собой последовательность лексических единиц (лексем), записанных в соответствии с принятыми синтаксическими правилами, которая: реализует некоторую семантическую конструкцию. Для обеспечения читаемости и понятности в тексте программы помещаются комментарии. В Visual Basics определен однострочный комментарий. Комментарий представляет собой последовательность любых символов, размещаемой на одной строке исходного текста программы, которая, начинается со знака « ‘ » (апостроф) или с ключевого слова Rem:


    Это комментарий     

    Rem Это тоже комментарий

    Лексема — это единица текста программы, которая имеет определенный смысл для компилятора и которая не может быть разбита в дальнейшем. В Visual Basic различают шесть классов лексем: свободно выбираемые и используемые идентификаторы; служебные (зарезервированные) слова; константы; строки (строковые константы); операции (знаки операций); разделители (знаки пунктуации).

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

  • имя должно начинаться с буквы;    
  • имя не должно содержать точки, пробела, разделительных символов, знаков опёраций, а также специальных символов;
  • имя должно быть уникальным, оно не должно совпадать с
    зарезервированными словами Visual Basic или с другими именами;
  • длина имени может включать до 255 символов, но следует иметь в виду, что Visual Basic учитывает только первые 31 символов от начала имени.

    Примеры правильных имен: strMyName, i, intNumOne, StrInputValue, intNumber2, strФамилия, Номер, Адрес_Организации и т.п.

     

    Примеры неправильных имён:
    2Week – имя начинается с цифры; _Номер — имя начинается со знака подчеркивания; Second.Week — в имени есть точка; Dim, As, Private – эти слова являются зарезервированными; Number One — в имени есть пробел.

    В Visual Basic, как и в других языках программирования, есть зарезервированные (ключевые) слова; которые нельзя выбирать в качестве идентификаторов имен. Перечень зарезервированных слов приведен в таблице 7.1.

    Имена могут быть простыми или составными. Имена следует выбирать такими, чтобы они несли в себе больше информации о назначении переменной, процедуры или функции.

    Примеры простых и составных имен переменных: N, I, Number, Номер — простые имена переменных; ФамилияСтудента — составное имя переменной, оно несет в себе информацию о фамилии студента.

     

    Таблица 7.1.

    Зарезервированные слова Visual Basic

     

    All 

    Else 

    Is 

    ON 

    SELECT 

    As 

    Empty 

    JOIN 

    On

    Set 

    ASC 

    Error 

    Len 

    Option 

    Static 

    Binary 

    False 

    Let 

    Optional 

    Step 

    BY 

    For 

    Lock 

    ParamArray 

    String 

    ByRef 

    Friend 

    Me 

    Print 

    TABLE 

    ByVal

    Get 

    Mid 

    Private 

    Then 

    CREATE 

    IN 

    New 

    Property 

    Time 

    Date 

    INDEX 

    Next 

    Public 

    To 

    Desc 

    Input 

    Nothing 

    Resume 

    WITH 

    Drop 

    INTO 

    Null 

    Seek 

    WithEvents 

     

    Существуют соглашения по стилю имен, которых желательно придерживаться:

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

     

    7.1.2. Объявлеиие переменных

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

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

    Перед использованием переменных в программе их нужно объявлять (декларировать). При объявлении переменной необходимо указать, что объявляется переменная, задать имя переменной и указать ее тип. Тип определяет способ представления переменной. В переменных можно хранить практически любые типы данных: число, строку текста, экземпляр объекта, элементы управления и т.д. В Visual Basic различают две группы типов данных: основные (иногда их называют базовыми или встроенными) и типы данных, определяемые пользователем.

    Для эффективного использования памяти необходимо правильно выбирать тип переменной. В таблице 7.2 приведены базовые типы переменных Visual Basic, необходимая для их размещения память и диапазон возможных значений.

     

     

    Таблица 7.2.

    Базовые типы переменных Visual Basic

    ТипХранимая информацияЗанимаемая памятьИнтервалы значенийЦелочисленные типыByte Целые числа1 байтот 0 до 255BooleanЛогические значения 2 байтаTrue (Истина) или False (Ложь)IntegerЦелые числа 2 байтаот—32768 до 32767.Long IntegerДлинные целые числа4 байта+/-2.1Е9Типы с плавающей точкой

    SingleВещественные числа одинарной точности с плавающей точкой4 байтаот – 3.402823Е38 до
    -1.401298Е-45 для отрицательных чисел и от 1.401298Е-45 до 3.402823Е38 для положительныхDoubleВещественные числа двойной точности с плавающей точкой8 байтОт -1.7976313486232Е308 до -4.94065645841247Е-324 для отрицательных чисел и от 4.94065645841247Е -324 до 1.7976313486232Е308 для положительныхСтроковые типыString (строка фиксированной длины)Текстовая информация (строка)1 байт на каждый символОт 1 до 65400String (строка переменной длины)Текстовая информация (строка)10 байт + 1 байт на каждый символОт 0 до двух миллиардов символовОбъектные типыObjectРисунок или ссылка на любой другой объект4 байтаСсылка на объектТипы VariantVariantЗначения любого из перечисленных типов данных16 байт для чисел, 22 байта + 1 байт на каждый символ для строкЛюбое числовое или строковое значениеПрочие типыОкончание табл.7.2.CurrencyЧисла, имеющие до 15 цифр до десятичной точки и 4 цифры после не (денежные единицы)8 байтОт -922337203685477.5808 до 922337203685477.5808DateИнформация о дате и времени8 байтОт 1 января 1000 г. До 31-го декабря 9999 г.DecimalДесятичное число14 байтЦелое – 29 знаков Вещественное — 27 знаков после запятой
    Декларация переменных может быть явной или неявной. Для явного определения переменных существует два способа. Первый (предпочтительный) способ, предполагает использование следующего синтаксиса:
    [Static [Private | Public] Dim ИмяПеременной [ As Тип] где Dim (Размер) — ключевое слово, которое сообщает Visual Basic, что декларируется переменная и резервируется область памяти для ее хранения;
    ИмяПеременной — имя переменной (идентификатор, не входящий в перечень ключевых слов Visual Basic);
    As (Как) — ключевое слово, которое сообщает Visual Basic, что определяется тип данных для переменной;
    Тип — тип данных для объявляемой переменной;
    Private (Частный), Public (Общий) — ключевые слова, определяющие область видимости переменной;
    static (Статический) — ключевое слово, которое определяет, сохраняет ли переменная, свое значение при завершении блока программы (процедуры, функции) и выходе из него.
    При подготовке кода программы среда программирования оказывает помощь пользователю; после набора ключевого слова As раскрывается список, в котором наряду с другими типами объектов, указаны и базовые типы переменных. Тип переменной можно установить, дважды щелкнув на имени типа в этом списке или нажав клавишу <Таb>.
    Другим способом явного объявления переменных является указание типа с помощью суффикса. В этом случае тип данных переменной определяется с помощью добавления в конец ее имени специального символа описания типа — суффикса. Поэтому использование ключевого слова As не требуется.
    Явное объявление переменных с помощью суффикса имеет следующий синтаксис:    
    [Static | Public | Private] Dim ИмяПеремённойСуффикс
    Например:    
    Dim strInputMsg$ — объявляется переменная типа «строка» (String);    
    Static sngCalcAyerage! — объявляется переменная типа Singl;
    Private intNumVal% — объявляется, переменная типа «целое» (Integer).
    В таблице 7.3 приведены типы Переменных и соответствующие им суффиксы, применяемые при декларации типов.
    Суффиксы, определяющие тип переменной

    Тип переменнойСуффиксInteger
    Long
    Single
    Double
    Currency
    String
    Byte
    Boolean
    Date
    Object
    Variant%
    &
    !
    #
    @
    $
    Нет
    Нет
    Нет
    Нет
    Нет
    Неявное объявление переменных осуществляется также двумя способами. Первый способ заключается в использовании оператора DefТип_Данных. Этот оператор устанавливает тип данных для переменных, параметр процедур, и тип возвращаемого значения для процедур типа Function и Property Get, имена которых начинаются с определенных символов. Синтаксис оператора имеет вид:
     

    DefTип_Данных ДиапазонБукв [, ДиапазонБукв]…

    где Тип_Данных – сокращенное название типа данных; ДиапазонБукв — указывает границы диапазона имен, для которых задается тип
    данных по умолчанию.

    Например: 1) DefInt A-K — переменные, имена которых начинаются с символов А — К, будут иметь тип Integer; 2) DefStr L-Z — переменные, имена которых начинаются с символов L — Z, будут иметь строковый тип.

    При втором способе неявного объявления переменная декларируется просто указанием ее имени, например MyVal или MyName$, в тексте программы.

    Следует отметить, что хороший стиль программирования предполагает использование явной декларации с помощью ключевых слов Dim, Private, Public, Static. Неявное объявление переменных без необходимости применять не следует, так как в последующем могут возникнуть непредвиденные ошибки. Для того, чтобы избежать неприятностей в случае ошибочной записи имени переменной, необходимо в общей области программного модуля помещать оператор Оption Explicit. В этом случае Visual Basic будет расценивать любую неявно объявленную переменную как ошибочную, например:

    Option Explicit

    Dim intMyNumber As Integer ‘Явное объявление переменной

    DefInt i ‘Неявное объявление переменной

    intMyNumber=10 ‘Для явно декларированной переменной ошибки _

    не будет

    intMyNum=10 ‘при ошибочном указании имени

    ‘Option Explicit включит предупреждение об ошибке

    intNamber=6 ‘Для неявно декларированной

    ‘переменной будет выдано сообщение об ошибке

    Примеры декларации переменных:

    Dim х As Integer, strName$, lngOld$

    Dim у As Integer

     

    7.1.3.    Строковые переменные

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

    Строка фиксированной длины — это строка постоянного размера, указанного при объявлении переменной. Если такой строке присваивается значение более длинное, то лишние символы отбрасываются. Если значение, которое присваивается, короче, то остающееся место заполняется пробелами. Строковые переменные фиксированной длины должны декларироваться явно. Синтаксис декларации следующий:

    Dim VarName As String * ДлинаСтроки

    где ДлинаСтроки — целочисленная переменная или константа, содержащая число, которое указывает длину строковой переменной.

    Например:

    Dim strMyName As String* 20 ‘Объявляется строковая_переменная фиксированной длины в 20 символов

    или

    Option Explicit

    Dim intLen As Integer ‘Объявляется целочисленная переменная

    intLen = 30 ‘Инициализация значения целочисленной переменной

    Dim MyName As String * intLen ‘Объявляется строковая_переменная длиной в 30 символов

    MyName = «Петров»

    7.1.4.    Константы

    Константы — это объекты, значения которых остаются постоянными и не могут быть изменены во время выполнения программы. Константы могут быть именованными и неименованными. Синтаксис языка определяет три типа констант: символьные, целые числа и вещественные числа.

    Символьная константа служит для изображения отдельных знаков и представляет собой лексему, состоящую из символа (или любой последовательности символов), заключенного в кавычки. Например, «Р», «Program», «3.14», «+» — неименованные символьные константы.

    Синтаксисом языка предусмотрены десятичные целые константы, шестнадцатеричные целые константы и восьмеричные целые константы. Целая десятичная константа представляется десятичным целым числом:

    44, 684, 0, 1024 — неименованные десятичные целые константы.

    Целая шестнадцатеричная константа представляется как последовательность шестнадцатеричных цифр, перед которой записан префикс &Н:

    &Н16 – неименованная шестнадцатеричная константа, соответствующая десятичному целому 22;

    &HFF — неименованная шестнадцатеричная константа, соответствующая десятичному целому 255.

    Восьмеричная целая константа представляется как последовательность цифр, не содержащая десятичных цифр старше 7, которой предшествует префикс &О:

    &O16 — восьмеричное представление десятичного целого 14;

    &О100 — восьмеричное представление десятичного числа 64.

    Вещественные константы представляются в памяти ЭВМ в форме с плавающей точкой. Каждая вещественная константа состоит из следующих частей: целая часть (десятичная целая константа); десятичная точка; дробная часть (десятичная целая константа); признак показателя «е» или «Е»; показатель (десятичная целая константа):

    44., 3.14159. 44е0, .314159Е1

    Различают встроенные константы Visual Basic (предопределенные константы) и константы создаваемые пользователем.

    Встроенные константы используются, например, для определения цветовых наборов, задач доступа к данным, кодов клавиш, контуров и т.д. Встроенные в Visual Basic константы имеют префикс vb. Встроенные константы, которые могут использоваться для различных функций, определены в разделах справки для этих функций. Для того, чтобы узнать конкретное значение константы, можно воспользоваться окном Просмотр объектов (Object Browser) (рис. 7.1), которое вызывается клавишей <F2> или щелчком на соответствующей кнопке панели инструментов. После выбора константы ее наименование и значение появится в текстовом поле в нижней части окна Object Browser.

     

    110313 0528 2 Язык программирования VBA

    Рис. 7.1. Просмотр констант в окне Просмотр объектов

    Примеры использования предопределенных констант:

    MsgBox «Текстовое сообщение», vbInformation

    В этом примере предопределенная константа vbInformation указывает, что в окне вывода (рис. 7.2) должен быть значок «Информация».

    MsgBox «Нет данных для расчета», vbExclamation

    В этом примере предопределенная константа указывает, что в окне вывода должен быть значок «Внимание».

    Однако встроенного запаса констант при подготовке программы иногда бывает недостаточно. В этом случае можно создавать свои собственные именованные константы. Для определения констант служит ключевое слово Const. Синтаксическая конструкция для декларирования констант напоминает оператор для декларации переменной и имеет вид:

    [Public | Private] Const ИМЯ__КОНСТАНТЫ [As Тип] = значение Например:

    Const PI As Single = 3.1415 ‘Объявлена именованная _ числовая константа для хранения значения числа Pi


    110313 0528 3 Язык программирования VBA

    Рис. 7.2. Окно вывода vbInformation

     

    7.1.5. Области видимости переменных и констант

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

    Option Explicit

    Dim strФамилия As String * 18 ‘Глобальная переменная

    Dim strИмя As String * 10 ‘Глобальная переменная

    Private Sub UserForm_Initialize()

    Dim strАдрес As String * 30 ‘Локальная переменная

    strФамилия = «Петров»

    strИмя = «Леонид»

    strАдрес = «Москва, Кронштадская, дом 37»

    Вывод strАдрес

    End Sub

    Sub Вывод (strD As String)

    Dim strФамилия As String * 18 ‘Локальная переменная

    strФамилия = «Это уже не Петров!»

    MsgBox strФамилия

    MsgBox strИмя

    MsgBox strD

    End Sub

    В результате выполнения этой программы в окнах вывода будет следующий текст:

    Это уже не Петров!

    Леонид

    Москва, Кронштадская, дом 37.

    Приведем пояснения: strФамилия и strИмя объявлены как глобальные переменные и существуют, пока программа выполняется. StrАдрес и strD являются локальными переменными и существуют лишь тогда, когда выполняется процедура Вывод, в которой они объявлены. В момент вызова этой процедуры глобальная переменная strФамилия существует, но является недоступной, так как ее область видимости перекрыта одноименной локальной переменной, поэтому в окно вывода будет выдано значение той переменной strФамилия, которая объявлена в процедуре Вывод. Переменная strИмя также является глобальной, но она доступна для процедуры Вывод. Переменная StrАдрес объявлена в процедуре UserForm_initialize, но она доносит значение до окна вывода, так как передается в процедуру Вывод в качестве параметра.

    Область видимости переменной задается при ее декларации одним из ключевых слов:

    Dim — объявляет локальные переменные, существующие только во время вызова процедур или функций, в которых они объявлены. Если переменная объявляется в разделе глобальных объявлений модуля или формы, то она доступна для всех процедур и функций этого модуля. Для других модулей она будет не видна.

    Private — не может объявлять переменную внутри процедуры или функции, при объявлении в разделе глобальных объявлений модуля Dim и Private равнозначны.

    Public — объявленная таким образом переменная является глобальной на уровне приложения и доступна из всех его модулей.

    Различают динамические и статические переменные. Статические переменные объявляются внутри процедуры или функции и вне их недоступны. В отличие от обычных локальных переменных они не инициализируются при входе в процедуру или функцию, где они объявлены. Для создания статической переменной необходимо при ее объявлении вместо ключевого слова Dim указать слово Static:

    Static intNumber As Integer

     

    7.1.6. Декларация массивов

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

    Декларация массива имеет следующий вид:

    [Public | Private] Dim Имя_Массива(индексы) As Тип_Данных

    где Dim — ключевое слово, указывающее, что объявляется переменная; Имя__массива — идентификатор, определяющий имя массива; Индексы — значение индекса (номера) последнего элемента в массиве, считая с нулевого; As — ключевое слово, предваряющее указание типа элементов массива; Тип__данных — любой, действительный для Visual Basic тип данных — базовый, или созданный пользователем.

    Например, декларация одномерного массива из восьми элементов выглядит следующим образом:

    Dim MyArray(7) As Integer ‘Одномерный массив из 8 элементов

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

    Dim strMyArray(4,5) As String ‘Двумерный массив из 5 строк и 6 столбцов

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

    Dim MyArray (3 То 10) As String

    В этом примере базовому индексу массива установлено значение 3. Подобным образом можно устанавливать как положительные, так и отрицательные базовые индексы:

    Dim MyArray (-3 To 4) As String

    Иногда в процессе выполнения программы размер массива требуется изменить. В этом случае первоначально массив декларируют как динамический. Для этого в декларации не указывается размерность, например: .

    Dim MyArray () As String

    Количество элементов в динамическом массиве и его размерность в процессе выполнения программы можно переопределить с помощью ключевого слова ReDim. Синтаксическая конструкция переопределения массива имеет вид;

    ReDim .[Preserve] ИмяМассива (индексы) [Аз ТипДанных]

    где, ReDim — ключевое слово, указывающее, что переопределяются размеры массива; Preserve — необязательное ключевое слово, с помощью которого дается указание, чтобы все элементы переопределяемого массива сохранили свое значение; индексы — размерности массива (до 60).

    Пример:

    Dim MyArray () As String ‘Декларация динамического массива

    Dim ValArray As Integer ‘Декларация переменной _

    для хранения размерности массива

    ValArray=9 ‘Инициализация значения

    ReDim strMyArray (intValArray) ‘Одномерный массив _

    из 10 элементов (базовый индекс равен 0)

    ReDim MyArray (3 То ValArray, I To ValArray) ‘Двумерный _

    массив с базовыми индексами, отличными от нуля

    7.1.7. Типы данных, определяемые пользователем

    Выше упоминалось, что Visual Basic позволяет создавать собственные типы данных или, как их называют, типы данных, определяемые пользователем. Они являются типами структурного вида. Эти типы создаются на основе базовых типов Visual Basic. Возможность создавать свои типы данных полезна в тех случаях, когда программа работает с группой элементов различного базового типа, но связанных между собой по смыслу.

    Создание нового типа осуществляется следующей конструкцией:

    Туре ИмяТипа

    Имя1 As Тип ‘Структурный элемент создаваемого типа_

    — базовый тип

    Имя2 As Тип ‘Структурный элемент создаваемого типа

    ‘-базовый тип


    ИмяN As ‘Тип ‘Структурный элемент создаваемого типа

    ‘— базовый тип

    End Type

     

    где Туре — ключевое слово, которое указывает, что создается новый пользовательский тип данных; ИмяТипа — имя создаваемого типа (идентификатор); NameN As Тип — описание структурного элемента создаваемого типа; End Туре — ключевые слова, завершающие описание нового типа.

    Например, пользовательский тип данных, предназначенный для хранения фамилии, даты рождения и даты поступления на работу сотрудника может быть объявлен следующим образом:

    Туре Сотрудник

    strФамилия As String ‘Структурный элемент для хранения _

    фамилии

    ДатаРождения As Date ‘Структурный элемент для хранения _

    даты рождения

    ДатаПоступления As Date ‘Структурный элемент для хранения_

    даты поступления на работу

    End Type

    Созданный тип данных может быть использован в программе. Для этого в разделе деклараций программы надо объявить переменную такого типа. Объявление переменной выполняется также, как и в случае базовых типов:

    Dim udtСлужащий As Сотрудник ‘Объявлена переменная_

    пользовательского типа Сотрудник

    Обращение к элементу пользовательского типа имеет синтаксис:

    ИмяПеременной.ИмяСтруктурногоЭлемента

    Пример: udtСлужащий.strФамилия=»Иванов»

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

     

    7.2. Операторы, выражения и операции

    Строка с кодом в исходном тексте программы Visual Basic называется программным оператором. Программный оператор — это неделимое предложение, выполняющее какое-либо действие. Он может представлять собой любую комбинацию ключевых слов Visual Basic, свойств, функций, операций и символов, совокупность которых представляет собой корректную конструкцию, распознаваемую Visual Basic. Завершенный программный оператор может состоять из единственного ключевого слова, например Веер, или же комбинаций элементов, например, как следующий оператор, присваивающий значение системного времени свойству Caption (надпись) объекта Label 1:

    Label1.Caption = Time

    Правила, применяемые при построении программных операторов, называются синтаксисом.

    Программный оператор может включать выражения. Выражение (expression) — это комбинация знаков операций и операндов, а также скобки. Назначение любого выражения — получение некоторого значения. Синтаксическая конструкция выражения может быть представлена в виде:

    Операнд1 [операция Операнд 2 [операция Выражение]]

    Например, вычисление площади круга может быть записано выражением:

    (3.14159 * D110313 0528 4 Язык программирования VBA2)/4

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

    Pi = 3.14159

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

    Для формирования и последующего вычисления выражений служат операции. Для записи операций Visual Basic имеет знаки операций, которые воспринимаются компилятором как отдельные лексемы. Каждая операция имеет свой приоритет (ранг). Операции ранга 1 имеют наивысший приоритет и в программном операторе выполняются первыми. Операции одного ранга в выражениях выполняются в соответствии с правилами ассоциативности (слева направо или наоборот).

    Пример программного оператора для вычисления накопленной стоимости:

    Db1HC = db1ПВ+ db1ПВ * db1HП/100

    Запись db1ПВ+ db1ПВ * db1HП/100 представляет собой арифметическое выражение, в котором операндами являются неименованная числовая константа 100, а так же переменные Db1HC — для хранения величины накопленной стоимости, db1ПВ — для хранения величины начального вклада и db1HП — для хранения нормы прибыли. Операнды связаны между собой знаками операций.

     

    7.2.1.    Операция присваивания

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

    ИмяПеременной = Выражение

    где ИмяПеременной — имя переменной (идентификатор); символ «=» — знак операции присваивания.

    Выражение может быть значением (например, числом), либо комбинацией переменных, констант и функций, связанных знаками операций. Например:

    intI = 6 ‘Переменной intI целого типа присваивается значение 6

    ‘Структурной составляющей Фамилия пользовательского _

    типа Служащий присваивается фамилия Иванов:

    Служащий. Фамилия = «Иванов»

    TxtFirstName.Text = FirstName

    В последнем операторе значение переменной FirstName присваивается элементу Text пользовательского типа данных с именем TxtFirstName.

     

    7.2.2.    Математические операции

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

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

    110313 0528 5 Язык программирования VBAТаблица 7.4.

    Математические операции

    Операция 

    Математическое 

    Ранг 

     

    действие 

    (приоритет)

    [Операнд 1] + [Операнд2]


     

    Сложение 

    7 

    [Операнд1] — [Операнд2] 

    Вычитание 

    7 

    -[Операнд1] 

    Изменение 

    3 

     

    знака числа 

     

    [Операнд1] *[Операнд2]

    Умножение 

    4 

    [Операнд1] / [Операнд2] 

    Деление 

    4 

    [Операнд1] \ [Операнд2] 

    Целая часть 

    5 

     

    от деления 

     

    [Опер. 1]Mod [Опер.2] 

    Остаток от 

    6 

     

    деления 

     

    [Операнд!] Ù [Операнд2]

    Возведение 

    2 

     

    в степень 

     

    Остальные математические операции называются дополнительными. Они применяются в специальных математических формулах и при обработке текстовой информации. Для пояснения, как они работают, рассмотрим примеры:

    Result = 10 \ 3 — результат 3 (целая часть от деления);

    Result = 10 Mod 3 — результат 1 (остаток от деления);

    Result =110313 0528 6 Язык программирования VBA— результат 9;

    Result = 110313 0528 7 Язык программирования VBA — результат 3;

    Result = 110313 0528 8 Язык программирования VBA— результат 0.25.

    Общие правила применения математических операций определяются следующим синтаксисом:

    Result = Операнд1 Операция Операнд2 [Операция ОперандЗ [ …Операция Операнды ]

    где Result — переменная, содержащая результат выполнения оператора; Операнд1, Операнд2, …, Операнды — переменные, константы, числовые значения, функции.

    Последовательность вычислений в программном операторе определяется приоритетом операций. Если в программном операторе некоторые выражения заключены в круглые скобки, то такие выражения вычисляются первыми (скобки являются операциями с приоритетом 1). Например:

    Result = (25+45) * 110313 0528 9 Язык программирования VBA

    В этом программном операторе в первую очередь будет вычислено выражение в скобках (25+45), затем число 10 будет возведено в степень 2 и только после этого будет выполнено умножение значения результата вычисления в скобках на значение результата возведения в степень. Результат вычисления — 7000.

     

    Упражнение 8

    Создание функции пользователя с линейным алгоритмом для вычисления накопленной стоимости

    Накопленная стоимость по выданному кредиту (или по вкладу) вычисляется в соответствии с формулой:

    S=P(l+iT),

    где S — накопленное значение; Р — величина кредита; i — номинальная процентная ставка; Т — срок (в месяцах).

    Требуется разработать функцию пользователя для расчета накопленной стоимости.

    Прежде всего необходимо определить, какие данные являются исходными для решения задачи, и определите типы этих данных.

    <

    Для нашей задачи исходными данными являются величина кредита, номинальная процентная ставка и срок кредита. Удобно данные, их идентификаторы и типы представить в виде таблицы 7.5:

     

    Идентификаторы и типы исходных данных

     

    № п/п 

    Описание переменной 

    Идентификатор 

    Тип 

    1

    2

    3

    4 

    Величина кредита Процентная ставка Срок

    Имя функции 

    ИсходнаяСумма Ставка

    Срок

    НакСумма

    Sting

    Sting

    Sting Double

    Приступая к созданию функции:

    Выполните команду меню Вставка > Модуль, а затем — Вставка > Подпрограмма.

    В поле имени появившегося окна укажите имя функции — НакСумма. Установите переключатель Функция. Щелкните на ОК. В окне редактирования кода появится заготовка функции вида:

    Public Function НакСумма()

    End Function

    Внутри скобок заголовка функции введите описания ее параметров (исходных данных) в соответствии с приведенной таблицей, а за скобками укажите тип значения, возвращаемого функцией:

    Public Function НакСумма (ИсходнаяСумма As String,

    Ставка As String, Срок As String) As Double

    Под заголовком функции поместите код функции:

    ‘Вычисление накопленного значения исходной суммы по формуле

    ‘S=P (1=iT)

    ‘S – накопленное значение

    ‘P – величина ссуды

    ‘i – номинальная процентная ставка

    ‘T – срок в месяцах

    НакСумма = Исходная сумма * (1+Ставка*Срок/12)

    Сделайте комментарий к разработанной функции.

    Проверьте работу функции на примере, вызывая ее с помощью мастера функций Excel.

    При необходимости устраните ошибки.

    Правильный результат — 1100 (для Р=1000, i=10% и Т=12 месяцев).

     

    7.2.3. Операции отношения

    В отличие от математических операций, результатом выполнения которых может быть любое значение, операция отношения может иметь только два результирующих значения — True (Истина) и False (Ложь), которые могут быть присвоены переменным типа Boolean или определенному свойству объекта. Перечень операций отношения Visual Basic приведен в таблице 7.6.

    Таблица 7.6.

    Операции отношения

     

    Операция 

    Описание 

    Операнд1]= [Операнд2]

     

    [Операн1]<> [Операнд2]

     

    [Операнд 1] > [Операнд2]

     

    [Операнд1] < [Операнд2]

     

    [Операнд 1]=> [Операнд2]

     

    [Операнд1]<= [Операнд2]

     

     

    [Строка] Like [Маска]

     

    [Операнд1] Is [Операнд2] 

    Равно. Результат — True, если первый операнд равен второму.

    Не равно. Результат — True, если первый операнд не равен второму.

    Больше. Результат — True, если первый операнд больше второго.

    Меньше. Результат — True, если первый операнд меньше второго.

    Больше или равно. Результат — True, если первый операнд больше или равен второму

    Меньше или равно. Результат — True, если первый операнд меньше или равен второму.

    Соответствие маске. Результат — True, если строка соответствует маске.

    Ссылка на объект. Результат – True, если обе переменные ссылаются на один и тот же объект

    Операции отношения применяются для записи выражений условия, результатом выполнения которых являются значения True (Истина) или False (Ложь). Примеры использования операций отношения приведены в таблице 7.7.

     

    Таблица 7.7.

    Использование операций отношения

    Выражение условия

    Результат 

    25 <> 30

    25 < 30

    25 > 30

    Textl.Text = «Петров»

     

     

    Number >= 100 

    True (Истина) (25 не равно 30)

    True (Истина) (25 меньше 30)

    False (Ложь) (25 не больше 30)

    True (Истина), если слово Петров является содержимым первого текстового поля, в противном случае — False (Ложь)

    True (Истина), если переменная Number содержит значение не меньше 100, в противном случае — False (Ложь)

     

    7.2.4. Логические операции

    Логические операции применяются в логических выражениях. Если существует несколько условий выбора в операциях отношения, то эти операции связываются между собой логическими операциями. Логические операции Visual Basic приведены в таблице 7.8.

    Таблица 7.8.

    Логические операции

    Логическая операция 

    Действие 

    [Операнд1] And [Операнд2]

    Если связываемые условия имеют значение True, то результирующее значение также будет True

    [Операнд1] Or [Операнд2]

    Если одно из связываемых условий будет иметь значение True, то результирующим значением также будет True

    Not [Операнд]

     

     

    [Операнд1] Xor [Операнд2]

    Если условие имеет значение True, то результирующим значением будет False. Если условие имеет значение False, то результирующее значение будет True

    Если только одно из связываемых условий имеет значение True, то результирующее значение так же будет True. Если оба условия имеют одинаковые значения, то результирующее значение будет False

     

    Таблица 7.9.

    Примеры применения логических операций

     

    Логическое выражение 

    Результат 

    TextBoxl.Text = «Иванов» And Number < 20

     

    TextBoxl.Text = «Иванов» Хог Number < 20

     

    TextBoxl.Text = «Иванов» Or Number < 20

     

     

    Not Number < 20 

    True (Истина), если оба выражения сравнения имеют значение True (Истина).

    False (Ложь), если оба выражения сравнения имеют значение True (Истина).

    True (Истина), если хотя бы одно выражение сравнения имеет значение True (Истина). False (Ложь), если оба выражения имеют значение False (Ложь).

    True (Истина), если выражение сравнения имеет значение False (Ложь).

     

    7.2.5. Операции для работы со строками

    В Visual Basic есть только одна операция для работы со строками – это операция конкатенации. Конкатенация позволяет объединить значения двух или нескольких строковых переменных или строковых констант. Знаком операции конкатенации является символ амперсанд (&). При конкатенации строк значение второй строки добавляется в конец первой строки. Результатом операции является более длинная строка, составленная из исходных строк.

    Выражение с применением операции конкатенации имеет следующий вид:

    strВыражение_1 & strВыражение_2 [ . . . & strВыражение_N]

    где strВыражение являются строковыми выражениями, которые могут быть любыми допустимыми строками (строковыми переменными, строковыми константами или функциями обработки строк). Знак амперсанда между строковыми выражениями указывает, что производится конкатенация этих выражений. Знак амперсанда отделяется от выражения пробельным символом. В одном операторе можно объединять любое количество строковых выражений.

    Например:

    strResult = «Студент» & «Иванов» — здесь объединяются две неименованные строковые константы. Результатом операции конкатенации будет значение «Студент Иванов».

    Тот же результат будет получен при использовании следующего кода:

    Dim strName As String

    Dim strResult As String

    strName = «Иванов»

    strResult = «Студент» & strName ‘Здесь в операции конкатенации участвуют неименованная строковая константа и строковая переменная.

    Объединение строк может быть также выполнено с помощью операции сложения (знак операции «+»). В этом случае результат операции зависит от типа операндов. Например, если операнды являются числовыми типами, то будет выполняться арифметическая операция сложения, если операнды строкового типа, то выполняется их объединение.

     

    7.3. Операторы управления Visual Basic

    Операторы управления языка служат для управления работой программы. К ним относятся:

    операторы передачи управления;

    операторы выбора;

    операторы циклов.

     

    110313 0528 10 Язык программирования VBA7.3.1.    Операторы передачи управления

    Операторы передачи управления применяются в программе для реализации безусловных алгоритмических конструкций. Они выполняют переход с одного участка программы на любой другой без какого-либо условия. Оператор перехода имеет следующий вид:

    GoTo идентификатор

    где GoTo — ключевое слово; идентификатор — одна из меток программы.

    Метка — это идентификатор, помещаемый слева от программного оператора и отделенный от него двоеточием. Например:

    m1: Textl.Text = «это метка»

    Оператор перехода для перехода к оператору с меткой m1 будет иметь вид:

    GoTo m1

    Следует сказать о том, что для получения хорошего стиля программирования следует избегать применения оператора GoTo, так как в этом случае ухудшается читаемость и понимание программы.

    7.3.2.    Операторы выбора

    Операторы выбора используются в программе для реализации условных алгоритмических конструкций, которые вызывают выполнение различных частей программы в соответствии с условиями, существующими на момент выполнения этих операторов. Одним из важных элементов программного оператора выбора является выражение условия, значением которого может быть Истина (True) или Ложь (False). Такие выражения условия записываются с помощью операторов отношения.

    В Visual Basic есть два основных типа операторов выбора: операторы условия if … Then и переключатели, реализуемые оператором Select Case.

     

    7.3.2.1. Операторы If… Then

    В Visual Basic есть два типа операторов if … Then — линейный и блочный.

    Линейный оператор if … Then используется для того, чтобы выполнить какой-либо один оператор, если некоторое условие будет истинным. Условие является выражением или функцией, истинность которого оценивается. Синтаксическая конструкция линейного оператора имеет две формы — безальтернативную:

    If условие Then Выражение

    и альтернативную:

    If условие Then Выражение_1 Else Выражение_2

    В безальтернативной форме при значении условия True сначала выполняется выражение, следующее за ключевым словом Then, а затем следующий в последовательности оператор. Если условие принимает значение False, то выражение следующее за словом Then не выполняется, а выполняется следующий оператор.

    Примеры линейного оператора if … Then безальтернативной формы:

    If intNamber<3 Then intResult = 10*2 «Если переменная _

    intNamber содержит значение меньше трех, то переменной _

    intResult будет присвоено значение 20

    If optAddition.Value = True Then z = x + у

    Пример линейного оператора If … Then … Else:

    If intNamber<3 Then intResult = 10*2 Else intResult =30

    В результате выполнения этого оператора переменной intResult будет присвоено значение 20, если переменная intNamber содержит значение меньше трех, в противном случае переменной intResult будет присвоено значение 30.

    Блочный оператор if … Then используется тогда, когда в случае истинности условия необходимо выполнить несколько программных операторов (блок операторов). Блочный оператор также может быть безальтернативным и альтернативным. Структура безальтернативного блочного оператора следующая:

    If Условие Then

    Программный оператор 1

    Программный оператор 2


    Программный оператор n

    End If

    Здесь End if указывает на окончание блока оператора If.

    Альтернативный блочный оператор If применяется в тех случаях, когда при выполнении условия необходимо выполнить один набор программных операторов, а при невыполнении — другой. Это реализуется с помощью оператора If … Then … Else, синтаксис которого следующий:

    If условие Then

    «Блок программных операторов, выполняемых при значении условия True»

    Else

    «Блок программных операторов, выполняемых при значении условия False»

    End If

    Операторы If могут быть вложенными друг в друга. Такое вложение операторов применяется, если нужно проверить какое-либо условие при другом условии, которое является истинным (например, если фамилия Иванов и он торговый агент). Формат вложенного оператора If следующий:

    If условие_1 Then

    If условие_2 Then

    Блок операторов 1

    Else


    Блок операторов 2

    EndIf

    EndIf

    Пример применения вложенного оператора If:

    If Name = «Иванов» Then

    If Rang = «Торговый агент» Then

    Textl.Text = Name & Rang

    Else

    Textl.Text=»Areнтa с указанной фамилией в списке нет»

    EndIf

    EndIf

    В этом примере условие первого оператора If проверяет, соответствует ли значение переменной Name значению неименованной строковой константы «Иванов». Если результат этой операции True, то вложенный оператор If сделает проверку, является ли Иванов торговым агентом. В случае истинности результата в текстовое поле будет выведено значение «Иванов торговый агент». В противном случае — «Агента с указанной фамилией в списке нет».

    При использовании вложенных операторов If важно не перепутать варианты сочетания условий. Нужно помнить правило: альтернатива Else считается принадлежащей ближайшему оператору If, не имеющему ветви Else.

    В Visual Basic также предусмотрена конструкция для работы с несколькими операторами If. Несколько операторов If применяются в случаях, когда необходимо рассмотреть еще несколько условий в дополнение к исходному. Для этого служит конструкция If … Then … Else If. В отличие от вложенных операторов конструкция с несколькими операторами If позволяет проверить дополнительное условие, если исходное условие принимает значение False. Форма записи нескольких операторов If имеет следующую синтаксическую конструкцию:

    If выражение_условия_1 Then


    Программный оператор 1

    Elself выражение_условия_2 Then

    Программный оператор 2

    Else


    Программный оператор 3

    EndIf

    Например:

    If CorrectAnsver.Text >=8 Then

    Ball.Text =»0тлично»

    ElseIf CorrectAnsver.Text >=6 Then

    Ball.Text = «Хорошо»

    ElseIf CorrectAnsver.Text >=4 Then

    Ball.Text = «Удовлетворительно»

    Else Ball.Text = «Неудовлетворительно»

    EndIf

    Приведенный код программы определяет количество правильных ответов и выставляет оценку. Он работает следующим образом. Сначала проверяется значение условия в операторе If. Если оно принимает значение True, то выполняется оператор (или блок операторов), следующий непосредственно за ключевым словом Then, после чего программа перейдет к выполнению оператора, следующего за EndIf. Если первое условие принимает значение False, то программа перейдет к выполнению первого оператора Elself, чтобы проверить выполнение его условия. Если оно имеет значение True, то выполняется оператор Ball = 4 и программа перейдет к выполнению оператора, следующего за EndIf. В противном случае эта последовательность действий повторится для следующего оператора ElseIf и так до тех пор, пока не будут проверены все из них.

     

    7.3.3. Переключатели

    Переключатели в Visual Basic реализуются оператором Select Case, который позволяет сделать выбор из нескольких альтернативных вариантов в зависимости от значения условного выражения. Синтаксис его следующий:

    Select Case Выражение

    Case Значение_1

    Оператор, выполняемый при совпадении Значения_1 и значения Выражения.

    Case Значение_2

    Оператор, выполняемый при совпадении Значения_2 и значения Выражения.

    Case Значение_N

    Оператор, выполняемый при совпадении Значения_N и значения Выражения.

    End Select

    В операторе Select Case можно использовать операции отношения. Для этого надо включить в выражение ключевое слово Is или ключевое слово То. Ключевое слово Is дает указание компилятору сравнить значение проверяемой переменной со значением выражения, следующего за ключевым словом Is. Ключевое слово То задает диапазон значений. Например, следующий код фрагмента программы, использующий оператор Select Case позволяет выставить оценку исходя из общего количества набранных баллов:

    Select Case ПравильныйОтвет.Text

    Case 8 To 10 ‘Если сумма баллов в диапазоне 8-10

    Балл.Text = «Отлично»

    Case 6 То 7 ‘Если сумма баллов в диапазоне 6-7

    Балл.Text = «Хорошо»

    Case 4 То 5 ‘Если сумма баллов в диапазоне 4-5

    Балл.Text = «Удовлетворительно»

    Case Is < 4 ‘Если сумма баллов меньше 4

    Балл.Text = «Неудовлетворительно»

    End Select

     

    Упражнение 9

    Разработка функции пользователя с проверкой корректности исходных данных

    Требуется доработать функцию пользователя, разработанную в упражнении 8, таким образом, чтобы она проверяла корректность исходных данных. Данные корректны, если они являются числовыми. Для этой цели используем оператор If … Then.

    Откройте окно редактирования кода для модуля, содержащего функцию НакСумма.

    Дополните ее операторами проверки условий корректности. Поместите операторы для вывода сообщений оператору, если данные некорректны. После доработки функции ее код будет следующий:

    ‘Вычисление накопленного значения исходной суммы по формуле

    ‘S=P(l+iT),

    ‘S — накопленное значение

    ‘Р — величина ссуды

    ‘i — номинальная процентная ставка

    ‘Т — срок в месяцах

    ‘Проверка корректности данных

    If (IsNumeric(ИсходнаяСумма) And IsNumeric(Ставка) And_

    IsNumeric(Срок)) = False Then

    MsgBox «Ошибка в исходных данных», vblnformation,_

    «Вычисление накопленной суммы»

    НакСумма = 0

    Exit Function

    Else

    НакСумма = ИсходнаяСумма * (1 + Ставка * Срок / 12)

    End If

    Здесь применена встроенная функция IsNumeric, которая возвращает значение True, если ее аргумент является числом, и False, если аргумент не число.

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

     

    7.4. Программирование циклов

    Цикл — это оператор или группа операторов, которые программа многократно выполняет до тех пор, пока не получит команду начать выполнение чего-либо другого. В Visual Basic существуют два основных типа циклов — циклы со счетчиком (с известным числом повторений) и циклы с условием. Циклы со счетчиком используют в тех случаях, когда необходимо выполнить некоторые действия определенное число раз. Циклы с условием применяются тогда, когда некоторые действия в программе должны повторяться до тех пор, пока выполняется определенное условие или до тех пор, пока не будет выполнено определенное условие.

     

    7.4.1. Циклы со счетчиком

    Циклы со счетчиком (с известным числом повторений) в Visual Basic еще называют циклами For, или циклами For … Next. Так они называются потому, что начало и конец этих циклов определяются операторами For и Next. Синтаксис цикла For … Next таков:

    For СчетчикЦикла = НачапьноеЗначение То

    КонечноеЗначение [Step Шаг]

    операторы

    [Exit For]

    Next [СчетчикЦикла]

    где For — ключевое слово Visual Basic, обозначающее начало цикла;

    СчетчикЦикла — переменная, определенная в качестве счетчика цикла;

    НачальноеЗначение — число, задающее начальное значение счетчика;

    То — ключевое слово Visual Basic, разделяющее НачальноеЗначение и КонечноеЗначение — число, задающее значение счетчика, при котором цикл завершается;

    step — ключевое слово Visual Basic, используемое для задания шага цикла, необязательный аргумент;

    Шаг — число, задающее шаг цикла, т.е. значение, на которое увеличивается (или уменьшается) значение счетчика на каждом шаге, это число может быть отрицательным; Exit For — оператор досрочного выхода из цикла (необязательный); Next — ключевое слово Visual Basic, обозначающее конец цикла.

    В начале цикла For … Next определяется переменная-счетчик, а так же начальное и конечное значения этой переменной. В самом начале выполнения цикла переменная-счетчик устанавливается в начальное значение. Каждый раз, когда программа пройдя через цикл, возвращается к его началу, значение счетчика увеличивается. Если используется ключевое слово Step, то переменная-счетчик изменяется в соответствии с числом, указанным после ключевого слова step. Например:

    For I = 0 То 10 Step 2 ‘Значение I будет увеличиваться на 2

    Если ключевое слово Step отсутствует, то значение шага равно единице.

    Каждый раз, когда значение переменной-счетчика изменяется, оно сравнивается с заданным конечным значением счетчика. Если значение счетчика превышает конечное значение, программа сразу выходит из цикла и переходит к той строке кода, которая следует за циклом.

    Например:

    Option Explicit

    Dim I As Integer

    For I = 1 To 4

    Sum =Sum + 2

    Next I

    Этот цикл эквивалентен написанию четырех операторов Sum=Sum + 2 в тексте программы.

    Цикл For … Next может быть прерван досрочно, например, при достижении какого-либо условия. Для этого в нужном месте цикла нужно поместить оператор Exit For. Например:

    Option Explicit

    Dim Sum As Integer

    Dim j As Integer

    Sum = 2

    For j = 1 To 10

    Sum = Sum + j

    If Sum > 6 Then

    Exit For ‘Выход из цикла, если значение Sum больше 6

    End If

    Next j

    TextBoxl.Text = Sum

    В этом примере цикл прерывается досрочно, когда значение переменной Sum будет больше 6. В результате выполнения этого кода в текстовом поле будет выведено вычисленное значение переменной Sum равное 8.

     

    7.4.2. Циклы с условием

    Главной особенностью циклов с условием является условие, которое может быть любым выражением, принимающим значение True (Истина) или False (Ложь). В Visual Basic есть два основных цикла с условием — цикл Do While … Loop и цикл Do Until … Loop. Оба они могут быть с предусловием или с постусловием.

    Циклы Do while | Until имеют следующий синтаксис:

    Цикл с предусловием:

    Do While | Until Выражение


    Операторы


    [Exit Do]

    Loop

     

    Цикл с постусловием:

    Do

    Операторы

    [Exit Do]

    Loop While | Until Выражение

    где Do — ключевое слово; while | Until — ключевые слова, указывающие тип цикла; Выражение — выражение условия, принимающее значение True или False; Loop — ключевое слово, указывающее на окончание цикла.

    Цикл Do While выполняется до тех пор, пока выражение условия имеет значение True.

    Пример цикла Do While, реализующего алгоритм программы, аналогичный приведенной в примере для цикла For с досрочным прерыванием:

    Option Explicit

    Dim Sum As Integer

    Dim j As Integer

    Sum = 2

    Do While Sum < 7

    Sum = Sum + j

    j = j + 1

    Loop

    TextBox1.Text = Sum

    В результате выполнения этого кода в текстовом поле будет выведено вычисленное значение переменной Sum равное 8.

    В отличие от цикла Do While цикл Do Until выполняется до тех пор, пока выражение условия имеет значение False.

    Пример цикла Do Until, реализующего алгоритм программы аналогичный приведенному выше:

    Option Explicit

    Dim Sum As Integer

    Dim j As Integer

    Sum = 2

    Do Until Sum >7

    Sum = Sum + j

    j = j + 1

    Loop

    TextBox1.Text = Sum

    В результате выполнения этого примера в текстовом поле будет выведено вычисленное значение переменной Sum равное 8.

    Иногда бывает необходимо прервать цикл Do … Loop, если выполняется какое-либо дополнительное условие. Это может быть сделано с помощью оператора Exit Do. Например:

    Option Explicit

    Dim Sum As Integer

    Dim j As Integer

    Sum = 2

    Do Until Sum > 7

    Sum = Sum + j

    j = j + 1

    If j > 3 Then

    Exit Do ‘Досрочный выход из цикла Do … Loop

    End If

    Loop

    TextBoxl.Text = Sum

    В этом примере цикл с условием досрочно прерывается, если выполняется дополнительное условие j > 3. В результате выполнения программного кода переменная Sum будет иметь значение, равное 8.

    Используя цикл с условием, можно организовать бесконечный цикл. Иногда это бывает необходимо, а иногда это происходит из-за ошибки пользователя. Для создания бесконечного цикла условное выражение должно быть таким, которое никогда не выполняется или выполняется всегда. Например:

    Do Until 1

    Операторы

    Loop

    Выйти из такого бесконечного цикла и прервать работу программы можно нажав комбинацию клавиш <Ctrl+Break>.

    Упражнение 10

    Расчет накопленной стоимости при неравномерных непериодических платежах рассчитывается по формуле:

    110313 0528 11 Язык программирования VBA

    где Pi — суммау j-го платежа; i — номинальная годовая ставка; dt — продолжительность периода, за который рассчитываются проценты; k — количество платежей.

    Требуется разработать функцию пользователя для расчета накопленной стоимости по методу простых процентов по приведенной выше формуле.

    Задаваемыми исходными данными для решения задачи являются величины суммы платежей, даты их выплаты и номинальная процентная ставка. Вычисляемыми данными являются количество платежей и продолжительность периода.

     

     

    Исходные и вычисляемые 

    данные

    Переменная 

    Идентификатор 

    Тип данных 

    Примечание 

    Величина 

    Платеж 

    Variant 

    Параметр функции, пе-

    платежа 

       

    редающий значения 

         

    диапазона ячеек 

    Дата 

    Дата 

    Variant 

    Параметр функции, пе- 

    платежа 

       

    редающий значения 

         

    диапазона ячеек 

    Номиналь- 

    Ставка 

    Single 

    Параметр функции 

    ная ставка 

     

     

    К

    i 

       

     

    К 

     

    Integer

    Integer

     

    Вычисляемое значение

    Счетчик цикла

       Dt

    Дельта 

    Integer 

    Вычисляемое значение

    как разность между дву-

    мя смежными датами 

     

    Текущая 

    Summa 

    Double 

    Вспомогательная пере- 

     

    сумма 

     

    менная 

     

    Функция 

    НАКСУММА 

    Double 

    Имя функции (возвра- 

         

    щаемое значение) 

     

    Примечание. Если параметр функции передает значения массива ячеек, то он должен иметь тип Variant.

    Для создания функции выполните действия:

    Создайте модуль.

    Вставьте в созданный модуль подпрограмму-функцию.

    Введите в нее следующий код:

    Public Function НАКСУММА(Ставка As Single,_

    Платеж As Variant, Дата As Variant) As Double

    Dim К As Integer

    Dim i As Integer

    Dim Summa As Double ‘Текущая сумма вклада

    Dim Дельта As Integer ‘Разность в днях между ‘двумя платежами

    Summa = Платеж(1)

    К = Платеж.Count ‘общее количество платежей

    For i = 2 То К

    Дельта = Дата(i) – Дата (i — 1)

    Summa = Summa + Summa * Ставка * Дельта / 365 + Платеж(i)

    Next

    НАКСУММА = Summa

    End Function

    Для проверки работоспособности функции решите следующую задачу:

    Клиент сделал вклад на текущий счет в банке в сумме 1000 р. под 60 процентов годовых. Через 3, 6 и 9 месяцев он вложил еще по 1000 р. В конце учетного года клиент закрыл счет. Какую сумму он получил при закрытии счета?

    На рабочем листе Excel подготовьте исходные данные, как показано ниже, и выполните расчет, применив созданную функцию.

     

    Платежи 

    Даты платежей 

       

    1000 р. 

    01.01.01 

       

    1000 р. 

    01.04.01 

       

    1000 р. 

    01.07.01 

       

    1000 р. 

    01.10.01 

    Накопленная сумма 

    Правильный результат 

    0 

    31.12.01 

     

    5740,95 р. 

     

    7.5. Встроенные функции

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

    финансово-математические функции;

    функции преобразования типа;. математические функции;

    функции статуса;

    функции обработки строк;

    прочие функции;

    функции даты и времени;

    функции для работы с массивами;

    функции для работы с файлами;

    прочие функции.

     

    7.5.1. Финансово-математические функции

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

    Рассмотрим примеры использования некоторых из них.

     

    Упражнение 11

    Использование встроенных финансово-математических функций

    Пусть необходимо вычислять величину амортизации основных фондов в указанный период эксплуатации. Стоимость автомобиля в начале эксплуатации 150 тыс. р., а его стоимость в конце эксплуатации через 6 лет составляет 20 тыс. р. Требуется определить величину амортизации для третьего года эксплуатации. Расчеты сделать для случая равномерной амортизации и для случая двукратной амортизации. Для решения задачи можно воспользоваться финансово-математическими функциями SYD и DDB (табл. П.1).

    Функции имеют следующий синтаксис:

    SYD(Стоимость, Ликвидная_стоимос1ъ, Жизнь, Период)

    DDB(Стоимость, Остаточная_стоимость, Время_эксплуатации, Период, Кратность)

    Параметрами этих функций, посредством которых задаются исходные данные для расчетов, являются:

    Стоимость — стоимость единицы основного фонда в начале эксплуатации;

    Остаточная стоимость — стоимость в конце эксплуатации;

    Время эксплуатации — продолжительность эксплуатации в периодах (месяц, год);

    Период — номер периода, для которого производится расчет;

    Кратность — целое число, определяющее кратность амортизации (метод расчета).

    Для создания функции определим ее параметры, оформив их в виде таблицы 7.11.

    Таблица 7.11.

    Параметры функций

    Параметр 

    Идентификатор 

    Тип 

    Стоимость в начале 

    Стоимость 

    Double 

    эксплуатации

       

    Стоимость в конце 

    Остаточнаястоимость 

    Double 

    эксплуатации 

       

    Время эксплуата- 

    Времяэксплуатации 

    Double 

    ции 

       

    Номер периода 

    Период 

    Integer 

    Кратность аморти- 

    Кратность 

    Byte 

    зации 

       

    Тип амортизации 

    Тип 

    Byte 

    Имя функции 

    АМОРТИЗАЦИЯ 

    Double

     

    Задание:

    Создайте в одном из модулей проекта функцию для расчета амортизации с именем амортизация.

    Поместите в нее следующий код:

    Public Function АМОРТИЗАЦИЯ(Стоимость As Double_,

    Остаточная_стоимость As Double, Время_эксплуатации As_

    Integer, Период As Integer, Тип As Byte,_

    Кратность As Byte) As Double

    ‘Проверка вида расчета. Если Тип 0, то кратный метод

    ‘иначе равномерная амортизация

    If Тип 0 Then

    АМОРТИЗАЦИЯ = DDB(Стоимость, Остаточная_стоимость,

    Время_эксплуатации, Период, Кратность)

    Else

    АМОРТИЗАЦИЯ = SYD(Стоимость, Остаточная стоимость,_

    Время_эксплуатации, Период)

    End If

    End Function

    На рабочем листе поместите исходные данные для проверки функции (рис. 7.3).

    Примените созданную функцию для расчета амортизации поданным таблицы.

    Отладьте код программы, если необходимо.

    Поместите в свойство функции ее краткое описание.

     

    Кратная амортизация 

    Равномерная амортизация 

    Начальная стоимость 

    150 000,00р. 

    150 000,00р. 

    Конечная стоимость 

    20 000,00р. 

    20 000,00р.

    Срок эксплуатации 

    6 

    6 

    Период расчета 

    3 

    3 

    Тип амортизации 

    1 

    0 

    кратность 

    2 

    0 

    Результат: 

       

    Сумма амортизации 

    22 222,22р. 

    24 781,90р. 

    Рис. 7.3. Результаты расчета амортизации

     

    7.5.2. Функции преобразования типов

    Visual Basic, в некоторых случаях, выполняет автоматическое преобразование одного типа данных в другой. Однако в процессе автоматического преобразования могут возникать ошибки, а в некоторых случаях автоматическое преобразование не выполняется. Поэтому в процессе разработки программы пользователь должен сам определять необходимость преобразования типов данных. Для этого нужно применять функции преобразования типов (табл. П.2).

    Рассмотрим пример. Допустим, надо сложить два числа, значения которых вводятся с помощью управляющих элементов TextBox. Если вычисления будут выполняться программой, код которой имеет вид:

    TextBox3.Text= TextBoxl.Text + TextBox2.Text

    то результат вычисления будет неверным, так как в этом случае выполнится объединение строк. Например, если исходными значениями будут 100 и 200, то получится результат 100200, что, конечно, не является результатом арифметического сложения.

    Для того, чтобы получить правильный результат, предварительно нужно преобразовать исходные величины строкового типа в числовые целого типа (или другого числового типа). Это преобразование может быть выполнено с помощью функции cint. Тогда фрагмент кода для выполнения сложения будет иметь вид:

    TextBox3.Text = Cint(TextBoxl.Text) + Cint(TextBox2.Text)

    При выполнении этого кода будет получен правильный результат — 300. Также правильный результат будет получен, если фрагмент кода будет следующий:

    TextBox3.Text = Val(TextBoxl.Text) + Val(TextBox2.Text)

    В последнем фрагменте для преобразования типов применена функция val, которая преобразует строку числовых символов в число, поэтому выполняется не объединение строк, а сложение чисел. Различие этих двух функций заключается в следующем: для функции cint аргументом должна быть строка только числовых символов, иначе будет ошибка; для функции Val аргумент может содержать не числовые символы. В этом случае для правильного преобразования числовые символы должны располагаться в начале строки. Если лидирующее положение занимают не числовые символы, то результатом преобразования будет значение 0. Так если TextBoxl.Text содержит значение 100ВВ, TextBox2.Text — 200Text, то все равно результатом сложения будет значение 300. Если TextBoxl.Text содержит значение А100, TextBox2.Text — Text200, то результатом сложения будет 0.

     

    7.5.3.    Математические функции

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

    Option Explicit

    Dim dblАргумент As Double, dblРезультат As Double

    dblАргумент=100

    dblPeзультат=Sqrt (dblАргумент)

    В результате выполнения этого кода переменная dblРезультат получит значение 10.

     

    7.5.4.    Функции обработки строк

    Функции обработки строк Visual Basic приведены в таблице П.5. Они служат для выполнения операций со строками. В качестве иллюстрации применения некоторых из них рассмотрим пример.

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

    вычислить номер позиции разделителя используя функцию Instr;

    выделить целую часть до позиции разделителя с помощью функции Left;

    выделить дробную часть с помощи функции Mid;

    преобразовать дробную часть, вставив символ разделителя после второго знака;

    преобразовать полученное значение дробной части в тип с плавающей точкой используя функцию преобразования типа Cdbl;

    округлить полученное число до целого с помощью функции int;

    используя операцию объединения строк сформировать строковое представление округленного числа.

    Ниже приведен фрагмент кода, выполняющий такое округление.

     

    Option Explicit

    Dim strИсходнаяСтрока As String * 10

    Dim strЦелаяЧасть As String * 4

    Dim strДробнаяЧасть As String * 7

    Dim intПозицияРазделителя As Integer

    Dim dblДробнаяЧасть As Double

    StrИсходнаяСтрока = TextBoxl.Text

    intПозицияРазделителя = InStr(l, ЫекИсходнаяСтрока, «,»)

    strЦелаяЧасть = Left (StrИсходнаяСтрока,_

    intПозицияРазделителя — 1)

    strДробнаяЧасть = Mid(StrИсходнаяСтрока,_

    intПoзицияPaздeлитeля + 1, 2) & «,» _

    & Mid (StrИсходнаяСтрока, intПозицияРазделителя + 3)

    dblДробнаяЧасть = CDbl (strДробнаяЧасть)

    strДробнаяЧасть = Fix(dblДробнаяЧасть)

    TextBox2.Text = strЦелаяЧасть & «,» & strДробнаяЧасть

     

    Вопросы для самоконтроля

    Какие символы допускается применять в именах переменных?

    Можно ли имя переменной начинать с цифры или с символа подчеркивания?

    Какие базовые типы данных поддерживает Visual Basic?

    Напишите оператор, явно декларирующий строковую переменную для хранения почтового адреса.

    Какой оператор должен присутствовать в разделе глобальных объявлений, чтобы исключить ошибки в случае появления неявно объявленных переменных?

    Напишите оператор, декларирующий одномерный массив из 7 элементов целого типа и имеющий базовый индекс — 3.

    Что такое динамические массивы и как они декларируются?

    Каково различие между переменной и константой. Какие типы констант поддерживает Visual Basic?

    Что представляет собой пользовательский тип данных, как он определяется и объявляется?

    Каково различие между линейным и блочным оператором If … Then?

    Какой оператор Visual Basic позволяет сделать выбор из нескольких альтернативных вариантов?

    Как определяется цикл с известным числом повторений?

    Какие циклы с условием поддерживает Visual Basic?

    В чем различие циклов с предусловием и постусловием ?

    Что такое функция и как она определяется?

    Как производится обращение к функции?

    Какие типы встроенных функций есть в Visual Basic?

     

    Задания для самостоятельной работы

    Задание 1

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

    110313 0528 12 Язык программирования VBA

    где I — годовая процентная ставка; g — налог на прибыль, выраженный в процентах; h — годовой темп инфляции, вычисляемый по формуле:

    110313 0528 13 Язык программирования VBA

    где h1/12— месячный темп инфляции.

    Для проверки и отладки программы используйте следующие исходные данные: i = 60%, h1/12= 3%,g = 25% . Для них реальная доходность составит r = 1,7%.

    Задание 2

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

    110313 0528 14 Язык программирования VBA

     

    где Р — сумма кредита; S — сумма, подлежащая возврату; Т — срок кредита.

    Для проверки и отладки программы используйте следующие исходные данные: Т= 4 месяца, Р = 100 тыс., S = 110 тыс. Для них годовая ставка составит i = 30%

    Задание 3

    Разработайте функцию пользователя для вычисления накопленной по процентам суммы, при условии, что известна годовая процентная ставка, а вклады делаются неравномерными и непериодическими платежами (см. условие задачи в упражнении 10). Для расчетов используйте формулу:

    110313 0528 15 Язык программирования VBA

    где i — годовая процентная ставка; k — количество платежей; Rj— величина j-того платежа; tj — дата j-того платежа.

    Для проверки программы используйте условие задачи из упражнения 10. Для этих условий значение I = 1500.

     

     

     

<

Комментирование закрыто.

MAXCACHE: 1.14MB/0.00159 sec

WordPress: 24.44MB | MySQL:122 | 3,303sec