End Sub

2.4 Данные и их описание

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

 

Алфавит VBA включает:

- прописные и строчные буквы латинского алфавита: А-Z, a-z;

- прописные и строчные буквы кириллицы: А-Я, а-я;

- цифры от 0-9;

- символ подчеркивания «_»;

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

- специальные символы, участвующие в построении конструкций языка:

+,-,*,/,\,^,=,>,<,[,],(,), . , : ,{,},’,@,&;

- составные символы, воспринимаемые как один символ: <=, >=, <>;

- комментарии, используемые для читаемости и понятности текста программы. Представляют собой последовательность любых символов, которая начинается со знака «’» (апостроф) или с ключевого слова Rem.

Пример.

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

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

Программный код VBA представляет собой последовательность лексических единиц (лексем), записанных в соответствии с принятыми синтаксическими правилами.

Лексема – это минимальная неделимая единица текста программы, которая имеет определенный смысл для компилятора.

Различают шесть классов лексем:

- свободно выбираемые и используемые идентификаторы;

- служебные (зарезервированные) слова;

- константы;

- строки (строковые константы);

- операции (знаки операций);

- разделители (знаки пунктуации).

 

2.4.2 Переменные и константы

 

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

Константа – это объект, значение которого фиксировано и не может быть изменено во время выполнения программы.

Идентификатор - это имя переменной, константы, процедуры, функции, и других объектов.

Правила написания идентификаторов:

1) в программе он должен быть уникальным, не должен совпадать с зарезервированными словами VBA;

2) он должен начинаться только с буквы;

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

4) длина идентификатора может включать до 255 символов, но VBA учитывает только первый 31 символ;

5) они могут быть простыми и составными.

Пример,

N, I, Number, Номер – простые имена переменных;

ФамилияСтудента – составное имя переменной.

Соглашения по стилю идентификаторов:

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

- имена из прописных букв используются для определения констант;

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

 

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

 

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

Основной принцип VBA.

Каждый именованный объект (переменная, константа), перед своим использованием должен быть предварительно объявлен (декларирован).

Декларация переменных:

При объявлении переменной надо указать, что объявляется переменная:

- задать имя переменной

- указать ее тип.

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

Синтаксис:

Static | Public | Private | Dim <имя Переменной1> [As <тип данных1>], [<имя Переменной2>[As <тип данных2>]]…

где

Dim (dimension – размер) – ключевое слово, которое сообщает VBA, что декларируется переменная и резервируется область памяти для хранения;

Имя переменной – имя переменной (идентификатор, не входящий в перечень ключевых слов VBA);

As (как) – ключевое слово, которое сообщает VBA, что определяется тип данных для переменной;

Тип – тип данных для объявляемой переменной;

Private (Частный), Public (Общий) – ключевые слова, определяющие область видимости переменной;

Static (Статический) – ключевое слово, которое определяет, сохраняет ли переменная свое значение при завершении блока программы (процедуры, функции) и выходе из него.

Пример 1.

Dim intName As Integer

Если Тип переменной не объявлен, по умолчанию переменная получает тип Variant.

Примечание. Распространенная ошибка в VBA заключается в использовании следующей инструкции:

Dim a, b As Long

Переменная b имеет тип Long, а переменная а – тип Variant.

 

2.4.4 Объявление констант

 

Константы могут быть неименованными и именованными.

Неименованные константы: символьные, целые и вещественные.

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

Пример 1.

“Р”, “Program”, “3.14”, “+”

2 Целые константы

Пример 1.

-3, -485, 44, 0

3 Вещественные константы

Представляются в памяти ЭВМ в двух формах:

- в форме с десятичной точкой (фиксированной): 0.1, -0.125;

- в форме с плавающей точкой вида <мантисса>Е<порядок>: 7.32Е+00 (=7.32), 1.5Е-02 (=0.015).

Встроенные константы (предопределенные).

Такие константы используются при работе с объектами приложения. Эти константы не требуют предварительного описания.

Встроенные в VBA константы имеют префикс VB. Для того чтобы узнать конкретное значение константы, можно воспользоваться окном “Object Browser” (Обозреватель объектов).

Пример 2.

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

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

 

Константы, создаваемые пользователем

Синтаксис:

[Public/Private] Const <имя_константы> [As <тип данных>] = <значение константы>,

где

<значение константы> - любое значение или формула, возвращающая значение, которое должно использоваться в качестве константы.

Имя константы и тип данных устанавливаются так же, как и для переменной.

Пример 3.

Const PI As Single = 3.14 ‘Объявлена именованная числовая константа для

‘хранения значения числа Pi

Const Firm = “ООО Бахус”

 

2.4.5 Строковые переменные

 

Различают строки переменной и фиксированной длины.

Строки переменной длины могут содержать до двух миллиардов символов.

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

Синтаксис:

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

где

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

Пример 1.

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

В VBA имеется строковая операция – конкатенация, которая применяется для объединения нескольких строк в одну, и обозначается символом амперсенда &. Этот символ должен слева и справа обрамляться пробелами.

Пример 2.

strMy = “Visual” & “Basic for Applications”

 

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

 

Переменная или константа может существовать и быть доступной для некоторых частей программы и при этом быть недоступной (невидимой) для других частей программы.

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

Если переменная видима, то она доступна и, следовательно, существует.

Переменные или константы можно объявлять в трех местах:

- внутри процедуры (видимы только внутри процедуры);

- в верхней части модуля, которая называется областью общих объявлений (видимы всем процедурам данного модуля),

- глобальный уровень видимости (видимы в любой процедуре любого модуля приложения). Объявляются в верхней части модуля в области общих объявлений с помощью оператора Public.

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

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

Операторы объявления:

Dim– объявляет локальные переменные только внутри процедуры или функции, в которых они объявлены.Они сохраняют свои значения, только пока выполняется процедура. При завершении процедуры значении этих переменных теряются.

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

Dim, Private – объявляет переменные на уровне модуля (формы), в котором они описаны, но для других модулей данного проекта не доступны. Объявляются в области описания модуля (перед описанием процедур или функций).

Public – объявляет глобальную переменную на уровне проекта, которая доступна для всех его модулей.

 

2.4.7 Типы данных

 

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

Переменную можно представить как простейший объект программы следующим образом:

 

Переменная
Логический уровень Имя переменной (идентификатор) Тип переменной
Физический уровень Область памяти Формат представления в памяти

 

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

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

 

 

Таблица 1 - Основные типы данных

Тип Занимаемая память Интервалы значений  
Целочисленные типы  
Byte (целые числа) 1 байт 0…255  
Boolean (логические значения) 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 до 65400  
String (текстовая информация - строка переменной длины) 10 байт + 1 байт на каждый символ От 0 до двух миллиардов символов  
Объектные типы  
Object (Рисунок или ссылка на любой другой объект) 4 байта Ссылка на объект  
Типы Variant  
  Variant значения любого из перечисленных типов данных 16 байт для чисел, 22 байта + 1 байт на каждый символ для строк Любое числовое или строковое значение
               

2.5 Функции в VBA

 

В VBA используются следующие виды функций:

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

- математические функции, не представленные в VBA;

- функции форматирования данных;

- функции преобразования типов

 

2.5.1 Математические встроенные функции

 

Таблица 2 - Встроенные математические функции VBA

Функция Возвращаемое значение
Abs (x) - абсолютная величина числа
Atn (x) arctg (x) – арктангенс от значения параметра, заданного в радианах
Sin (x) sin (x) – возвращает синус угла от значения параметра, заданного в радианах
Cos (x) cos (x) – косинус указанного в радианах угла
Tan (x) tg (x) – возвращает тангенс угла от значения параметра, заданного в радианах
Exp (x) ex – возвращает число e, возведенное в указанную степень, где е – основание натурального логарифма
Log (x) ln (x) – возвращает натуральный логарифм от значения числового выражения
Sqr (x) - возвращает квадратный корень числового выражения
Rnd (x) Случайное число из интервала [0,1). Перед вызовом функции надо использовать оператор Randomize (рандомизации) – запуск генератора псевдослучайных чисел)
Sgn (x) Возвращает +1, если значение параметра положительно, -1, если отрицательное, 0, если 0
Fix (x) Возвращает результат округления выражения с плавающей точкой до целой части. В случае отрицательного параметра возвращает ближайшее большее отрицательное число
Int (x) Возвращает результат округления выражения с плавающей точкой до целой части. В случае отрицательного параметра возвращает ближайшее меньшее отрицательное число

 



2.5.2 Математические функции, не представленные в VBA

Таблица 3 - Математические функции, не представленные в VBA

Функция Возвращаемое значение
Log(X)/Log(10) lg(х) – возвращает десятичный логарифм от значения числового выражения
Atn arcsin (x) – возвращает арксинус угла от значения параметра, заданного в радианах
Atn arccos (x) – возвращает арккосинус угла от значения параметра, заданного в радианах
Cos (x)/Sin (x) ctg (x) - возвращает котангенс угла от значения параметра, заданного в радианах
Значение числа π Pi = 4 * Atn (1)

 

2.5.3 Функция форматирования данных

 

Для того чтобы представить выражение отформатированным в специфицированном формате, необходимо воспользоваться функцией Format. Она возвращает значение типа Variant (String), содержащее выражение, отформатированное согласно указанным спецификациям.

Синтаксис:

Format (выражение [ , “Имя формата (или символ формата)“])

Именованные числовые форматы, показанные в таблице 4.

 

Таблица 4 - Именованные числовые форматы

Имя формата Описание
General Number Число без разделителя тысяч
Currency Отображает две цифры справа от десятичной точки
Fixed Отображает одну цифру слева и две справа от десятичной точки
Standard Отображает одну цифру слева и две справа от десятичной точки и выводит разделитель тысяч
Percent Отображает число в виде процентов и выводит две цифры справа от десятичной точки
Scientific Использует формат с плавающей десятичной точкой
Yes/No Отображает No, если число равно 0, и Yes – в противном случае
True/False Отображает False, если число равно 0, и True – в противном случае
On/Off Отображает Off, если число равно 0, и On – в противном случае

 

Рисунок 11 - Программа, показывающая работу различных именованных

форматов с помощью окна Immediate

 

2 Пользовательские числовые форматы

При построении пользовательского формата возможно использование символов, указанных в таблице 5.

 

Таблица 5 - Символы пользовательского формата

Символ Описание
Резервирует позицию цифрового разряда. Отображает цифру или нуль. Если у числа, представленного параметром, есть какая-нибудь цифра в той позиции разряда, в которой в строке формата находится 0, функция отображает эту цифру параметра, если нет – в этой позиции отображается нуль. Пример. Debug.Print Format (1.2 ^2, “##.000”)
# Резервирует позицию цифрового разряда. Отображает цифру или ничего. Если у числа, представленного параметром, есть какая-нибудь цифра в той позиции разряда, в которой в строке формата находится #, функция отображает эту цифру параметра, если нет – в этой позиции ничего не отображается. Пример. Debug.Print Format (1.2 ^2, “##.###”)

 

Продолжение таблицы 5

. (точка) Резервирует позицию десятичного разделителя. Указание точки в строке формата определяет, сколько разрядов необходимо отображать слева и справа от десятичной точки.
E+,E-, e+, e- Разделитель мантиссы и порядка в экспоненциальном формате. Пример. Debug.Print Format (sin(x) * exp(5), “#.###e+##”)
% Резервирует процентное отображение числа Пример. Debug.Print Format (0.5, «#.%») (отобразится 50 %)
d,m,y Резервирует позицию при выводе дня, месяца, года в категории форматов Data Пример. Debug.Print Format (Now, “dd/mm/yyyy”) (отобразится текущая дата, например 25.09.2005
/ Разделитель дня, месяца, года в категории форматов Data

 

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

 

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

 

Таблица 6 - Функции преобразования типов

Функция Описание
Val (String) Возвращает число, содержащееся в строке string, как числовое значение (Val от англ. Value – значение, String – строка)
Str (number) Возвращает значение типа Variant (String), являющееся строковым представлением числа number. В качестве допустимого десятичного разделителя функция Str воспринимает только точку.
CStr (Выражение) Возвращает числовое выражение или строку в строку
CInt (Выражение) Возвращает числовое выражение или строку в число типа Integer
CSng (Выражение) Возвращает числовое значение или строку в число типа Single

 

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

 

Строка с кодом в исходном тексте программы VBA называется программным оператором.

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

Label1.Caption = Time

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

Программный оператор может включать выражения.

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

Синтаксическая конструкция выражения:

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

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

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

Каждая операция имеет свой приоритет (ранг), как показано в таблице 7. Операции ранга 1 имеют наивысший приоритет и в программном операторе выполняется первым. Операции одного ранга в выражениях выполняются в соответствии с правилами ассоциативности (слева направо или наоборот).

 

Таблица 7 - Приоритеты операций

Приоритет Операция
Выражение, заключенное в скобки ()
Вызов функции
Степень (^)
- (смена знака)
(*) и (/)
(\) деление нацело
Mod (остаток от деления нацело)
(+) и (-)
>, <, >=, <=, <>, =
Not
And
Or

 

Операнды связаны между собой знаками операций

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

- операция присваивания;

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

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

- логические операции;

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

2.6.1 Операция присваивания

 

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

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

Синтаксис:

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

где

Имя_Переменной – имя переменной (идентификатор);

Символ «=» – знак операции присваивания;

выражение – значение (число), комбинация переменных, констант,

функций, связанных знаками операций.

Работа операции присваивания.

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

Пример 1.

x = 2

x = x + 2

(переменной х будет присвоено 4)

Для присваивания переменной ссылки на объект применяется инструкция Set.

В общем случае инструкция Set имеет следующий синтаксис:

Set objectvar = [New] objectexpression [Nothing]

где

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

Nothing – позволяет освободить все системные ресурсы и ресурсы памяти, выделенные для объекта, на который имелась ссылка (т.е. она удаляет объект из памяти).

Пример 2.

Dim A as Object

Set A = cmdOK

MsgBox А.Caption

Инструкция Set присваивает переменной А элемент управления Кнопка с именем cmdOK и далее выводит в окне надпись отображаемую на поверхности кнопки.

 

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

 

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

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

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

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

 

Таблица 8 - Математические операции

Операция Математическое действие
[Операнд1] + [Операнд 2] Сложение
[Операнд 1] – [Операнд 2] Вычитание
-[ Операнд 1] Изменение знака числа
[Операнд 1] * [Операнд 2] Умножение
[Операнд 1] / [Операнд 2] Деление
[Операнд 1] \ [Операнд 2] Целочисленное деление
[Операнд 1] mod [Операнд 2] Остаток от деления по модулю
[Операнд 1] ^ [Операнд 2] Возведение в степень

 

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

Rezult = 10 mod 3 – результат 1 (остаток от деления);

Rezult = 9 ^ 0.5 – результат 34

Rezult = 2 ^ -2 – результат 0.25

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

Синтаксис:

Rezult = Операнд1 Операция Операнд2 … Операция ОперандN

где

Rezult – переменная, содержащая результат выполнения оператора;

Операнд1, Операнд2, …, ОперандN – переменные, константы, числовые значения, функции.

 

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

 

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

 

 

Таблица 9 - Операции отношений в VBA

Операция Описание
выражение1 > выражение2 Больше. Результат - True, если первый операнд больше второго
выражение1 >= выражение2 Больше или равно. Результат - True, если первый операнд больше или равен второму
выражение1 < выражение2 Меньше. Результат - True, если первый операнд меньше второго
выражение1 <= выражение2 Меньше или равно. Результат - True, если первый операнд меньше или равен второму
выражение1 <> выражение2 Не равно. Результат - True, если первый операнд не равен второму
выражение1 = выражение2 Равно. Результат - True, если первый операнд равен второму

 

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

 

Таблица 10 - Операции отношения

Выражение условия Результат
25 <> 30 True (25 не равно 30)
25 < 30 True (25 меньше 30)
25 > 30 False (25 не больше 30)
TextBox1.Text = «Петров» True, если слово Петров является содержимым первого текстового поля, а в противном случае - False
Number >= 100 True, если переменная Number содержит значение не меньше 100, в противном случае False

 

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

 

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

 

Таблица 11 - Логические операции VBA

Операция Описание
(Операнд1) AND (Операнд 2) Логическое умножение. Возвращает True тогда, когда только оба операнда возвращают True
(Операнд 1) OR (Операнд 2) Логическое сложение. Возвращает True тогда, когда хотя бы один операнд возвращает True

Продолжение таблицы 11

Not [Операнд] Если условие имеет значение True, то результирующим значением будет False. Если условие имеет значение False, то результирующее значение будет True
[Операнд1] Xor [Операнд2] Если только одно из связываемых условий имеет значение True, то результирующее значение также будет True. Если оба условия имеют одинаковые значения, то результирующее значение будет False

 

2.6.5 Строковые операции

 

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

Синтаксис:

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

где

strВыражение – строковые выражения, которые могут быть любыми допустимыми строками (строковыми переменными, строковыми константами или функциями обработки строк).

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

Пример 1.

strMy = “Visual” & “Basic for Applications”

Примечание. Здесь объединяются две неименованные строковые константы. Результатом операции конкатенации будет значение Visual Basic for Applications).

 

2.7 Отладка программ и обработка ошибочных ситуаций

 

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

Первый вид ошибок связан с допущенными опечатками или с недостаточным знанием языка программирования. Система указывает на некоторые типы синтаксических ошибок при вводе текста программы, на другие типы синтаксических ошибок – при попытке выполнения программы. Как правило, количество синтаксических ошибок в программах резко сокращается по мере изучения языка программирования и приобретения опыта разработки программ.

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

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

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

Прежде всего, нужно отметить возможность простого обнаружения необъявленных переменных, что позволяет устранить большинство синтаксических ошибок. Способы идентификации логических ошибок состоят в установке точек останова (контрольных точек), пошаговом режиме выполнения отлаживаемой программы, наблюдении за значениями переменных и др. Имеется возможность создания обработчиков ошибок. Основные средства отладки доступны через меню Debug (Отладить).

Проще и быстрее выполнять отладочные операции с помощью панели инструментов Debug. Чтобы отобразить эту панель, нужно войти в меню View (Вид) выбрать команду Toolbars (Панели инструментов) и щелкнуть мышью по строке Debug.

Инструменты панели Debug слева направо имеют следующее назначение:

Run Sub/UserForm – Запуск программы/Формы

Break – Приостановка программы

Reset – Останов программы

Toggle Breakpoint – Включить/Выключить контрольную точку

Step Into – Пошаговая обработка с заходом в процедуры

Step Over – Пошаговая обработка без захода в процедуры

Step Out – Выход из процедуры

Locals Window – Включить/Выключить локальное окно

Immediate Window – Окно непосредственного выполнения

Watch Window – Включить/Выключить окно наблюдаемых переменных

Quick Watch – Быстрый просмотр значения переменной

Call Stack – Просмотр списка вызова процедур.

Как видно из рисунков 12 и 13, некоторые инструменты панели Debug дублируют или взаимосвязаны с меню Debug.

 

 

Рисунок 12 – Меню Debug

 

 

Рисунок 13 – Панель инструментов Debug

2.7.1 Отладка

 

При выполнении программы, если компилятор встречается с проблемами и не может их разрешить, он выводит на экран сообщение об ошибке, изображенном на рисунке 14, дающее пользователю возможность либо отладить программу, либо завершить ее работу. Если выбрать команду Run Sub/UserForm, на экран будет выведено кодовое окно, в котором строка, являющаяся причиной проблемы, будет выделена, как на рисунке 15.

 

 

Рисунок 14 – Сообщение об ошибке на экране

 

 

Рисунок 15 – Выбор команды Run Sub/UserForm

 

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

В такой ситуации доступны несколько опций.

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

2 Можно запустить программу с другого места, щелкнув по другой строке, выбрав в меню Debug команду Set Next Statement и нажав клавишу F5. Однако эта опция обычно не приводит к успеху, поскольку она может нарушить логику программы.

3 Можно завершить программу, выбрав в меню Run команду Reset.

 

2.7.2 Точки останова (контрольные точки)

 

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

1 Щелкнуть мышью в той строке кода, в которой требуется остановить выполнение программы, и нажать клавишу F9.

2 Вставить точку останова из меню Debug, выбрав в нем пункт Toggle Breakpoint (Установить точку останова).

Строка, на которой будет установлена точка останова, выделится красным цветом. Запущенная программа прервется на этой строке, после чего строка будет выделена желтым цветом и обозначена стрелкой, как показано на рисунке 16. Имея прерываемую таким способом программу, легко проверять значения переменных, перемещаться строка за строкой по коду, делать небольшие изменения в коде или продолжать работу программы, нажимая клавишу F5.

Точка останова может быть отменена щелчком мыши по строке, содержащей точку останова, или повторным нажатием клавиши F5. Для отмены всех точек останова нужно войти в меню Debug и выбрать команду Clear All Breakpoints (Убрать все точки останова).

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

 

 

Рисунок 16 – Строка, на которой установлена точка останова

2.7.3 Наблюдение за данными с помощью просматриваемых значений

 

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

1 Установить контрольную точку на той строке программы, которая содержит проверяемую переменную (клавиша F9).

2 Запустить программу, нажав клавишу F5 или выбрав команду Run Sub/UserForm.

3 Задержать на пару секунд указатель мыши над переменной, значение которой требуется просмотреть. Появится небольшое окно с текущим значением переменной, изображенным на рисунке 17.

 

 

Рисунок 17 – Окно с текущим значением переменной

 

Иногда необходимо отслеживать значения нескольких переменных. Для этого используется окно “Watches” (Наблюдаемые переменные). Последовательность действий может быть следующей.

1 Установить точки останова в тех строках кода, где находятся проверяемые переменные, как показано на рисунке 18. Нажать клавишу F5 для запуска программы.

2 В точке останова подсветить переменную, которую необходимо добавить к списку просматриваемых значений.

 

 

Рисунок 18 – Окно «Watches»

 

3 Щелкнуть правой кнопкой мыши и в появившемся контекстном меню на рисунке 19 выбрать команду Add Watch (Добавить наблюдаемую переменную).

4 В появившемся диалоговом окне “Add Watch” выбрать нужные установки: имя переменной (Expression), область видимости переменной (Context), тип наблюдения (Watch Type). Аналогично добавить другие наблюдаемые переменные и щелкнуть по кнопке <OK>, как показано на рисунке 20.

 

 

Рисунок 19 – Контекстное меню

 

 

Рисунок 20 – Окно для добавления наблюдаемых переменных

 

5 Для того чтобы отобразить окно “Watches”, показанному на рисунке 21, войти в меню View и выбрать команду Watch Window (Окно наблюдения).

 

 

Рисунок 21 – Окно «Watches»

 

2.7.4 Пошаговое выполнение программы

 

Пошаговое выполнение применяется для проверки каждой строки кода программы в порядке ее выполнения. Есть два режима такого выполнения: Step Into (пошаговая обработка с заходом в процедуры) и Step Over (Пошаговая обработка без захода в процедуры). В первом случае выполняются все строки программы, в том числе строки вызываемых процедур. Во втором случае вызываемые процедуры выполняются как один оператор, а затем выполняется следующая строка программного кода.

Последовательность действий по использованию панели Debug для отладки программы.

1 Открыть отлаживаемый проект.

2 В меню View выбрать команду ToolBars (Панели инструментов) и щелкнуть на строке.

3 Отобразить окно “Code”, в котором находится текст программы.

4 Щелкнуть на кнопке <Step Into> (Войти в инструкцию) на панели Debug для выполнения первого оператора в процедуре. Он будет выделен желтым цветом. Это выделение позволит далее проследить логику работы программы.

5 Будет выполнен оператор Sub, а следующий оператор будет выделен. Если в этом операторе есть проверяемая переменная, определяющая дальнейший ход программы, ее нужно поместить в окно “Watches” (Наблюдения). Это позволит видеть, как изменяется ее значение в ходе выполнения программы.

6 Выделить проверяемую переменную мышью, а затем щелкнуть по кнопке <Quick Watch> (Быстрый просмотр переменных) на панели Debug. На экране появится диалоговое окно, в котором будут содержаться имя переменной, ее значение, тип и назначение.

7 Выбрать в диалоговом окне команду Add. В нижней части экрана появится окно “Watches”, в котором будет отображена выбранная переменная. Аналогично в это окно можно поместить другие переменные, определяющие логику программы.

8 Щелкнуть по кнопке <Step Into> для выполнения следующего оператора и т.д.

Таким образом, в пошаговом режиме выполнения программы, наблюдая значения переменных в окне “Watches”, можно определить реальную логику программы и выявить ее отклонения от нужного алгоритма, т.е. обнаружить ошибку.

 

2.7.5 Обработка ошибок

 

Каждая ошибка в VBA имеет свой код. В таблице 12 приведены коды наиболее часто встречаемых ошибок.

 

Таблица 12 - Основные коды ошибок в VBA

Код ошибки Сообщение
Приложение не запущено
Переполнение
Не хватает памяти
Индекс выходит за пределы допустимого диапазона
Деление на нуль
Несоответствие типа
Произошло прерывание, вызванное пользователем
Неправильное имя файла или идентификатор
Файл не найден
Неверный режим работы с файлом
Файл уже открыт
Ошибка ввода/вывода
Переполнение диска
Устройство недоступно
Диск не готов
Повреждена поверхность диска

Продолжение таблицы 12

Невозможен доступ к системным ресурсам
Истек срок действия данного файла. Программе требуется файл более новой версии
Ошибка принтера

Лабораторная работа № 1

Программирование алгоритмов линейной структуры

Цель: приобретение навыков программирования алгоритмов линейной структуры с помощью подпрограммы-функции, вычисляющей значение арифметических выражений. Индивидуальные варианты лабораторной работы № 1 представлены в таблицах 13, 14 (2 часа).

 

Таблица 13

№ В Варианты индивидуальных заданий
Разработать функцию пользователя, вычисляющую значение арифметического выражения в заданных точках
; а=0.83, х=1.2
; а=0.12, х=0.36
; a=0.394, b=0.124, x=0.842
; a=0.124, b=1.14, x=2.125
; a=0.343, x=0.834
; a=0.334, x=1.256

Продолжение таблицы 13

; x=0.104, a=4.213
; x=0.117, a=2.346
; b=0.2, x=0.114
; x=2.512, a=0.135
; x=2.126, b=2.438, a=0.324
; x=0.834, b=0.242, a=0.125
; a=0.344, x=0.125
; a=2.124, b=0.835, a=0.54
; a=0.344, b=1.124, x=0.455

 

Продолжение таблицы 13

; x=0.345, a=1.242
; x=0.117, a=0.832
; a=0.124, b=0.338, x=0.817
; a=0.274, b=0.392, x=0.736
; b=0.614, a=0.125, x=1.23

 

Таблица № 14

№ В Варианты индивидуальных заданий
Разработать экономическую функцию пользователя
Рассчитать темп инфляции, если известен индекс цен прошлого года и текущего года т=((ид.т.г-ид.п.г)/ид.т.г)*100
Вычислить доход на акцию по формуле: Y=(D/P)*100 где Y - доход на акцию; D - дивиденд; P - цена приобретения.

 

Продолжение таблицы 14

Рассчитать индекс совокупной факторной производи­тельности (SFP), если известны: SFP=UZP/(SP+A+M). SP - фонд зарплаты рабочих и служащих; А - сумма амортизационных отчислений т.г. в неиз­менных ценах того года, когда было приобретено оборудо­вание; UZP - объем условно-чистой продукции; M - стоимость.
Вычислить сумму оборотных средств S=VP/360*(D1-D2) где VP - валовый национальный продукт; D1- прогнозированная длительность оборота; D2- фактическая длительность в днях.
Рассчитать прибыль от вложенного в производство капитала за периоды от 1 до 5 лет по формулам: Vp=Vt/(1+r)t; r=d/k*100% где Vp - будущая стоимость сегодняшней суммы денег; Vt - сегодняшняя стоимость будущей суммы денег; r - ставка процента; t - количество лет; k - капитал; d - доход на капитал.
Налогооблагаемый оборот фирмы составил: по производству непродовольственных товаров (ставка налога na=20%)-a=1340000 р; выпуску продовольственных товаров (ставка налога nb=10%)-b=460000 р; транспортным услугам (ставка налога nc=16.67%) c=200000 р; общественному питанию (ставка налога nd=9.09%)-d=100000 р. Рассчитать среднюю ставку налога ch=(na*a+nb*b+nc*c+nd*d)/(a+b+c+d)*100
Начислить зарплату рабочему предприятия, используя следующие данные: месячный оклад, количество рабочих дней в феврале месяце и количество отработанных рабочим дней. З=О/Д*Рд где З - зарплата за месяц; О - месячный оклад; Д - рабочие дни в феврале; Рд - количество отработанных дней.

 

 

Продолжение таблицы 14

Коммерческий банк выдал краткосрочный кредит юридическому лицу на сумму 200 млн.р. под 10% годовых. Составить программу, вычисляющую годовую процентную ставку за кредит, если известно, что общее число платежей за год (m) равно 12, общая сумма процен­та (ch) - 20000000 р., а реальное число сделанных вкладов равно 10. Формула вычисления годовой процентной ставки: apr=2*mch/(p*(n+1)).
Рассчитать прибыль фирмы на единицу продукции (p) по формуле: P = c-(a+z1+z2)/b где c - цена единицы продукции; a - амортизационные отчисления; z1 - постоянные затраты; z2 - переменные затраты; b - выпуск продукции; при постоянных затратах 100000.
Составить программу для вычисления коэффициента экономической эффективности, используя следующую формулу: K=(S1-S2)/(K1-K2) где S1 и S2 - себестоимость до и после внедрения; K1 и K2 - капитальные вложения до и после внедрения.
Рассчитать себестоимость продукции растениеводства, которая вы­числяется по формуле: с=t+z+u+s где с - себестоимость продукции; т - транспортные издержки; s - стоимость посадочного материала; z - зарплата рабочим.
Вычислить рыночную стоимость облигации по формуле PV = P/EXP(N*LN(1+R)) где Р - государственная стоимость; R - биржевая стоимость.
Рассчитать годовую производственную мощность выработки муки мелькомбинатом по формуле: M=MS*B*P/100(тонн/год) где М - годовая мощность; B - выход муки,%; P - годовой рабочий период в днях; MS - суточная мощность: MS=R*H/1000, где R-размер рабочих органов машины; H-техническая норма нагрузки на единицу рабочего орга­на машины, кг.

Продолжение таблицы 14

Вычислить уровень инфляции, которая вычисляется по формуле: R=цены текущего периода-цены прошлого периода/цены прошлого периода*100%, если известны: a - цены текущего периода; b - цены прошлого периода; где R-уровень инфляции.
Подсчитать скорость обращения денег (v) в кругообороте дохо­дов, которая вычисляется по формуле: V=P*S/M где M=38526000 - предложение денег; P=12865.7 - средняя цена товаров; S=2976 - общий объём товаров.
Подсчитать средние общие издержки фирмы, используя формулы: A=F+V, F=T/Q, V=N/Q где А - средние общие издержки фирмы; F - средние постоянные; V - средние переменные; T - сумма постоянных издержек; N - сумма переменных издержек; Q - количество произведенной продукции.
Вычислить темп инфляции этого года по формуле: T=(IN-IP)*100/IP где IN - индекс цен этого года=113.6; IP - индекс цен прошедшего года=118.3; Ответ должен быть в процентах.
Вычислить показатель ценовой эластичности спроса Ep, исполь­зуя следующую формулу: Ep=(Q1-Q2)/(P1-P2), где Q1,Q2 - величина спроca (%); P1, P2 - прирост цены (%).

 

Продолжение таблицы 14

Рассчитать валовые издержки по формуле: TC=FC+VC где TC - валовые издержки; FC – постоянные издержки; VC - переменные издержки. Рассчитать прибыль фирмы по формуле: P=C-((A+Z1+Z2)/B) где A – амортизация; B – продукция; C – цена; P – прибыль; Z1 - постоянные издержки; Z2 - переменные издержки.
Какой доход получит владелец акции, если ее номинальная сто­имость составляет 250 р., цена приобретения - 1000 р., а диви­денд - 100 р. Y=(D*100)/P где Y-доход на акцию; D-дивиденд; P-цена приобретения.

 

2.8 Условный оператор

 

Условный оператор VBA позволяет проверить некоторое условие и в зависимости от результатов проверки выполнить то или иное действие. Таким образом, условный оператор – это средство ветвления вычислительного процесса.

В VBA существует 2 типа условного оператора: линейный и блочный.

1 Линейный условный оператор используется для того, чтобы выполнить какой-либо один оператор, если некоторое условие будет истинным.

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

Структура безальтернативного условного оператора (сокращенный вариант):

If <условие> Then <оператор 1>

Структура альтернативного условного оператора (полный вариант):

If <условие> Then <оператор 1> Else <оператор 2>

где

If, Then, Else - зарезервированные слова (если, то, иначе);

<условие> - произвольное выражение логического типа;

<оператор 1>, <оператор 2> - любые операторы языка VBA.

Работа. Вначале вычисляется условное выражение <условие>. Если результат есть True (истина), то выполняется <оператор 1>, а <оператор 2> пропускается. Если результат есть False (ложь), наоборот, <оператор 1> пропускается, а выполняется <оператор 2>.

2 Блочный условный оператор используется в случае истинности условия необходимо выполнить несколько программных операторов (блок операторов). Блочный оператор имеет две формы: безальтернативный, альтернативный.

Структура безальтернативного блочного оператора (сокращенный вариант)

If <условие> Then

<оператор1>

<оператор2>

…………….

<оператор n>

End If

где

End If - указывает на окончание блока оператора If.

Структура альтернативного блочного оператора:

If <условие> Then

<оператор1>

<оператор2>

…………….

<оператор n>

Else

<оператор1>

<оператор2>

…………….

<оператор n>

End If

Пример 1.

Постановка задачи. Создать в стандартном модуле пользовательскую процедуру вычисления уравнения вида ax2 + bx + c = 0.

Технология выполнения задания:

1 Исходные данные:

a, b, c Î R

Результат: х1, х2 Î R.

2 Набрать в стандартном модуле проекта следующую пользовательскую процедуру:

Private Sub yravnenie ()

a = InputBox("a=", a)

b = InputBox("b=", b)

c = InputBox("c=", c)

d = b ^ 2 - 4 * a * c

If d >= 0 Then

x1 = (-b + Sqr(d)) / (2 * a)

x2 = (-b - Sqr(d)) / (2 * a)

MsgBox (x1)

MsgBox (x2)

Else

MsgBox ("Решений нет")

End If

End Sub

3 Вычислить корни квадратного уравнения при произвольных исходных данных.

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

Операторы IF могут быть вложенными друг в друга. Такое вложение операторов применяется, если нужно проверить какое-либо условие при другом условии, которое является истинным.

Формат вложенного оператора If:

If <условие1> Then

If <условие2> Then

<оператор1>

<оператор2>

…………….

<оператор n>

Else

<оператор1>

<оператор2>

…………….

<оператор n>

End If

End If

Пример 2.

Постановка задачи. Создать в стандартном модуле пользовательскую функцию нахождения максимального среди трех заданных чисел y1 = a+2*b; y2 = a*b+c; y3 = c2 + 1.

Технология выполнения задания:

1 Исходные данные:

a, b, c Î R

Результат: Max Î R.

2 Набрать в стандартном модуле проекта следующую пользовательскую функцию:

Function Max(a,b,c)

y1 = a+2*b

y2 = a*b+c

y3 = c^2+1

If y1 > y2 Then

If y1 > y3 Then y = y1 Else y = y3

Else

If y2 > y3 Then y = y2 Else y = y3

End If

End Function

3 Вычислить корни квадратного уравнения при произвольных исходных данных.

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

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

Формат записи:

If <условие1> Then

<оператор1>

ElseIf <условие2> Then

<оператор2>

Else

<.оператор3>

EndIf

Пример 3.

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

 

Таблица 15 - Правила расчета комиссионных

Объем продаж за неделю, р. Комиссионные, %
От 0 до 9999
От 10000 до 19999
От 20000 до 39999
Более 40000

Технология выполнения задания:

1 Исходные данные:

Продажи Î Z.

Результат: Комиссионные Î R.

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

Function Комиссионные (Продажи)

If Продажи <= 9999 Then

Комиссионные = Продажи * 0.08

ElseIf Продажи <= 19999 Then

Комиссионные = Продажи * 0.1

ElseIf Продажи <= 39999 Then

Комиссионные = Продажи * 0.12

Else

Комиссионные = Продажи * 0.14

End If

End Function

3 Вычислить.

Лабораторная работа № 2

Программирование алгоритмов разветвляющейся структуры

Цель: приобретение навыков программирования алгоритмов разветвляющейся структуры с помощью пользовательской подпрограммы-процедуры, где на определенном этапе производится выбор очередного выполняемого оператора в результате анализа некоторых условий. Индивидуальные варианты лабораторной работы № 2 представлены в таблицах 16, 17 (2 часа)

 

Таблица 16

№ В Варианты индивидуальных заданий
Разработать процедуру пользователя, вычисляющую значение функции
a=2.85, b=1.56, x=0.63
a=12.5, b=0.03, x=5.256
a=8.7, b=-5.2, x=8.1

 

 

Продолжение таблицы 16

x=1.204, a=0.8
a=3.08, x=-0.004
a=16.01, b=18.1, x=5.93

 

Продолжение таблицы 16