Visual basic for applications (vba)
Вид материала | Документы |
- Myreferatik at ua, 109.55kb.
- Краткий курс по изучению языка программирования Visual Basic, 357.37kb.
- Даний курс призначений для тих, хто: ніколи не програмував, але хоче навчитися, 360.9kb.
- Применение Microsoft Excel для обработки табличных данных. Выполнение расчетов в таблицах, 14.68kb.
- План Введение. Начало пути. Редактирование, удаление, переименование и назначение макросов, 283.36kb.
- Лекция Основы программирования Эта лекция введение в Visual Basic for Applications,, 208.31kb.
- Н. Г. Волчёнков программирование на visual basic 6 Учебное пособие, 128.99kb.
- Тема урока: Массивы в Visual Basic, 35.5kb.
- Vba(Visual Basic for Application), 276.36kb.
- Программа дисциплины visual Basic для приложений дпп. В. 01 Для специальности, 141.22kb.
Глава 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А =x
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, Private, 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