Содержание
1. Цели и задачи практики
2. Задание
3. Теоретические сведения о разработке приложений при помощи VBA
3.1. Общие сведения
3.2. Данные
3.2.1. Типы данных
3.2.2. Определение типа данных в макросе
3.2.3. Преобразование типов данных
3.3. Вызов процедур и функций
3.4. Связь с рабочим листом
3.4.1. Способы адресации к ячейкам листа
3.4.2. Занесение в ячейку листа формул
3.5. Управляющие структуры
Приложение А Листинг программы
Приложение Б Экранные формы
1. ЦЕЛИ И ЗАДАЧИ ПРАКТИКИ
Цели практики:
· познакомиться с возможностями современных компьютерных технологий решения задач в средах MS Excel 2002, MS Word 2002
· расширить кругозор в области программирования в офисных пакетах, теоретические знания по применению ЭВМ в решении математических задач
· закрепить практические навыки в разработке программного обеспечения
Задача – решить поставленную задачу, используя стандартные средства офисного пакета MS Office XP.
2. ЗАДАНИЕ
Задание №1
Дан файл с исходными данными (прямоугольной матрицей): base.dat, рассматривая элементы строки прямоугольной матрицы координатами точки в n-мерном пространстве, определить номера точек, расстояние d между которыми максимально:
.
Задание № 2
Файл с исходными данными (2- я предложениями): base.txt, сравнить посимвольно предложения между собой, предусмотреть запись в файл.
3. ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ О РАЗРАБОТКЕ ПРИЛОЖЕНИЙ ПРИ ПОМОЩИ VBA
3.1 Общие сведения
Обычно Basic ассоциируется с каким-то очень простым в освоении и использовании средством программирования. Это действительно так. На заре компьютерных технологий язык Basic был создан для создания простых программ и использовался в качестве учебного языка для первых шагов при изучении основ программирования с последующим переходом на более сложные и универсальные языки. Это было заложено в название языка BASIC — Beginners All-purpose Symbolic Instructional Code, то есть многоцелевой код символьных инструкций для начинающих. С прогрессом компьютерных технологий развивался и Basic. В настоящее время версия Visual Basic дает возможность решать любые современные задачи разработки приложений. При этом Visual Basic остался достаточно простым в освоении, став в то же время одним из мощных современных языков программирования.
С помощью Visual Basic можно создавать приложения практически для любой области современных компьютерных технологий: бизнес-приложения, игры, мультимедиа, базы данных. При этом приложения могут быть как простыми, так и очень сложными, в зависимости от поставленной задачи.
Простота и мощность языка Visual Basic позволили сделать его встроенным языком для приложений Microsoft Office. Поэтому в настоящее время Basic уже не считается учебным языком — знание Visual Basic и его диалектов (VBA, VBScript) становится необходимостью для современного программиста любого уровня.
Помимо команд и выражений, можно включить в свою программу любой произвольный текст или комментарии. Комментарии, поясняющие текст программы, сделают ее более читабельной и помогут вам или другим пользователям лучше ориентироваться в программе.
Для включения в текст программы комментария необходимо ввести символ ('), который может быть первым символом в строке или находиться в любом ее месте. Этот символ означает начало комментария. Любой текст, расположенный в строке следом за этим символом, будет восприниматься как комментарий, то есть Visual Basic не будет транслировать этот текст. Например:
Комментарий, начинающийся с начала строки
Print strName ' Комментарий, следующий за оператором
В том случае, когда оператор имеет большую длину, его можно разбить на несколько строк, используя символы продолжения строки: пробел, за которым следует символ подчеркивания (_).
Например, поместим на двух строках оператор, объединяющий фамилию, имя и отчество:
strName = strLastname & strFirstname & strSecondname
Получим следующее:
strName = strLastname _
& strFirstname & strSecondname
Как правило, при написании программ операторы размещают на отдельной строке. Если операторы имеют небольшую длину, Visual Basic позволяет их поместить на одной строке, разделив двоеточием. Например:
strLastname = "Иванов ": strFirstname = "Иван "
3.2 Данные
3.2.1 Типы данных
В таблице 3.2.1 перечислены типы данных, используемые в Visual Basic
Таблица 3.2.1- Описание типов данных
Тип данных |
Размер |
Диапазон значений |
Byte (байт) |
1 байт |
От 0 до 255. |
Boolean (логический) |
2 байт |
True или False. |
Integer (целое) |
2 байт |
От –32 768 до 32 767. |
Long (длинное целое)
|
4 байт |
От -2 147 483 648 до 2 147 483 647. |
Single (с плавающей точкой обычной точности) |
4 байт |
От –3,402823E38 до –1,401298E-45 для отрицательных значений; от 1,401298E-45 до 3,402823E38 для положительных значений. |
Double (с плавающей точкой двойной точности) |
8 байт |
От - 1,79769313486232E308 до -4,94065645841247E-324 для отрицательных значений; от 4,94065645841247E-324 до 1,79769313486232E308 для положительных значений. |
Currency (денежный) |
8 байт |
От -922 337 203 685 477,5808 до 922 337 203 685 477,5807. |
Decimal (масштабируемое целое) |
14 байт |
+/-79 228 162 514 264 337 593 543 950 335 без дробной части; +/-7,9228162514264337593543950335 с 28 знаками справа от запятой; минимальное ненулевое значение имеет вид +/-0,0000000000000000000000000001. |
Date (даты и время) |
8 байт |
От 1 января 100 г. до 31 декабря 9999 г. |
String (строка переменной длины) |
10 байт + длина строки |
От 0 до приблизительно 2 миллиардов. |
String (строка постоянной длины) |
Длина строки |
От 1 до приблизительно 65 400. |
Object (объект) |
4 байт |
Любой указатель объекта. |
Variant (числовые подтипы) |
16 байт |
Любое числовое значение вплоть до границ диапазона для типа Double. |
Variant (строковые подтипы) |
22 байт + длина строки |
Как для строки (String) переменной длины. |
Тип данных, определяемый пользователем (с помощью ключевого слова Type) |
Объем определяется элементами |
Диапазон каждого элемента определяется его типом данных. |
3.2.2 Определение типа данных в макросе
Для определения типа переменной можно использовать неявное объявление. Для этого используется специальный символ (см. таблицу 3.2.2).
Таблица 3.2.2 – Таблица специальных символов
Тип переменной |
Символ, добавляемый к имени |
Integer
|
% |
Long
(длинное целое) |
& |
Single
|
! |
Double
|
# |
Currency
|
@ |
String
|
$ |
Пример использования неявного объявления типа переменной
msg
$
= “Задача выполнена”
MsgBox
msg$
Явное объявление осуществляется операторами Dim, private, Static, public
, которые имеют следующий синтаксис:
Dim имяПеременной [As типДанных]
Private имяПеременной [As типДанных]
Static имяПеременной [As типДанных]
Public имяПеременной [As типДанных]
Операторы Dim, Private, static, public
определяют область действия переменной. С помощью одного оператора вы можете объявлять несколько переменных, разделяя их запятыми. Примеры объявления переменных приведены ниже:
Private bInSuccess As Boolean
Dim strLastname As String, dblSum As Double
Для объявления строки с фиксированной длиной используется следующий синтаксис:
Dim имяПеременной As String * длинаПеременной
Параметр длинаПеременной
указывает максимальное количество символов, отводимое переменной. Символ звездочки (*) указывает на то, что переменная имеет фиксированную длину.
Инструкции Def
тип
, используются на уровне модуля для задания типа данных, используемого по умолчанию для переменных, аргументов, передаваемых в процедуры, и значений, возвращаемых процедурами Function
и Property Get
, имена которых начинаются с соответствующих символов.
Синтаксис:
DefBool диапазонБукв[, диапазонБукв] . . .
DefByte диапазонБукв[, диапазонБукв] . . .
DefInt диапазонБукв[, диапазонБукв] . . .
DefLng диапазонБукв[, диапазонБукв] . . .
DefCur диапазонБукв[, диапазонБукв] . . .
DefSng диапазонБукв[, диапазонБукв] . . .
DefDbl диапазонБукв[, диапазонБукв] . . .
DefDec диапазонБукв[, диапазонБукв] . . .
DefDate диапазонБукв[, диапазонБукв] . . .
DefStr диапазонБукв[, диапазонБукв] . . .
DefObj диапазонБукв[, диапазонБукв] . . .
DefVar диапазонБукв[, диапазонБукв] . . .
Обязательный аргумент диапазонБукв
имеет следующий синтаксис:
буква_1[-буква_2]
Аргументы буква_1
и буква_2
указывают диапазон имен, для которых задается тип данных по умолчанию. Каждый аргумент представляет первую букву имени переменной, аргумента, процедуры Function
или Property Get
и может быть любой буквой алфавита. Регистр символов в аргументе диапазонБукв
не существенен.
Инструкции Defтип
можно использовать только на уровне модуля (т.е. нельзя использовать внутри процедур).
Переменные, имена которых начинаются с букв "A" - "K",
будут по умолчанию
Integer
.
DefInt
A-K
Переменные, имена которых начинаются с букв "L" - "Z",
будут по умолчанию
String
.
DefStr
L-Z
CalcVar = 4 ' Инициализирует переменную типа Integer
.
StringVar = "Всем привет" ' Инициализирует переменную типа String
.
AnyVar = "Привет" ' Будет обнаружено несовпадение типов
.
Dim
Calc As Double ' Явно объявлена переменная типа Double
.
Calc = 2.3455 ' Присваивает значение переменной типа Double
.
Инструкции Defтип
также применимы к функциям
.
CalcNum = ATestFunction(4) ' Вызывает процедуру Function
, определенную пользователем.
Описание
процедуры
Function ATestFunction
.
Function
ATestFunction(INumber)
ATestFunction = INumber * 2 ' Возвращает
значение
типа
Integer
.
End Function
3.2.3 Преобразования типа данных
Каждая из функций, приведенных в таблице 3.2.3, преобразует выражение к соответствующему типу данных. Обязательный аргумент выражение является любым строковым выражением или числовым выражением.
Таблица 3.2.3 – Функции преобразования типов
Функция |
Тип |
Диапазон аргумента выражение
|
Cbool |
Boolean |
Любая допустимая строка или числовое выражение. |
CByte |
Byte |
От 0 до 255. |
Ccur |
Currency |
От -922 337 203 685 477,5808 до 922 337 203 685 477,5807. |
Cdate |
Date |
Любое допустимое выражение даты. |
CDbl |
Double |
От -1,79769313486232E308 до -4,94065645841247E-324 для отрицательных чисел; от 4,94065645841247E-324 до 1,79769313486232E308 для положительных чисел. |
Cdec |
Decimal |
+/-79 228 162 514 264 337 593 543 950 335 без масштабирования, т.е. для чисел без дробной части. Диапазон чисел с 28 знаками в дробной части +/-7,9228162514264337593543950335. Минимальное ненулевое число 0,0000000000000000000000000001. |
Cint |
Integer |
От -32 768 до 32 767 с округлением дробной части. |
CLng |
Long |
От -2 147 483 648 до 2 147 483 647 с округлением дробной части. |
CSng |
Single |
От -3,402823E38 до -1,401298E-45 для отрицательных чисел; от 1,401298E-45 до 3,402823E38 для положительных чисел. |
Cvar |
Variant |
Диапазон значений Double для числовых значений. Диапазон значений String для нечисловых значений. |
CStr |
String |
Возвращаемые значения функции CStr зависят от аргумента выражение. |
Если переданное в функцию значение аргумента выражение находится вне допустимого диапазона для соответствующего типа данных, возникает ошибка.
Вообще говоря, функции преобразования типов данных используются для документирования программы. Это позволяет показать, что результат некоторой операции должен быть представлен определенным типом данных, а не типом, используемым по умолчанию. Например, функция CCur
обеспечивает арифметические действия над числами в денежном формате в тех случаях, когда по умолчанию используются действия над числами с плавающей точкой обычной или двойной точности или над целыми числами.
Функции преобразования типов данных следует использовать вместо функции Val
для совместимости с различными национальными настройками при преобразовании из любого типа данных в другой. Например, при использовании функции CCur
разделители целой и дробной частей, а также разделители разрядов и параметры денежных единиц правильно распознаются в зависимости от национальной настройки компьютера.
Если дробная часть числа в точности равна 0,5, то функции CInt
и CLng
всегда округляют число до ближайшего четного числа. Например, 0,5 округляется до 0, а 1,5 до 2.
Чтобы определить, может ли аргумент дата быть преобразована к типу даты или времени, следует использовать функцию IsDate
. Функция CDate
распознает литералы даты и литералы времени, а также числа, которые попадают в приемлемый диапазон дат. При преобразовании числа в дату переводится целая часть числа. Любая дробная часть числа преобразуется во время суток, отсчитываемое от полуночи.
Функция CDate
распознает форматы дат в соответствии с национальной настройкой системы. Правильный порядок дней, месяцев и годов может не быть определен, если дата задается в формате, отличном от распознаваемых форматов дат. Кроме того, длинный формат даты также не распознается, если он содержит строку для дня недели.
3.3 Вызов процедур и функций
При программировании широко используются процедуры, позволяющие разбивать программные коды на небольшие логические блоки, которые, во-первых, легче отлаживать, а во-вторых, можно в свою очередь использовать при создании других процедур. В Visual Basic существуют следующие виды процедур:
· Sub
· Function
· Property
Процедура sub
не возвращает значения и наиболее часто используется для обработки связанного с ней события. Ее можно помещать в стандартные модули, модули классов и форм. Она имеет следующий синтаксис:
[Private] [Public] [Static} Sub имяПроцедуры
(
аргументы
)
операторы
End Sub
Между ключевыми словами Sub
и End Sub
в процедуре располагаются выполняемые при ее вызове операторы программного кода. Параметр аргументы можно применять для объявления передаваемых в процедуру переменных.
Процедуры Sub
подразделяются на общие процедуры и процедуры событий. Общие процедуры служат для размещения повторяющихся операторов, используемых процедурами по обработке событии, тем самым разгружая их и исключая дублирование часто встречающихся кодов, что в свою очередь облегчает поддержку приложения.
Процедуры обработки событий связаны с объектами, размещенными в формах Visual Basic, или с самой формой и выполняются при наступлении события, с которым они связаны.
Процедуры Function
в отличие от процедур sub
могут возвращать значение в вызывающую процедуру. Синтаксис процедуры Function
выглядит следующим образом:
[Private] [Public] [Static} Function имяПроцедуры
(
аргументы
)
[As type]
операторы
End Function
Процедуры Function
, как и переменные, имеют тип, задаваемый с помощью ключевого слова As
. Если тип процедуры не задан, по умолчанию ей присваивается тип Variant
. Тип процедуры определяет в свою очередь тип возвращаемого ею значения. Возвращаемое процедурой значение присваивается имени процедуры имяПроцедуры
и может быть использовано в выражениях программного кода аналогично стандартным функциям Visual Basic.
Процедура Sub
не возвращает значения, однако она может изменять значения переменных, заданных для нее в качестве параметров. Вызов процедуры Sub
можно осуществлять двумя способами. Первый способ предполагает использование ключевого слова Call
. Например, процедуру с именем Nameproc можно вызвать оператором
Call NameProc (аргумент1, аргумент2, ...аргументы)
Второй способ позволяет вызвать процедуру sub по ее имени. Например,
NameProc аргумент1, аргумент2, ...аргумен
При вызове процедуры модуля формы из другого модуля необходимо указывать ссылку на имя модуля формы, содержащего процедуру. Например, для вызова процедуры с именем Nameproc, находящейся в модуле формы Form1, оператор должен выглядеть так:
Call Form1.NameProc (аргумент1, аргумент2, ...аргументМ)
Вызов процедуры Function
аналогичен вызову встроенных функций Visual Basic. Кроме этого, процедуру Function
можно вызывать так же, как процедуру Sub
:
Call Square(Side)
Square Side
В этом случае Visual Basic игнорирует возвращаемое функцией значение.
Переменные, передаваемые процедуре, называют параметрами процедуры.
По умолчанию они имеют тип Variant
. Visual Basic позволяет задавать тип параметров с помощью ключевого слова As
:
Function Square (intA As Integer) As Integer
Передача параметров в процедуру может осуществляться двумя способами: по значению (by value) и по ссылке (by reference). В первом случае в процедуру в качестве переменной передается не сама переменная, а ее копия. Поэтому изменение параметра в процедуре затрагивает не переменную, а ее копию. Для передачи в процедуру параметров по ссылке используется ключевое слово ByVal
, например:
Sub NameProc (ByVal strArg As String)
тело процедуры
End Sub
При передаче параметров по ссылке процедура получает доступ к области памяти, в которой эта переменная хранится, в результате чего при изменении в процедуре параметра происходит изменение значения переменной. По умолчанию в Visual Basic передача параметров в процедуру осуществляется по ссылке.
Используя ключевое слово O
ptional
, можно задавать необязательные параметры процедуры.
При этом необходимо иметь в виду, что если какой-либо из параметров задан как необязательный, то и расположенные после него параметры также должны быть объявлены необязательными:
Sub NameProc (Optional strArg1 As String, Optional strArg2 As String)
тело процедуры
End Sub
Обязательные параметры процедуры должны задаваться до необязательных, например:
Sub NameProc (strArg1 As String, Optional strArg2 As String)
тело процедуры
End Sub
3.4 Связь с рабочим листом
3.4.1 Способы адресации к ячейкам листа
Получить доступ к ячейке листа электронной таблицы Excel можно различными способами:
а) прямая ссылка на имя ячейки:
a = Range(“A1”).Value ‘Получить значение из ячейки
A
1 текущей таблицы
a = Worksheets(“Лист1”).Range(“A1”).Value ‘Получить значение из ячейки
‘A
1 листа с именем “Лист1” в текущей книге (файле *.
xls
)
a = Worksheets(1).Range(“A1”).Value
Получить значение из ячейки A1 листа следующего первым по порядку в текущей книге (файле *.
xls
)
a = Workbooks(“Work.xls”).Worksheets(1).Range(“A1”).Value
Получить значение из ячейки A1 листа следующего первым по порядку в книге “
Work
.
xls
”
Range (“A1”).Value = a ‘Занести значение из переменной
a
в ячейку А1
б) прямая ссылка на номер ячейки. Если представить ячейку таблицы, как элемент двухмерной таблицы, то, например, ячейка “A1” будет иметь ссылку “1,1”(строка, столбец).
a = Cells(2,2).Value ‘Получить значение из ячейки В2 текущей таблицы
a = Worksheets(“Лист1”).Cells(2,2).Value
a = Worksheets(1).Cells(2,2).Value
a = Workbooks(“Work.xls”).Worksheets(1).Cells(2,2).Value
Cells(2,2).Value = a ‘Занести значение из переменной а
в ячейку В2
в) Косвенная ссылка на имя ячейки. На первом шаге необходимо выделить необходимую ячейку инструкцией Range
(“A2”).Select
, а далее получить доступ к ячейке с помощью инструкции ActiveCell
.
FormulaR
1
C
1
(всегда возвращается значение типа текст, поэтому необходимо преобразовывать полученное значение с помощью функций CDbl
, CInt
, Val
и тому подобных):
Range(“A2”).Select ‘Перейти на ячейку А2 текущей таблицы
a = CDbl(ActiveCell.FormulaR1C1) ‘Получить значение из выделенной
‘ячейки и преобразовать его к типу
Double
Range(“A2”).Select ‘Перейти на ячейку А2 текущей таблицы
ActiveCell.FormulaR1C1 = a ‘Занести значение переменной а
в
‘выделенную ячейку
Для выделения ячейки А1 определенного листа в определенной книге (файле *.xls) необходимо:
1) активизировать открытую книгу (файл *.xls) инструкцией Windows(“Книга2.xls”).Activate;
2) активизировать нужный лист книги инструкцией Worksheets(“Лист1”).Activate;
3) перейти к ячейке: Range(“A1”).Select.
г) косвенная ссылка на ячейку по приращению. Позволяет выделить ячейку (перейти к ячейке) по приращению от текущей (Offset
(приращение_по_строке, приращение_по_столбцу)):
ActiveCell.Offset(0,1).Range(“A1”).Select
В данном случае оператор Range
(“A1”) – ключевое слово конструкции и не более.
Пусть мы выделили ячейку “С5” (Range(“C5”).Select), тогда имеем:
Range(“C5”).Select
ActiveCell.Offset(0,1).Range(“A1”).Select ‘Перейти
к
ячейке
D5
‘(вправо на одну)
Range(“C5”).Select
ActiveCell.Offset(0,-1).Range(“A1”).Select ‘Перейти
к
ячейке
B5
‘(влево на одну)
Range(“C5”).Select
ActiveCell.Offset(1,0).Range(“A1”).Select ‘Перейти
к
ячейке
C6
‘(вниз на одну)
Range(“C5”).Select
ActiveCell.Offset(-1,0).Range(“A1”).Select ‘Перейти
к
ячейке
C4
‘(вверх на одну)
3.4.2 Занесение в ячейку листа формул
Чтобы занести выражение в ячейку электронной таблицы необходимо:
- адресоваться к ней способами, изложенными выше;
- вызвать метод Formula.
Ниже приведены примеры для различных способов адресации к ячейке:
а) прямая ссылка на имя ячейки: Range(“A1”).Formula= ”=a1+a2”;
б) прямая ссылка на номер ячейки: Cells(1,1).Formula= “=a1+a2”;
в) косвенная ссылка на имя ячейки:
Range(“A1”).Select
ActiveCell.Formula= “=a1+a2”
г) косвенная ссылка на ячейку по приращению:
ActiveCell.Offset(0,1).Range(“A1”).Select
ActiveCell.Formula= “=a1+a2”
Непосредственно использовать в макросах на Visual Basic функций Excel можно через инструкцию WorksheetFunction.Имя_функции(список параметров). Параметр, содержащий ссылку на ячейку, оформляется как было изложено выше:
Dim a As Double
a=10+WorksheetFunction.Acos(Range(“A1”))
‘Вычисление
ArcCos
ячейки
А
1
a=10+WorksheetFunction.Acos(Cells(1,1))
‘Вычисление
ArcCos
ячейки А1
Для операций с группой ячеек достаточно указать их размещение в операторе Range
(“A1:B3”):
a= WorksheetFunction.Min(Range(“A1:B3”))
‘Поиск минимального значения в блоке А1:В3
Для удобства используется оператор Set
(присвоить), позволяющий назначить переменной типа Range
область ячеек:
Dim ab As Range
Set ab=Workbooks(“Work.xls”).Worksheets(“Лист1”).Range(“A1:B3”)
a= WorksheetFunction.Min(ab)
‘Поиск минимального значения в блоке ячеек А1:В3
При вызове стандартных функций Visual Basic (Exp
, Cos
, Sin
и т.д.) в качестве параметров нужно передавать только переменные или значения, определенные в макросе. При вызове функций Excel нужно передавать только ссылки на ячейки (инструкции Range
, Cells
).
3.5 Управляющие структуры
В Visual Basic, как и во всех языках программирования, существуют управляющие конструкции, предназначенные для управления порядком выполнения команд. Различают два основных типа управляющих операторов
· if
· Select Case
Конструкция if используется в том случае, когда необходимо, чтобы группа операторов выполнялась при соблюдении определенных условий. Конструкция select case позволяет на основании анализа значения заданного выражения выполнять те или иные действия.
В свою очередь, управляющие операторы if бывают двух видов:
· If...Then
· If...Then...Else
Конструкция If...Then применяется, когда необходимо выполнить определенные действия в зависимости от некоторого условия. Управляющая конструкция If...Then...Else используется в том случае, когда необходимо выполнить разные действия в зависимости от условия.
Конструкция if.. .Then.. .Else аналогична конструкции if...Then, но позволяет задать действия, исполняемые как при выполнении условий, так и в случае их невыполнения.
Конструкция имеет следующий синтаксис:
IF условие
Then .
Конструкции для обработки истинного условия
Else
Конструкции для обработки ложного условия
End If
Ключевые слова IF и End if имеют тот же смысл, что и в конструкции If...Then. Если заданное в конструкции условие не выполняется (результат проверки равен False),
и конструкция содержит ключевое слово Else, Visual Basic выполнит последовательность конструкций, расположенных следом за Else. После чего управление перейдет к конструкции, следующей после End If.
Например:
If x >=
0 Then
Label1.Caption = "Значение больше или равно 0"
Else
Labell.Caption = "Значение меньше 0"
End If
Команда if может проверить только одно условие. Если вам потребуется осуществить переход управления в зависимости от результатов проверки нескольких условий, то такая возможность существует. Дополнительное условие можно задать с помощью оператора Elseif. Оно будет анализироваться только в том случае, если предыдущее условие ложно. Например:
If x > 0 Then
Label1.Caption = "Значение положительное"
Elself x = 0 Then
Label1.Caption =
"Значение равно 0"
Else
Labell.Caption = "Значение отрицательное"
End If
Конструкция Select case позволяет обрабатывать в программе несколько условий и аналогична блоку конструкций if.. .Then.. .Else. Эта конструкция состоит из анализируемого выражения и набора операторов case на каждое возможное значение выражения. Работает эта конструкция следующим образом. Сначала Visual Basic вычисляет значение заданного в конструкции выражения. Затем полученное значение сравнивается со значениями, задаваемыми в операторах case конструкции. Если найдено искомое значение, выполняются команды, приписанные данному оператору case. После завершения выполнения конструкций управление будет передано конструкции, следующей за ключевым словом End Select.
Синтаксис конструкции Select Case следующий:
Select Case сравниваемоеЗначение
CASE значение1
конструкция1
CASE значение2
конструкция2
. . .
End Select
В начале конструкции расположены ключевые слова select case
, указывающие, что расположенный рядом с ними параметр сравниваемоеЗначение будет проверяться на несколько значений. Далее следуют группы команд. начинающиеся с ключевого слова Case
. Если параметр сравниваемоеЗначение равен значению, указанному в текущем операторе case
, то будут выполняться команды, расположенные между этим и следующим ключевым словом case
. Select Case
может выполнить не более одной из содержащихся в ней последовательностей конструкций. После того как одно из условий оказалось равно True,
и была выполнена соответствующая последовательность конструкций, Select Case
завершит свою работу. Остальные условия проверяться не будут.
В программах Visual Basic для выполнения повторяющихся действий используются циклы. Они бывают следующих типов:
· For...Next
· For Each...Next
· Do. . . Loop
Конструкция For...Next выполняет последовательность команд определенное число раз. Такую конструкцию называют циклом,
а выполняемые ею программные коды — телом цикла.
Синтаксис конструкции For.. .Next следующий:
For счетчик = начЗначение То конЗначение [Step шаг]
конструкции
Next[счетчик]
Первый аргумент конструкции — счетчик — определяет имя переменной, которая будет "считать" количество выполнении цикла. Параметр начЗначение указывает числовое значение, которое присваивается переменной-счетчику перед первым проходом цикла. Цикл выполняется до тех пор, пока значение счетчика не превысит конечного значения, указанного после ключевого слова то. После каждого прохода цикла значение счетчика изменяется на величину шаг, указанную за ключевым словом step. Ключевое слово Next обозначает конец тела цикла и является обязательным. Перед каждым проходом цикла Visual Basic сравнивает значения счетчика и аргумента конЗначение. Если значение счетчика не превышает установленного значения конЗначение, выполняются конструкции тела цикла. В противном случае управление переходит к следующей за Next конструкции. Например:
For nCountVar = 1 То 10 Step 2
nNextWeek(nCountVar) = nCountVar * 2
Next
Здесь цикл выполняется пять раз при значениях счетчика nCountVar 1, 3, 5, 7 и 9.
Шаг изменения счетчика может быть отрицательным. Например:
For nCounter = 100 То 1 Step -10
nDecades(nCounter) = nCounter *2
Next
В этом случае цикл будет выполняться до тех пор, пока nCountVar больше 1. Если значение шага цикла отрицательно, то начальное значение счетчика должно быть больше конечного. Ключевое слово step можно опустить. В этом случае значение шага по умолчанию принимается равным 1.
Возможны ситуации, при которых выполнение цикла невозможно или, наоборот, его выполнение становится бесконечным. Например:
· Невыполняемый цикл: начальное значение счетчика больше конечного при положительном шаге цикла
For nCounter=100 To 1
nDecades (nCounter) =
nCounter
Next
· Бесконечный цикл: значение счетчика изменяется в теле цикла и никогда не превысит 10
For nCounter = 1 То 10
nCounter = 1
Next
Цикл с использованием конструкции For Each...Next похож на цикл For.. .Next, но используется для обработки всех элементов некоторого набора объектов или массива. Его особенно удобно использовать в том случае, когда количество обрабатываемых элементов не известно.
Синтаксис конструкции For Each.. .Next следующий:
For Each элемент In группа
конструкции
Next элемент
При использовании конструкции For Each.. .Next необходимо иметь в виду, что для набора объектов параметр элемент может быть только переменной типа Variant, общей переменной типа Object или объектом, перечисленным в Object Browser. Для массивов параметр элемент может быть только переменной типа Variant.
Цикл, задаваемый конструкцией Do... Loop, выполняется до тех пор, пока истинно задаваемое в цикле условие.
Синтаксис конструкции DO. . .Loop следующий:
Do While условие
конструкции
Loop
Аргумент конструкции условие является логическим выражением, значение которого проверяется перед каждым проходом цикла. Если это значение равно True,
то выполняется последовательность команд, которые расположены между Do while и ключевым словом Loop. Эти конструкции образуют тело цикла. Если при очередном проходе цикла условие равно False,
то происходит выход из цикла и управление передается конструкции, следующей за Loop. Возможна ситуация, при которой операторы цикла не выполняются ни разу. Она возникает в том случае, если при первой проверке условия оно оказывается ложным.
В Visual Basic существует еще один вид цикла конструкции DO... Loop. Он отличается от рассмотренного ранее местом расположения условия. Если в предыдущей конструкции условие, по которому выполняется цикл, расположено в заголовке, то в этой конструкции условие располагается в конце цикла:
Do
конструкции
Loop While условие
При использовании этой формы оператора тело цикла выполняется хотя бы один раз, после чего осуществляется проверка заданного условия.
Есть еще две разновидности конструкции цикла Do. . .Loop. Данные операторы имеют следующий синтаксис:
Do Until условие
конструкции
Loop
и
Do
конструкции
Loop Until условие
Пример использования конструкции приведен ниже.
nCounter = 2
Do While nCounter < 10
nDecades(nCounter) = nCounter * 2
nCounter =
nCounter * 2
Loop
ПРИЛОЖЕНИЕ А
Листинг программы 1
'Программа написана на VBA Благиревым Артемом Михайловичем гр.ПО - 03в
'Донецкий Институт Искусственного Интеллекта - 2004г
Private Sub CommandButton1_Click()
Dim a(10, 10) As Single
Dim i, j, k, d, m, n, max As Integer
Dim s(10) As Single
For i = 1 To 10
For j = 1 To 10
For k = i + 1 To 10
Open "C:base.dat" For Input As #1
Do While Not EOF(1)
max = 0
Input #1, a(i, j)
a(i, j) = Cells(i, j).Value
d = (a(i, j) - a(k, j)) ^ 2
s(i) = Sqr(d)
If max < s(i) Then
s(i) = max
Range("A8").Value = max
End If
Loop
Close #1
Next k
Next j
Next i
End Sub
Private Sub CommandButton2_Click()
UserForm1.Hide
End Sub
Листинг программы2
' Программа написана на VBA Благиревым Артемом Михайловичем гр.ПО - 03в
'Донецкий Государственный Институт Искусственного Интеллекта - 2004г
Private Sub CommandButton1_Click()
Dim результат, предложение1, предложение2 As String
'ввод предложения
предложение1 = CStr(TextBox1.Text)
предложение2 = CStr(TextBox2.Text)
'основной код программы
результат = StrComp(предложение1, предложение2, 1)
If результат = 0 Then
TextBox3.Text = "Предложения равны!"
Else: TextBox3.Text = "Предложения не равны!"
End If
End Sub
Private Sub CommandButton2_Click()
Userform1.hide
End Sub
Private Sub CommandButton3_Click()
Open "c:file.txt" For Output As #1
Print #1, "Первое предложение ->"; TextBox1.Text
Print #1, "Второе предложение ->"; TextBox2.Text
Print #1, "Результат ->"; TextBox3.Text
Close #1
MsgBox "Файл создан, данные успешно записаны", vbInformation, "Запись"
End Sub
Private Sub CommandButton4_Click()
Open "c:base.txt" For Input As #2
Do While Not EOF(2)
Input #2, предложение1, предложение2
TextBox1.Text = предложение1
TextBox2.Text = предложение2
Loop
Close #2
MsgBox "Данные успешно введены", vbInformation, "Ввод данных"
End Sub
ПРИЛОЖЕНИЕ Б
Экранные формы
Рисунок 1.1 – В начале работы приложения 1
Рисунок 1.2 - Окно открытия файла с исходными данными и результат работы приложения 1
Рисунок 2.1 – В начале работы приложения 2
Рисунок 2.2 – Окно открытия файла с исходными данными
Рисунок 2.3 – Результат работы программы