Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Типы данных, переменные, константы



Занятие 2

Типы данных, переменные, константы

Основные типы данных VBA: Byte (байт), Boolean (логическое), Integer (целое), Long (длинное целое), Single (с плавающей точкой обычной точности), Double (с плавающей точкой двойной точности), Date (дата), Object (ссылка на объект), String (строка). Тип Variant VBA использует как тип по умолчанию.

Переменные в программах объявляются с помощью инструкции:

Dim ИмяПеременной [ As ИмяТипа ] [, ИмяПеременной [ As ИмяТипа ]]

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

только z будет иметь тип Integer, а x и y – Variant.

Ключевое словоDim в объявлении переменной означает, что эта переменная – локальная. Если переменная объявлена внутри процедуры, то она доступна только в этой процедуре. Если переменная объявлена в разделе глобальных объявлений модуля (перед первой процедурой), то она может использоваться всеми процедурами этого модуля, но для других модулей такая переменная все равно будет «невидимой».

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

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

Переменные в программах на VBA можно не объявлять. В этом случае они по умолчанию имеют тип Variant. Как уже говорилось, подобный стиль программирования может приводить к трудно обнаруживаемым ошибкам. Если добавить в качестве первой строки модуля инструкцию Option Explicit, то при обнаружении в этом модуле необъявленной переменной будет выводиться сообщение об ошибке.

Константы в VBA объявляются с помощью слова Const. Ниже приведено несколько примеров:

VBA автоматически определяет тип константы по ее значению, но тип можно указать и явно, как это сделано в последнем примере. Если вы хотите объявить глобальную константу, то, как и для переменных, следует использовать слово Public.



Работа со строками

В VBA при работе с текстом используется тип String. Для строк фиксированной длины количество символов в строке указывается при объявлении переменной после символа звездочка. Если при присваивании фактическая длина строки будет меньше, то строка дополняется пробелами справа, если больше – то сохраняются первые символы строки, лишние символы в конце строки теряются. Для строк переменной длина не указывается. В следующем примере строка Name имеет длину 20 символов, а Text – переменную длину:

Основная операция над строками – конкатенация, т.е. слияние двух строк в одну. Для обозначения операции используется символ конкатенации & или оператор +. В случае использования & операнд, имеющий числовой тип, автоматически преобразуется в строку. При использовании оператора + этого не происходит. Например, если переменная X имела значение 2, значением выражения "Элемент " & X будет строка " Элемент 2", а при вычислении выражения "Элемент " + X возникнет ошибка.

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

Функция

Описание

Str(число)

Возвращает значение, являющееся строковым представлением числа.

Format(выражение [, формат])

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

CStr(выражение)

Возвращаемое значение зависит от выражения. Если выражение имеет тип Boolean, то возвращается строка "True" или "False". Если тип выражения Date, то – строка в кратком системном формате даты. Для других числовых типов возвращается строка, содержащая число.

Обратное преобразование из строкового представления в другой тип можно выполнить с помощью функций CBool, CByte, CCur, CDate, CDbl, CDec, CInt, CLng, CSng, Cvar. Они преобразуют выражение, заданное в качестве аргумента, в значение соответствующего типа. Выражение может быть строковым или числовым. Можно также использовать функцию Val(строка), которая возвращает для заданного аргумента числовое значение с подходящим типом данных.

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

В VBA существуют следующие функции для работы со строками:

Функция

Описание

Asc(строка)

Возвращает код первого символа строки.

Chr(кодСимвола)

Возвращает символ, соответствующий указанному коду.

LCase(строка)

Возвращает строку, преобразованную к нижнему регистру.

UCase(строка)

Возвращает строку, преобразованную к верхнему регистру.

Left(строка, длина)

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

Right(строка, длина)

Возвращает строку, содержащую указанное число последних символов исходной строки.

Mid(строка, позиция [, длина ])

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

LTrim(строка)

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

RTrim(строка)

Возвращает копию строки, из которой удалены пробелы, находившиеся в конце строки.

Trim(строка)

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

Len(строка)

Возвращает число символов в строке.

InStr([ позиция,] строка1, строка2 [, 0/1])

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

StrComp(строка1, строка2 [, 0/1])

Возвращает: –1, если строка1 < строка2; 0, если строка1 = строка2; 1, если строка1 > строка2. Последний аргумент задает способ сравнения строк (см. InStr).

String(длина, символ)

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

Space(число)

Возвращает строку, содержащую указанное число пробелов.

При сравнении строк нужно обращать внимание на регистр символов. Например, "Москва" и "МОСКВА" – это одинаковые строки или нет? В зависимости от ситуации ответ на этот вопрос будет разным. В VBA способ сравнения строк определяется инструкцией Option Compare. В режиме Option Compare Binary сравниваются коды символов строк (по умолчанию), в режиме Option Compare Text строки сравниваются посимвольно без учета регистра.

Для сравнения строк используются как обычные операторы сравнения <, >, =, <=, >=, <>, так и специальный оператор сравнения строк Like. В последнем случае образец может содержать подстановочные знаки (? – любой одиночный символ, * – любое количество символов или отсутствие символа, # – любая одиночная цифра (0–9), [список] – любой одиночный символ, входящий в список, [!список] – любой одиночный символ, не входящий в список). Например, выражение X Like "[О-Я]*" будет истинно, если значе-нием переменной X является любая строка, начинающаяся с русских букв от "О" до "Я".

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

Работа с датами и временем

В VBA существует специальный тип данных Date для работы со значениями дат и времени. Переменные типа Date сохраняются как 64-разрядные (8-байтовые) числа с плавающей точкой. Целая часть числа представляет значение даты, а дробная значение времени. Полночи соответствует значение 0.0, а полудню – значение 0.5. Отсчет дат начинается с 31 декабря 1899 г., так что нулевым днем является 30 декабря 1899 г. Отрицательные целые числа представляют даты до 30 декабря 1899 г. Диапазон возможных значений дат от 1 января 100 г. до 31 декабря 9999 г. и значения времени от 0:00:00 до 23:59:59.

Для явного указания дат в тексте программы их следует заключать в символы #. Конкретный формат даты зависит от настроек компьютера. Например, так можно задать дату 1 декабря 1930 г.: #12/1/30#. Обратите внимание, что сначала указан месяц, а затем день. Если год вводится не полностью (2 последние цифры), то VBA использует интервал лет между 1930г. и 2029г.

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

интервал

Определяет нужный компонент даты. Возможные значения параметра: "yyyy" – год, "q" – квартал, "m" – месяц, "y" – день года, "d" – день месяца, "w" – день недели, "ww" – неделя, "h" – часы, "n" – минуты, "s" – секунды.

первый_день

Определяет, какой день недели считать первым. Если он опущен, первым днем недели считается воскресенье. Возможные значения параметра: 0 – используется значение национальных системных установок, 1 – воскресенье (по умолчанию), 2 – понедельник, 3 – вторник, 4 – среда, 5 – четверг, 6 – пятница, 7 – суббота.

первая_неделя

Определяет, какая неделя считается первой неделей года. Возможные значения параметра: 0 – используется значение национальных системных установок, 1 – неделя, которая содержит 1 января (по умолчанию), 2 – первая неделя, которая содержит, по крайней мере, четыре дня нового года, 3 – первая полная неделя года.

 

Функции для работы с датами и временем:

Функция

Описание

Date

Возвращает значение, содержащее текущую системную дату.

Time

Возвращает значение, содержащее текущее системное время.

Now

Возвращает значение, содержащее текущую дату и время по системному календарю и часам компьютера.

Hour(время)

Возвращает целое число (от 0 до 23 включительно), которое представляет часы в значении времени.

Minute(время)

Возвращает целое число (от 0 до 59 включительно), которое представляет минуты в значении времени.

Second(время)

Возвращает целое число (от 0 до 59 включительно), которое представляет секунды в значении времени.

Day(дата)

Возвращает целое число (от 1 до 31 включительно), которое представляет день месяца в значении даты.

Month(дата)

Возвращает целое число (от 1 до 12 включительно), которое представляет месяц в значении даты.

Year(дата)

Возвращает целое число, представляющее год в значении даты.

Weekday(дата, [ первый_день ])

Возвращает целое число (от 1 до 7), представляющее номер дня недели в значении даты.

DatePart(интервал, дата [, первый_день [, первая_неделя ]])

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

DateSerial(год, месяц, день)

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

TimeSerial(часы, минуты, секунды)

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

DateDiff(интервал, дата 1, дата 2 [, первый_день [, первая_неделя ]])

Возвращает разность между двумя датами (дата 2 – дата 1) в заданных интервалах (годах, днях, неделях, кварталах и т.д.). Если значение нецелое, то оно округляется с избытком. Поэтому при сравнении дат 31 декабря и 1 января следующего года функция для интервала типа год ("yyyy") возвращает значение 1, хотя разница между датами составляет всего один день.

DateAdd(интервал, количество, дата)

Возвращает новую дату, которая получена путем добавления к указанной дате заданного количества интервалов. Например, DateAdd("m", 1, "31-янв-04") возвратит дату "29-фев-04".

 

Пример 2.2. Функция, вычисляющая последний день месяца для указанной даты.

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

Пример 2.3. Функция, которая для заданной даты определяет дату ближайшего понедельника. Если дата приходится на понедельник, то выдается та же самая дата.

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

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

Реализация разветвляющихся алгоритмов

Разветвленные алгоритмы предусматривают выполнение различных инструкций в зависимости от выполнения или невыполнения некоторых условий. Для реализации таких алгоритмов в программах на VBA используются инструкции IF и Select Case. Однако сначала рассмотрим, как можно задать условие в программах на VBA.

С точки зрения синтаксиса условие – это логическое выражение, т.е. выражение, имеющее значение True или False. В простейшем случае это результат операции сравнения: меньше (<), больше (>), меньше или равно (<=), больше или равно (>=), равно (=), не равно (<>), соответствие строки маске (Like), сравнение объектов (Is).

Используя скобки и логические операции «И» (AND), «ИЛИ» (OR), отрицание (NOT), импликация (IMP), эквивалентность (EQV), исключающее «ИЛИ» (XOR) из простых выражений можно составить более сложные. В этих выражениях можно также использовать логические переменные и функции, возвращающие логические значения. Полное описание операций можно найти в справочной системе редактора VBE. Проще всего для этого воспользоваться контекстной справкой. Для получения контекстной справки установите курсор в тексте программы на нужной синтаксической конструкции и нажмите клавишу F1. Ниже приведены примеры логических выражений:

В VBA существуют две разновидности инструкции IF: линейная и блочная. Линейная форма IF предполагает, что вся конструкция размещается на одной строке. Инструкция имеет следующий синтаксис:

If условие Then инструкции [ Else инструкции ]

Если условие имеет значение True, то выполняются инструкции, указанные после Then, в противном случае – инструкции, указанные после Else. Секция Else может отсутствовать, в этом случае при невыполнении условия ничего не делается. Если после Then или Else нужно написать несколько инструкций (но все в одной строке), то они разделяются двоеточием. Примеры линейной инструкции If:

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

If условие Then

инструкции

[ ElseIf условие Then

инструкции ]

[ Else

инструкции ]

End If

Выполнение инструкции начинается с проверки первого условия. Если оно истинно, то выполняется первая группа инструкций, после чего программа перейдет к выполнению инструкций, следующих за End If. Если первое условие ложно, то проверяется второе условие и так далее. Количество секций ElseIf может быть любым. Инструкции в секции Else выполняются в том случае, если все условия оказались ложными. Секции ElseIf и Else могут отсутствовать. Заканчивается блочный IF всегда конструкцией End If в отдельной строке. Такая форма инструкции IF позволяет запрограммировать любые ветвления. Среди инструкций, использующихся внутри IF, могут быть другие инструкции IF или циклы.

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

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

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

В данном примере использованы вложенные инструкции IF.

Стандартная функция IsNumeric возвращает значение True, если ее аргумент является числом, и False — в противном случае. Обратите внимание, что в этом варианте тип возвращаемого значения функции не указывается специально, так как функция может возвращать что-то еще кроме числа.

Функция CVErr преобразует код ошибки в настоящую ошибку, которая обрабатывается Excel так же, как ошибки, возникающие при вычислении встроенных функций Excel. Константа xlErrValue соответствует ошибке #ЗНАЧ!. Другие константы ошибок: xlErrDiv0 (для ошибки #ДЕЛ/0!), xlErrNA (для ошибки #Н/Д), xlErrName (для ошибки #ИМЯ?), xlErrNull (для ошибки #ПУСТО!), xlErrNum (для ошибки #ЧИСЛО!), xlErrRef (для ошибки #ССЫЛ!).

 

Для реализации выбора из нескольких вариантов также применяется инструкция Select Case, которая позволяет выполнять одну из нескольких групп инструкций в зависимости от значения выражения:

Select Case выражение

[ Case списокВыражений

инструкции ]...

[ Case Else

инструкции ]

End Select

Анализируемое выражение указывается в первой строке после Select Case, в частном случае это может быть просто переменная. Тип выражения должен быть совместим с типом значений в строках Case. Управление получит та Case-строка, чье значение совпадет со значением анализируемого выражения. Значения в строках Case можно указывать явно (в том числе в виде списка через запятую), можно задать диапазон (используется ключевое слово To), можно использовать операторы сравнения (значение анализируемого выражения в этом случае обозначается словом Is). Секция Case Else используется для всех остальных значений.

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

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

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

1.1. Преобразовать строку вида "Иванов И.И." в строку " И.И. Иванов";

1.2. Аргументом функции является строка, у которой в произвольном месте может встречаться название города. Перед названием города всегда стоит "г.", после – запятая (например, "Московская обл. г. Троицк, ул. Лесная, д. 5, кв. 77"). Функция должна выделить из исходной строки название города;

1.3. Функция по номеру года определяет, сколько дней в этом году: 365 или 366. Первый вариант функции должен использовать следующий факт: для високосных годов номер года делится на 4, но, если номер года оканчивается двумя нулями, то он не является високосным, если не делится на 400.

Второй вариант функции должен использовать стандартные функции работы с датами, например, проверять, есть ли в этом году 29 февраля.

1.4. Функция находит максимальное из 3 чисел;

1.5. Функция переводит оценку из 100-бальной системы в пятибалльную по правилам, принятым в университете;

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

· исключение: если число оканчивается на 11, 12, 13 или 14, добавляем слово «рублей»;

· если число оканчивается на 1, добавляем слово «рубль»;

· если число оканчивается на 2, 3 или 4, добавляем слово «рубля»;

· если число оканчивается на цифры 5, 6, 7, 8, 9 или 0, добавляем слово «рублей».

 

 


Дата добавления: 2015-11-04; просмотров: 76 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
В объектно-ориентированном программировании объект обычно определяется через понятие класс. Класс – это сложный тип, объединяющий данные и программы для их обработки, а объект – это переменная этого | Сифилис – общее инфекционное заболевание, вызываемое бледной трепонемой, склонное к хроническому рецидивирующему течению с характерной периодизацией клинических симптомов, способное поражать все

mybiblioteka.su - 2015-2024 год. (0.029 сек.)