Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебник Макаровой

.pdf
Скачиваний:
90
Добавлен:
12.04.2015
Размер:
11.93 Mб
Скачать

Select CDemse

Начало работы оператора Select, объявление имени

 

переменной, для которой выполняются последующие

 

проверки – Demse

CaseDemse21

Первое сравнение

Dem=21

Если первое сравнение истинно, выполняется оператор

 

присваивания

Case Demse 22; 25; 28

Второе сравнение указан список возможных значений

 

 

Dem=31

Если второе сравнение истинно, выполняется оператор

 

присваивания

Case Demse 45 To 48

Третье сравнение, переменная Cdemse может принимать

 

значения от 45 до 48

Dem=41

Если третье сравнение истинно, выполняется оператор

 

присваивания

Case Else

Если не выполнилось ни одно из указанных сравнений

 

 

Dem=51

Выполняется присваивание

End Case

Конец оператора Select

Оператор цикла For-Next. Данный оператор относится к категории вычисляемых циклов, когда известно заранее число повторений цикла, заданы начальное, конечное значения и шаг (приращение) изменения начального значения, т.е.:

Для каждого значения переменной этого цикла выполняется блок операторов, расположенных до ключевого слова Next. Затем происходит изменение переменной цикла (увеличение значения на шаг), проверяется полученное значение (не более указанного конечного значения) и повторяется выполнение блока операторов.

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

фразой Next.

В теле цикла может присутствовать оператор Exit For. При выполнении этого оператора прекращается цикл и управление также передается оператору, следующему за фразой Next. Цикл ForNext может быть вложенным.

Пример 19.25. Организация циклов с использованием счетчика повторений

Текст программы

Комментарий

591

Sub stickRandom()

Объявление имени процедуры

Dim numrows As Integer; numcols As Integer

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

Dim therow As Integer; thecol As Integer

 

numrows = Selection.Rows.Count

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

numcols = Selection.Columns.Count

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

 

ячеек

Debug. Print numrows; numcols

Печать числа строк и столбцов в выделенном блоке

 

ячеек

Randomize

Генератор случайных чисел

Debug.Print Rnd For therow = 1 To numrows

Печать случайного числа

For thecol = 1 To numcols

Внешний цикл по числу строк в блоке ячеек

Selection. Cells(therow; thecol).Value = Rnd

Внутренний цикл по числу столбцов в блоке ячеек

 

Присваивание текущей ячейке случайного числа

 

Selection – выбор ячейки

 

Cells – метод доступа к ячейке с определенными

 

координатами

 

Value – свойство "значение"

Next thecol

Конец внутренного цикла

Next therow

Конец внешнего цикла

End Sub

Конец процедуры

Цикл Do-Loop. Логически управляемый цикл, оператор Do начало, оператор Loop конец цикла; имеет 4 модификации:

1) условие True в начале цикла

Do While <условие> <блок операторов> Exit Do

<блок операторов> Loop

Цикл выполняется до тех пор, пока истинно <условие>. Минимальное число повторений тела цикла – 0. Оператор Exit Do предназначен для прекращения цикла и передачи управления оператору Loop конец цикла.

2) условие True в конце цикла

Do

<блок операторов> Exit Do

<блок операторов> Loop While <условие>

Цикл выполняется хотя бы один раз, в конце выполняется проверка <условия>. 3) условие False в начале цикла

Do Until <условие> <блок операторов> Exit Do

<блок операторов> Loop

Until указывает, что цикл выполняется до тех пор, пока <условие> не станет истинным. Минимальное число повторений тела цикла – 0.

4) условие False в конце цикла

Do

<блок операторов> Exit Do

592

<блок операторов> Loop Until <условие>

Условие проверяется в конце, цикл прекращается, когда условие станет истинным. Минимальное число повторений тела цикла – 1.

Пример 19.26. Выполнение логически прерываемых циклов

Текст программы

Комментарий

Option Explicit

Обязательность объявления всех переменных перед их

 

использованием

Sub Do_Rnd()

Объявление имени процедуры без параметров

Dim a As Single

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

Dim i As Integer,

 

Randomize

Вызов генератора случайных чисел

Do While True

Начало цикла Do. Задание условия выполнения цикла

 

цикл бесконечный

a=Rnd

Присвоение переменной случайного числа

Debug.Print a

Печать случайного числа

If a > 0.99 Then Exit Do

Блок условия при его выполнении выход из цикла

Loop

Конец цикла

End Sub

Конец процедуры

 

 

Цикл While-Wend. Данный оператор полностью соответствует структуре Do While-Loop. Отличительной особенностью оператора является невозможность прервать выполнение цикла из тела цикла (Exit Do отсутствует), проверка условия выполняется только в начале цикла.

While <условие> <блок операторов> Wend

Цикл For Each. Оператор относится к категории операторов объектного типа, т.е. применяется к массивам (элементам) и наборам объектов. Выполняется фиксированное число раз, число объектов в наборе определяется автоматически. Упорядочение элементов набора произвольное.

For Each <элемент> In <набор> <блок операторов>

Exit For

<блок операторов>

где <элемент> представляет собой переменную типа Variant, <набор> – определенный набор объектов.

Для прерывания цикла используется оператор Exit For.

РАБОТА С ФАЙЛАМИ

Основные понятия

VBA работает с хранимыми на диске файлами двух типов: последовательного и произвольного доступа.

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

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

593

Открытие файла

Открывать можно как существующие на диске, так и новые файлы. Каждый файл идентифицируется в программе определенным номером, который присваивается ему в момент открытия. Свободный номер файла можно определить с помощью встроенной функции FileFree, которая возвращает очередной свободный номер для открытия файла (номер изменяется в диапазоне 1-511).

Файл открывают в определенном режиме работы:

Open <путь_имя_файла> [For <режимы>] [Access <направление_потока>] [<блокировка>] As [#]номер [Lеn=<длина_записи>]

где <путь_имя_файла>

- строка символов, задающая местоположение и имя дискового файла;

<режимы>

- режимы работы с файлом:

Append

 

добавление записей

Binary

 

двоичный файл

Input

 

файл для чтения

Output

 

файл для записи

Random

 

файл произвольного доступа;

<направление_потока> -

задает тип потока данных по отношению к файлу:

Read

 

только чтение

Write

 

только запись

Read Write

 

чтение и запись одновременно;

<блокировка>

- определяет возможность работы с файлом других приложений:

Shared

 

распределенный доступ

Lock Read

 

блокировка файла для чтения

Lock Write

 

блокировка файла для записи

Lock Read Write

 

блокировка файла для чтения и записи;

номер

-

условный идентификатор файла;

<длина_записи>

- указывается для записей фиксированной длины, максимум – 32767

 

 

байт. Оптимальная длина записи кратна размеру дискового сектора (512

 

 

байт).

Для файлов произвольного доступа объявляется структура записи с помощью оператора Туре; указываются типы и длина компонентов структуры. В режимах Binary, Input, Random под разными номерами можно открыть один и тот же файл, не закрывая ранее открытых; в режимах Append, Output требуется предварительно закрыть ранее открытые файлы.

Пример 19.27. Открытие файлов

Текст программы

Комментарий

Open "FILE" For Input As #1

Открытие последовательного файла для чтения

Open "FILE" For Binary Access

Открытие двоичного файла только для записи

Write As #1

 

Type Record Define userdefined type

Объявление пользовательского типа данных

ID As Integer

 

Name As String * 20

 

End Type

 

Dim MyRecord As Record

 

Open "FILE" For Random As #1

Открытие файла произвольного доступа. Длина

Len = Len(MyRecord)

записи файла определяется встроенной

 

функцией Len

Open "FILE" For Output Shared As #1

Открытие последовательного файла с

 

распределенным доступом (любые приложения

 

могут читать и писать в файл)

Open "FILE" For Binary Access

Открытие двоичного файла для чтения, чтение

Read Lock Read As #1

файла другим приложениям запрещено

 

 

Закрытие файла

594

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

Close [<список_номеров_файлов>]

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

Пример 19.28. Закрытие файлов

Close #1; #2; #4

' закрытие файлов, ранее открытых под номерами 1,2,4

Close

' закрытие всех открытых файлов

Запись информации в файл

Существует несколько операторов вывода информации в файл. 1. Печать в последовательный файл

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

Print #номер_файла; [<выходной_список_переменных>]

Выходной список печати может содержать:

[{Spc(n) | Tab[(n)]}] [<выражение>] [charpos]

где Spc(n)

- длина пустой строки;

Tab(n)

- печать с указанной позиции;

<выражение>

- выражение числового или символьного типа;

charpos

- определяет позицию вставки для следующего символа. Символ ; обеспечивает

 

переход на другую строку (к другой записи файла).

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

Пример 19.29. Печать в последовательный файл

Текст программы

Комментарий

Open "FILE" For Output As #1

Открытие файла для печати

Print # 1 ; "Печать любого текста"

Вывод в файл текстовой строки

Print #1;

Вставка пустой строки

Print #1; "Код"; Tab ; "Наименование"

Вывод в две колонки

Print #1; "Код" ; " " ; "Наименование"

Разделение двух слов пробелом

Print #l;Spc(5); "Код"

Вставка 5 отступов перед печатью слова

Print #l;Tab(10); "Код"

Позиционирование в колонку 10

MyBool = False

Присвоение значений переменным различного

MyDate = #February 12, 1969#

типа

 

MyNull = Null

 

MyError = CVErr(32767)

 

Print #1; MyBool;

Печать значения переменной в файл

Print # 1; MyDate; " это дата "

 

Print # 1 ; MyNull; " это пустое значение"

 

Print #1 ; My Error; " код ошибки"

 

Close #1

Закрытие файла

595

2. Запись в последовательный файл В последовательный файл запись информации выполняется командой:

Write #номер_файла; [<выходной_список_переменных>]

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

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

В запись файла вставляется символ возврата каретки (переход на новую строку запись файла).

Пример 19.30. Запись информации в последовательный файл

3. Вывод данных в файл произвольного доступа Вывод данных выполняется оператором:

Put [#номер_файла; [#записи],<переменная>

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

Get, Put, Seek.

Пример 19.31. Запись в файл произвольного доступа

Текст программы

Комментарий

596

Type Record

Объявление пользовательского типа

ID As Integer

данных для записи

 

Name As String * 20

 

End Type

 

Dim MyRecord As Record

Объявление переменной на основе

 

пользовательского типа данных

Open "TESTFILE" For Random As

Открытие файла произвольного

#1 Len = Len(MyRecord)

доступа с длиной, соответствующей

 

длине объявленного типа

For RecordNumber = 1 To 5

Организация цикла для записи в файл

MyRecord.ID = RecordNumber

Формирование содержимого записи

MyRecord.Name = "Запись номер

 

-" & RecordNumber

 

Put #1, RecordNumber, MyRecord

Непосредственная запись в файл

Next RecordNumber

Конец цикла

Close #1

Закрытие файла

Ввод информации из файла

1. Чтение данных из последовательного файла Чтение выполняется оператором:

Input #номер_файла; <список_переменных>

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

Пример 19.32. Запись в файл произвольного доступа

Текст программы

Комментарий

Open "FILE" For Input As #1

Открытие файла

Do While Not EOF(l)

Цикл до конца файла

Input # 1 ; MyString; MyNumber

Чтение данных записи в переменные

Debug.Print MyString; MyNumber

Печать считанных данных

Loop

Конец цикла

Close #1

Закрытие файла

Другим оператором чтения из последовательного файла является

Line Input #номер_файла; <переменная>

Оператор обеспечивает посимвольное считывание данных строки по файлу до обнаружения символа "возврат каретки" (Chr(13)) и присвоение этих данных указанной переменной символьного типа.

Пример 19.33. Построчное чтение из файла последовательного доступа

Текст программы

Комментарий

Open "TESTFILE" For Input As #1

Открытие файла

Do While Not EOF(l)

Цикл, пока не достигнут конец файла

Line Input #1, TextLine

Чтение строки в переменную

Debug.Print TextLine

Печать в окне Debug

Loop

Конец цикла

Close #1

Закрытие файла

2. Чтение данных из файла произвольного доступа

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

597

Get Put [#номер_файла; [#записи],<переменная>

Пример 19.34. Чтение из файла произвольного доступа

Позиционирование на запись в файле

Позиция в записи (номер байта или номер записи) для очередного чтения или записи в файл устанавливается оператором:

Seek [#] номер_файла; позиция

где позиция число в диапазоне номеров байтов (1 - 2 147 483 647) файла.

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

Пример 19.35. Позиционирование в файле последовательного доступа

Текст программы

Комментарий

Dim MyChar As String

Объявление переменной на основе

 

пользовательского типа данных

Open "FILE" For Input As #1

Открытие файла произвольного доступа с длиной,

 

соответствующей длине объявленного типа

MaxSize = LOF(l)

Вычисление количества байтов в файле

 

 

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

Пример 19.36. Позиционирование в файле произвольного доступа

598

ДИАЛОГОВЫЕ ОКНА

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

Диалоговые окна для обмена сообщениями

Встроенная функция MsgBox() обеспечивает создание диалоговых окон различных типов. 1. Простое окно-сообщение

MsgBox ("строка_сообщения")

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

Пример 19.37. Вывод сообщения о значении переменной

Текст программы

Комментарий

Option Explicit

Обязательность объявления всех

 

переменных в модуле перед их

 

использованием

Sub Msg_Priim()

Объявление процедуры

Dim a As Single

Объявление переменной

Randomize

Запуск генератора случайных чисел

 

Присвоение переменной значения

a=rnd

случайного числа

MsgBox "Значение

Вывод сообщения

 

случайного числа " & Str(a)

Конец процедуры

End Sub

 

В результате выполнения процедуры будет выведено окно (рис. 19.23).

599

Рис. 19.23. Окно-сообщение

2. Окно-сообщение с командными кнопками Общий формат оператора:

MsgВох("строка_сообщение"[, <кнопки>] [, "заголовок_окна"] [, <файл-подсказки>, <контекст>])

где <строка_сообщение>

- максимальная длина строки – 1024 символа;

<кнопки>

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

 

пиктограммы, или имена кнопок;

<заголовок_окна>

- строка символов;

<файл-подсказки>

- имя файла-подсказки для контекстно-зависимой помощи при работе в

 

окне, строка символов;

<контекст>

- число, которое назначено подсказке для данного окна.

Коды задания командных кнопок и пиктограмм в функции MsgBox() приведены в табл. 19.7. Функция MsgBox() возвращает код (число), соответствующий нажатой кнопке.

Таблица 19.7. Список видов командных кнопок и их кодов

Код

Константа

Описание

 

 

Коды командных кнопок

0

vbOKOnly

OK

1

vbOKCancel

OK, Отмена

2

vbAbortRetryIgnore

Прекратить, Повторить, Игнорировать

3

vbYesNoCancel

Да, Нет, Отмена

4

vbYesNo

Да, Нет

5

vbRetryCancel

Повторить, Отмена

Пример 19.38. Формирование диалогового окна с кнопками

Текст программы

Комментарий

600