Visual basic for applications (vba)

Вид материалаДокументы

Содержание


Глава 6.2 Основы программирования на УВ6
Использование констант
Object Browser
Const константа [As тип] = значение
Типы данных Object и Variant
Tim Variant
Простейшие конструкции и операторы
Результат: ОШИБКА
Конструкции управления
If условие Then оператор
If условие Then Операторы End If
If условие Then
If условие1 Then
IIf(условие, значение1, эначение2
Dim intA As Integer, strA As String
Select Case переменная Case значени1
Разновидности циклов
Do Until условие Операторы
Do While условие
Do Операторы Loop Until условие
...
Полное содержание
Подобный материал:
1   2   3   4   5

Глава 6.2 Основы программирования на УВ6

Работа с переменными


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

Dim переменная [As mun]

В этом операторе:

Dim - ключевое слово, свидетельствующее о том, что осу­ществляется объявление переменной;

As - служебное слово, используемое при обозначении типа данных для объявляемой переменной;

Переменная — имя переменной, которая объявляется;

Тип - тип данных для указанной переменной.

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

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

Существует несколько ограничений на имена используемых в программе переменных:

• имя должно начинаться только с латинской буквы;

• в имени не должно быть точек, пробелов и русских букв;

• необходимо соблюдать уникальность имен переменных в рамках одной рассматриваемой процедуры:

• количество символов в имени не должно быть более 255. -


415

Зачастую для повышения информативности используемых переменных программисты используют в именах так называе­мые префиксы, которые определяют принадлежность сохраняе­мых в них данных к определенному типу (см. табл. 6.5).



В том случае, когда при описании переменной программист не указывает тип данных, например:

Dim Variable

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


416

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




417

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

Private переменная [As тип]

Static переменная [As тип]

Public переменная [As тип]

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

В том случае, когда переменная объявляется с ключевым сло­вом Dim, то это означает, что областью ее использования будет только та процедура, в которой она была описана. Такие пере­менные называются локальными (закрытыми). При этом после выполнения данной процедуры их значения будут потеряны. Эти переменные удобно использовать, к примеру, в качестве счетчи­ков циклов. Если в нескольких процедурах необходимо выпол­нять циклы, то счетчикам для них можно давать одно и то же имя, например, intCounter. В этом случае не будет возникать конфликт имен, который происходит, когда в программе объяв­ляются несколько переменных с одними и теми же именами, имеющими одинаковую область видимости.

Когда объявление переменной в процедуре осуществляется при помощи ключевого слова Static, то она также будет локальной. Отличие от оператора Dim заключается в том, что в этом случае после очередного выполнения данной процедуры ее последнее зна­чение не будет потеряно. Этот оператор удобно использовать при необходимости сохранения значения какой-либо локальной пере­менной после очередного выполнения процедуры.

Если нужно, чтобы значение переменной было доступно в не­скольких процедурах одного модуля, то в этом случае следует использовать оператор Private. Причем объявление перемен­ной необходимо осуществлять в разделе Declarations теку­щего модуля (см. рис. 6.14).


418



Когда нужно использовать какую-либо переменную, которая доступна всем модулям данного проекта, то ее следует объявлять с использованием ключевого слова Public.

Такие переменные называются глобальными (открытыми) и являются противоположностью тех, которые объявляются опера­тором Private. Глобальные переменные также должны описы­ваться в разделе Declarations открытого модуля.

Существует еще один способ объявления переменных, при котором вместо ключевого слова As с последующим указанием типа используется так называемый суффикс типа данных, кото­рый добавляется в конец имени описываемой переменной. Пере­чень всех суффиксов и соответствующих им названий типов при­веден в табл. 6.7.




419

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

Public Counter%.

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

Использование констант


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

Существует две разновидности констант: встроенные и поль­зовательские. Встроенные константы Visual Basic предлагаются самой системой и предназначены для хранения самой разнооб­разной информации: коды "горячих" клавиш, используемые цве­та и т. д. Все они имеют префикс vb, например: vbWhite.

Для того чтобы уточнить значение той или иной встроенной константы, а также ее название, следует открыть окно Object Browser, в котором можно найти всю необходимую информацию (см. рис. 6.15). Для этого необходимо или нажать соответствую­щую кнопку на стандартной панели инструментов, или выбрать команду Object Browser в меню View, или нажать клавишу F2.

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

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

Const константа [As тип] = значение

В этом операторе:

Const - ключевое слово, которое показывает, что осуществ­ляется объявление константы;


420



As - ключевое слово для обозначения типа данных объявляе­мой константы;

Константа - имя описываемой константы;

Тип - тип данных для объявляемой константы;

Значение - присваиваемое константе значение указанного типа. Ниже приведены примеры объявления констант различных

типов:

Const bInFlag As Boolean = False

Const intMax As Integer = 1024

Const stxMessage = "Завершение работы"

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

Const intMin = 0, intMax = 1000

При объявлении констант их область видимости задается ана­логично переменным. Если константа была создана в процедуре,


421

то областью ее видимости является только эта процедура. В слу­чае необходимости доступа к константе из всех процедур модуля ее нужно объявлять в разделе Declarations данного модуля, ука­зывая в начале оператора ключевое слово Private. Если же требуется обеспечить доступ к константе из всех процедур про­екта, то при ее объявлении в разделе Declarations следует исполь­зовать ключевое слово Public. Например:

Private Const intMax = 4096 Public Const intMin = 1024

Типы данных Object и Variant


Тип Object.

В том случае, когда необходимо работать с различными объ­ектами, удобно использовать тип Object (объектный). Пере­менная данного типа содержит ссылку на тот или иной объект разрабатываемого приложения или других приложений и пред­ставляет собой 4-байтный адрес соответствующей области памя­ти. Присвоение объектной переменной какого-либо значения выполняется при помощи оператора Set. Например:

Dim objA As Object Set objA = Labell

В приведенном примере переменной objA присваивается ссылка на объект-метку Labell, принадлежащий одному из стандартных классов Visual Basic, а именно: классу Label. В подобных случаях, когда для описания объекта используется не созданный разработчи­ком, а уже имеющийся класс, при объявлении переменной следует указывать стандартный тип:

Dim objA As Label objA = Labell

Перечень стандартных классов Visual Basic, а также их описа­ние и список свойств каждого класса можно найти в разделе Classes окна Object Browser (см. рис. 6.16).


422



Тип Variant.

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

Dim vntAny ' Tim Variant

vntAny = "144" ' Результат: строка "144"

vntAny = vntAny /12 ' Результат: число 12

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

Значение, которое присваивается переменной типа Variant, определяет способ его обработки при выполнении различных


423

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

Dim vntA ' тип Variant/Empty vntA = "5" ' тип Variant/String vntA = 5 ' типVariant/Integer vntA =5.5 ' тип Variant/Double

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

Например:

Dim vntA

Dim intCode As Integer

vntA = "7"

intCode = VarType(vntA) ' intCode = 8




424



В зависимости от полученного кода можно выполнять те или иные действия. Например, целочисленные значения в перемен­ных Variant хранятся как Integer. Если какое-либо из этих значений не выходит за пределы интервала, определяемого типом Byte, т. е. [0; 255], то для экономии памяти и повышения скоро­сти обработки можно осуществить преобразование к более ком­пактному типу (см. табл. 6.9):



Dim vntA ' Variant

vntA = 200 ' Variant/Integer

If VarType(vntA) = 2 Then

vntA = CByte(vntA) ' Variant/Byte

End If

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


425

верить, является ли преобразуемое значение числом (или строкой, которую можно представить как число), следует использовать функ­цию IsNumeric, которая возвращает значение True или False, в зависимости от результата проверки (см. табл. 6.10). Обычно IsNu-meric используется в управляющих конструкциях, как и рассмот­ренная выше функция VarType.



Помимо того, что переменные типа Variant могут хранить значения любого другого типа, для них предусмотрены еще три специальных значения:

Empty. Данное значение в начале выполнения программы ав­томатически присваивается переменной, объявленной как Variant, причем оно может трактоваться по-разному, в зависи­мости от того, в каком выражении присутствует рассматриваемая переменная. Если она используется при выполнении арифметиче­ской операции, то значение Empty эквивалентно нулю, т. е. О, если в строковом выражении - то пустой строке, т. е. "". Для того чтобы выяснить, содержит ли переменная типа Variant значе­ние Empty, следует использовать функцию IsEmpty, например:

Dim vntA ' vntA = Empty If IsEmpty(vntA) Then vntA = "" ' vntA = ""

Данное значение может быть присвоено в программе пере­менной типа Variant так же, как и любое другое, например:

vntA = Empty


426

Null. Это значение в большинстве случаев применяется при обработке баз данных и имеет несколько особенностей:

• если в каком-либо выражении одним из составляющих яв­ляется Null, то результатом всего выражения также будет Null, например:

Dim vntA ' vnfcA = Empty vntA = Empty + Null * 5 ' vntA = Null

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

Проверка на значение Null переменной типа Variant осу­ществляется функцией IsNull, которая аналогична функции IsEapty, рассмотренной выше.

Данное значение может быть присвоено только переменной типа Variant, например:

Dim vntA vntA = Null

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

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

Простейшие конструкции и операторы


Используемые символы. В языке Visual Basic при создании программ могут использоваться следующие символы:

• прописные и строчные буквы латинского и русского ал­фавитов;


427

• цифры от 0 до 9;

• знаки: . (точка), , (запятая), ; (точка с запятой), ' (апостроф), " (кавычки), ( ) (круглые скобки);

• символ пробела;

• знаки арифметических операций: + (плюс), - (минус), * (умножение), / (деление), (возведение в степень);

• знаки сравнения: < (меньше), > (больше), = (равно), <= (не больше, используется вместо знака ), >= (не меньше, ис­пользуется вместо знака ), <> (не равно, используется вместо знака  );

• знаки: @ (коммерческое "эт"), # (диез), $ (знак доллара), % (процент), & (амперсанд, или коммерческое "и"), \ (косая черта слева направо), _(знак подчеркивания), ! (восклицательный знак), ? (вопросительный знак).

Представление чисел. Числа в Visual Basic представляют со­бой последовательность цифр со знаком + или - (знак + обычно не употребляется), например: +7, -18, 32. Если в числе имеется дробная часть (т. е. десятичная дробь), то она отделяется от целой части точкой. При этом если целая часть равна нулю, то ее можно опустить, например: 0.5, -5. 68, -. 12. Описанная форма запи­си чисел носит название основной.

Кроме основной, возможна также запись чисел в экспоненци­альной форме (в форме с порядком). Например, десятичное число 0,0095 или его эквивалент 9,5 • 10-3 на языке Visual Basic может быть записано в следующем вице: 9. 5Е-4. Аналогичным обра­зом число 52000000 можно записать так: 52Е+6 или 52Е6. Ла­тинская буква Е и находящееся за ней число в данной форме за­писи называется порядком, перед которым обязательно должно быть записано число в основной форме. Вместо буквы Е при ука­зании порядка можно также использовать букву D, однако после компиляции этот символ будет автоматически исправлен на Е.

Арифметические выражения. При использовании в програм­ме каких-либо арифметических вычислений, их представление на языке Visual Basic схоже с математическим. Выражения могут содержать числа, переменные, функции, которые соединены между собой знаками арифметических действий (см. табл. 6.11).


428



Кроме обычных арифметических действий - сложения (+), вычитания (-), умножения (*), деления (/) и возведения в сте­пень (),- в языке Visual Basic можно также выполнять целочис­ленное деление (\) и определять остаток от деления при помощи оператора Mod. Например:

Листинг 6.1. Применение арифметических операторов.

Dim m, n, x m = 5 n = 2

x = m / n ' Результат; x = 2,5 x = m \ n ' Результат: х = 2 x = m Mod n ' Результат; x = 1

При наличии в выражении нескольких арифметических опера­ций порядок их выполнения определяется правилами приоритета:

1. возведение в степень ()

2. умножение и деление - обычное и целочисленное (*, /, \)

3. остаток от деления (оператор Mod)

4. сложение и вычитание (+, -)

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

Следует отметить тот факт, что в арифметических выражени­ях могут присутствовать величины различных типов, например,


429

складываются два числа: целое и вещественное. Результатом та­кого сложения будет величина вещественного типа, поэтому осо­бое внимание следует обращать на тип той переменной, которой он будет присвоен. Если в этом случае типы переменной и при­сваиваемого ей результата арифметического выражения не будут совпадать, например, переменная будет типа Integer, а значе­ние выражения - типа Single или Double, то после выполне­ния данного оператора значение переменной будет получено пу­тем автоматического округления результата.

В языке Visual Basic предусмотрена возможность преобразо­вания переменных из одного типа в другой при помощи специ­альных функций (см. табл. 6.9).

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

intNunber =15

strNumber = CStr(intNunber) ' Результат; "15"

strNumber = "2,5E1"

intNunber = Cint(strNunber) ' Результат; 25

Особое внимание следует обратить на то, что в строке, преоб­разуемой в число и содержащей как целую, так и дробную части, использование в качестве разделителя точки или запятой зависит от настроек в панели управления - раздел Язык и стандарты (см. рис. 6.17).

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

strNunber = "2.5E1" intNunber = Cint(strNunber) _ ' Результат; ОШИБКА


430



Данная ошибка также появляется тогда, когда значение пре­образуемой переменной не соответствует задаваемому типу. Например:

strNumber = "х1" intNumber = Cint(strNuinber) ' Результат: ОШИБКА

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


431



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

радианы = градусы •Пи /180

при вычислении арктангенса необходимо, чтобы аргумент на­ходился в пределах интервала: (-пи/2; пи/2).


432

При использовании стандартного датчика случайных чисел генерирует число в интервале [0; I], при этом аргумент х в функции Rnd можно опустить.

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

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

Листинг 6.2. Работа с логическими значениями

Dim х, у, blnА

х = 5

у = 2

blnА = х > у ' Результат: True

blnА = х < у ' Результат: False

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

В качестве функции одной переменной в Visual Basic высту­пает логическое отрицание (оператор Not), результатом выпол­нения которого является значение True, если параметр был ра­вен False, и наоборот, результат равен False, если параметр содержал значение True.




433

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

And. Действие "конъюнкция" (логическое "и").

Or. Действие "дизъюнкция" (логическое "или").

Хоr. Действие "двоичное сложение".

Imp. Действие "импликация".

Eqv. Действие "эквивалентность".

Ниже приведен пример применения всех описанных выше операторов.

Листинг 6.3. Иллюстрация использования логических функций

Dim х, у, z, blnА х = 1

у = 2

z = 3

'Оператор And

blnА = х > у And у > z ' Результат: False 'Оператор Not

blnА = Not(x < у) ' Результат: False 'Оператор Оr

blnА =xz ' Результат: True 'Оператор Хоr

blnА = х < у Хог у < z ' Результат: False 'Оператор Imp

blnА = х > у Imp у > z ' Результат: True 'Оператор Eqv

blnА = х < у Eqv у < z ' Результат: True

Конструкции управления


Зачастую в определенном месте программы необходимо вы­полнять те или иные операторы, в зависимости от некоторых условий. Эта возможность в Visual Basic реализуется при помощи так называемых управляющих конструкций (или структур), кото­рые в свою очередь состоят из структур принятия решений и циклов. Ниже приводится подробное описание двух существую­щих конструкций принятия решений.

Конструкция If ...Then. Существует несколько разновидно­стей данной структуры. Если при выполнении какого-либо усло-


434

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

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

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

Если при выполнении условия требуется выполнил, не один, а несколько операторов, то следует использовать такую конструкцию:


If условие Then Операторы End If

В случае истинности проверяемого условия будут выполнены операторы, расположенные после ключевого слова Then. С другой стороны, если условие является ложным, то выполняется следую­щий после данной конструкции оператор. В том случае, когда в блоке операторы находится только один оператор, то данная структура все равно должна заканчиваться служебным словосоче­танием End If.

При необходимости выполнения того или иного оператора (или блока операторов), в зависимости от результата проверки опреде­ленного условия, в языке Visual Basic следует использовать сле­дующую конструкцию:

If условие Then

операторы1 Else

операторы2

End If

или

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

End If


435

Если результатом проверки условия является значение True, то будет выполнен блок операторы1, находящийся после клю­чевого слова Then. С другой стороны, если проверка условия дала результат False, то будет выполнен блок операторы2, расположенный после служебного слова Else.

Во втором из приведенных вариантов в качестве блока опе­раторы2 может использоваться как один оператор (тогда он за­писывается после знака «:» в той же строке, что и служебное слово Else), так и несколько (при этом каждый оператор, начи­ная со второго, записывается в отдельной строке).

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

If условие1 Then

операторы1 Elself условие2 Then

операторы2

[Else

onepaтopы N] End If

Если условие1, находящееся после ключевого слова If ис­тинно, то выполняется блок операторы1, расположенный после Then. Если же оно ложно, то осуществляется проверка условия2, находящегося после служебного слова Elself, в случае его истинности выполняется блок операторы2 и т. д. Если ни одно из этих условий не является истинным, то есть результатом всех проверок является значение False, то выполняется блок операторыN, расположенный после ключевого слова Else (данный блок является необязательным).

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

IIf(условие, значение1, эначение2)


436

В том случае, когда результатом проверки условия является значение True, функция возвращает значение1, а когда про­верка дает значение False, то возвращаемый результат - значение2. Например:

Dim intA As Integer, strA As String

intA = 6

strA = IIf(intA Mod 2 = 0, _

"Четное", "Нечетное")

Если число intA делится на 2 без остатка, то строке strA будет присвоено значение "Четное", в противном случае -"Нечетное".

Конструкция Select Case. Когда существует несколько операторов (или блоков операторов), которые необходимо вы­полнять в случае истинности того или иного условия, то запись конструкции If...Then окажется достаточно громоздкой. Поэто­му в подобных случаях следует использовать структуру Select Case, которая улучшает читаемость программы. Ее общий вид выглядит следующим образом:

Select Case переменная Case значени1

операторы1 Case значение2

операторы2

[Case Else

операторыN] End Select

Если переменная содержит значение1, расположенное по­сле первого по порядку ключевого слова Case, то выполняется блок оператор1. С другой стороны, если содержимое пере­менной равно значению2, то выполняется блок операторы2 и т. д. Когда содержимое переменной не равно ни одному из при­веденных значений, то выполняется блок операторы N, находя­щийся после служебного словосочетания Case Else, которое является необязательным в рассматриваемой конструкции.


437

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

Select Case x Case I

x = x + 1

Case 2, 3, 4

x = 10 Case Else

x = 20 End Select

Разновидности циклов


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

В языке Visual Basic существует два основных вида циклов, которые реализуются при помощи конструкций For... Next и Do... Loop.

Цикл For... Next. Используется в том случае, когда количест­во повторов заданного блока операторов известно заранее. Дан­ная конструкция выглядит следующим образом:

For счетчик = нач. значение то кон. значение [Step шаг]

Операторы1 [Exit For]

Операторы2 Next [счетчик]

Когда приведенные операторы выполняются первый раз, то переменной-счетчику присваивается начальное значение, после чего возможны два варианта действий. Если в результате провер­ки условия счетчик > конечное и было получено значение True, то происходит завершение цикла, при этом блоки Опера­торы! и Операторы2 ни разу не выполняются. С другой сторо­ны, если результатом проверки условия является False, то в этом случае блоки операторов выполняются первый раз, после


438

чего происходит переход на начало цикла. Далее значение переменной-счетчика увеличивается на шаг, расположенный после ключевого слова Step (в случае его отсутствия устанавливается шаг = 1). После этого снова проверяется истинность условия счетчик > конечное значение и т. д., окончание цикла происходит в тот момент, когда результатом данной проверки станет значение True.

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

If условие Then Exit For

Если результатом проверки условия будет значение True, то выполнение цикла будет прекращено, причем блок Операторы1 будет выполнен очередной раз, а блок Операторы2 - нет.

Цикл Do—Loop. Применяется в том случае, когда число по­вторений операторов тела цикла заранее неизвестно. Существует четыре разновидности данной конструкции. При использовании первых двух цикл либо выполнится много раз, либо не выпол­нится вообще.

Do Until условие Операторы

Loop

Если результатом проверки условия является значение False, то блок Операторы выполняется, иначе осуществляется переход на оператор, расположенный после служебного слова Loop. С другой стороны, если первая проверка условия даст ре­зультат True, то цикл не выполнится ни разу.

Do While условие

Операторы Loop

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


439

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

Do

Операторы Loop Until условие

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

Do

Операторы Loop While условие

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

В том случае, когда необходимо прервать выполнение цикла, применяются разновидности оператора Exit, который распола­гается в конструкции принятия решения. При этом для цикла For... Next используется Exit For, а для любого из циклов Do... Loop применяется Exit Do. После выполнения данного оператора происходит немедленное завершение цикла без вы­полнения каких-либо дополнительных операций.

Если аварийное завершение было использовано в цикле For...Next, то значение переменной-счетчика останется таким, каким оно было в момент выхода, в отличие от нормального за­вершения работы цикла, когда оно становится на единицу больше заданного конечного значения. Приведенная особенность зачас­тую может быть использована при решении различных задач.

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

Листинг 6.4. Поиск в массиве первого положительного элемента

Dim intArray(l To 10) As Integer

Dim inti As Integer

Dim intResult As Integer

' Ввод элементов массива


440

For inti = 1 to 10

If intArray(intI) > 0 Then

intResult = intArray(intI) Exit For

End If Next

Теперь в переменной intl 'содержится значение индекса 'найденного элемента массива

Работа с массивами


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

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

Существует две разновидности массивов: статические и ди­намические.

Статические массивы. При объявлении такого массива зна­чения его верхней и нижней границ не могут быть изменены в программе.

Данный вид массивов описывается в программе так же, как и переменные - при помощи одного из служебных слов: Dim, Pri­vate, Public или Static с последующим указанием типа по­сле служебного слова As. При этом может быть указана как верхняя граница, так и обе границы одновременно, например:

Dim arrA(9) As Byte Dim arrB(l To 10) As Byte

В данном случае оба массива содержат одно и то же количе­ство элементов одинакового типа. Однако нумерация элементов аггА начинается с нуля, в то время как нумерация arrB - с еди-

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


441

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

Следует отметить, что значения границ не должны выходить за пределы диапазона, используемого для типа Long, в против­ном случае компилятор выдаст ошибку переполнения Overflow.

Заполнение элементов массива, как правило, выполняется в , цикле, например:

Dim arrA(l То 10) As Integer Dim intl As Byte For intl = 1 to 10

arrA(intI) = intl2 Next

В качестве значений элементов массива могут выступать как значения определенного типа, так и другие массивы, которые могут иметь разные типы. При этом в последнем случае объяв­ляемый массив должен иметь тип Variant.

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

Dim аrrА(4, 4) As Byte Dim arrB(l To 5, 1 To 5) As Byte

В данном примере объявленные массивы являются двумер­ными и содержат одинаковое количество элементов, нумерация которых, однако, отличается: аггА нумеруется начиная с нуля, arrB — начиная с единицы.

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

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

1. Объявить массив с использованием одного из служебных слов, например Dim, но без указания размерности (или размерностей).


442

2. В нужном месте процедуры описать данный массив с тре­буемым значением для размерности при помощи оператора ReDim.

Например:

Dim arrA() As Byte ' Описание типа массива

ReDim аrrА(5) ' Указание размерностей

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

Например:

Dim arrA() As Byte ' Тип Byte

ReDim arrA(5) As Byte ' Тип Byte

ReDim arrA(10) As Integer ' Ошибка

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

Dim arrA() As Byte

ReDim arrA(5)

' Диапазон: (0 to 5)

ReDim arrA(2, 2)

' Диапазон: (0 to 2, 0 to 2)

ReDim arrA(l To 4)

' Диапазон: (1 to 4)

ReDim arrA(3, 3, 1 То 3)

' Диапазон: (0 to 3, 0 to 3, 1 to 3)

В качестве значений как верхней, так и нижней границы могут быть использованы не только числа, но и переменные целого типа, например: |

Dim intl As Integer

Dim arrA() As Integer

intl =10

ReDim arrA(intI)


443

Необходимо иметь в виду, что при каждом выполнении опе­ратора ReDim все значения элементов массива, которые до этого в нем хранились, будут потеряны, так как данный оператор обну­ляет все элементы в соответствии с их типом (см. табл. 6.14).



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

Dim intl As Integer

Dim arrA() As Integer

ReDim arrA(l To 10)


For intl = 1 To 10

arrA(intI) = intl2

Next


ReDim Preserve arrA(1 To 15)

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

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

ReDim Preserve arrA(15)

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


444

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

Например: I

Dim intLow As Integer, intHigh As Integer

Dim arrA(-10 To 10) As Integer

intLow = LBound(arrA) ' infcLow = -10

intHigh = UBound(arrA) ' intHigh = 10

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

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

Например:

Dim inti As Integer

Dim arrA() As Integer

intl=1000

ReDim arrA(intI) ....' Память для arrA: 1000 * 2 = 2000 байт

Erase arrA ... .' Память для arrA: 0 байт

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


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

Например:

Dim strA As String

stzA = "Строковая переменная"

Существует две разновидности строк:

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


445

процессе выполнения программы, т. е. строка не занимает фиксиро­ванный объем памяти. В рассмотренном выше примере была ис­пользована строка переменной длины.

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

Например:

Dim strA As String * 20

strA = "Строковая переменная"

При выполнении первой из указанных команд для строки strA в памяти будет выделено место в 20 байт.

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

Например:

Dim strA As String * 20

Dim strB As String * 10

Dim strC As String * 25

stxA = "Строковая переменная" ' Результат: "Строковая переменная"

strB = strA ' Результат: "Строковая "

strC = strA ' Результат: "Строковая переменная "

Для удаления лишних пробелов в начале и конце строки ис­пользуются следующие функции: LTrim, RTrim или Trim. Например:

Dim strA As String

Dim strB As String

strA = " Строковая переменная "

strB = LTrim(strA) ' Результат; "Строковая переменная "


446

strB = RTrim(strA) ' Результат: " Строковая переменная"

strB = Trim(strA) ' Результат: "Строковая переменная"

Таким образом, LTrim удаляет все лишние пробелы в начале строки, RTrim - все пробелы в конце строки, и, наконец, функ­ция Trim удаляет их как в начале, так и в конце строки.

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

Например:

Dim strA As String

Dim strB As String

Dim strC As String

strA = "Строковая "

strB = "переменная"

strC = strA & strB ' Результат: "Строковая переменная"

Помимо оператора &, объединять строки можно также при помощи сложения: +, например:

strC = strA + strB

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

Например:

Dim strA As String

Dim strB As Integer

Dim strC As String

strA = "X"

strB =1

strC = strA & strB ' •Результат: "XI"

strC = strA + strB ' Результат: ОШИБКА


447

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

Например:

Dim strA As String

Dim curB As Currency

Dim strC As String

strA = "X = "

curB = 45.77

strC = strA + Str(curB) ' Результат: "X = 45.77"

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

strC = strA + LTrim(Str(curB))

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

Dim strA As String

Dim strB As String

Dim strC As String

strA = "Строковая"

strB = "переменная"

strC = strA & Space(5) & strB ' Результат; "Строковая переменная"

В данном примере при помощи функции Space между объединяемыми строками было добавлено 5 пробелов.

В языке Visual Basic существует возможность изменения строки таким образом, чтобы все используемые в ней буквы были преобразованы либо в верхний регистр (ВСЕ ПРОПИСНЫЕ), либо в нижний (все строчные). Для этих целей используются, соответственно, функции UCase и LCase.


448

Например:

Dim strA As String

Dim strB As String

strA = "Строковая Переменная"

strB = Ucase(strA) ' Результат: "СТРОКОВАЯ ПЕРЕМЕННАЯ"

strB = LCase(strA) ' Результат: "строковая переменная"

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

Dim strA As String

Dim strB As String

strA = "Строковая Переменная"

strB = Replace(strA, "овая", "а") ' Результат; " Строка Переменная"

strB = Replace(strA, "o", "O") ' Результат: " СтрОкОвая Переменная"

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

Например:

strB = Replace(strA, "е", "Е", 10, 3) ' Результат: "ПЕрЕмЕнная"

strB = Replace(strA, "о", "О", 1, 1) ' Результат: " СтрОковая Переменная"

Для определения количества символов в строке применяется функция Len, при этом в качестве параметра указывается рассматриваемая строка.

Например:

Dim strA As String