Смекни!
smekni.com

Основы программирования в среде Visual Basic for Application VBA (стр. 12 из 21)

Function Сумма (a As Double, Optional b As Double = 8)

Сумма = a + b

End Function

Использование неопределенного количества параметров как правило, количество передаваемых параметров в процедуру совпадает с количеством определенных у этой процедуры параметров. Однако ключевое слово ParamArray предоставляет возможность ввода в процедуру произвольного, заранее не указанного числа параметров (например, как это происходит при использовании функции рабочего листа СУММ (sum)). В качестве примера приведем процедуру, которая выполняет то же действие, что и функция рабочего листа СУММ. Отличием функции СуммаПользователя от Cумм является то, что в ней в каждое поле ввода диалогового окна мастера функций можно вводить только либо число, либо ссылку на ячейку, а не на Диапазон, как при работе с функцией СУММ.

Function СуммаПользователя (ParamArray Массив ())

s = 0

For Each a In Массив

s = s + a

Next а

CуммаПользователя = s

End Function

9.4 Область определения переменной

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

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

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

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

9.5 Время жизни переменной

Личная (Private) переменная сохраняет свое значение только пока выполняется процедура, в которой эта переменная описана. При завершении процедуры значение переменной теряется, и при повторном запуске процедуры его надо заново инициализировать. Переменные, описанные при помощи инструкции Static, сохраняют свое значение по выходу из процедуры, но пока работает программа.

9.6 Рекурсивные процедуры

В VВА возможно создание рекурсивных процедур, т. е. процедур, вызывающих самих себя. Стандартным примером рекурсивной процедуры является процедура вычисления факториала, т. е. функции, возвращающей результат произведения первых n натуральных чисел, где n — аргумент функции. Для этой функции имеется стандартное обозначение: Fact(n)=n!, где Fact (0) = 1. Ясно, что

Fact (n) = n Fact (n - 1)

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

Function Fact(n As Integer) As Integer

If n<l Then

Fact = 1

Else

Fact = Fact (n - 1) n

End If

End Function

Другим стандартным примером применения рекурсивных функций является нахождение наибольшего общего делителя двух целых чисел по алгоритму Евклида. Наибольший общий делитель (НОД) двух целых чисел это наибольшее целое, на которое делятся оба числа. Например, НОД (10, 14) = 2 и НОД (15, 31) = 1.

Алгоритм Евклида состоит в следующем:

1. Если а делится на b, то НОД(а, b) = b

2. В противном случае — НОД(а, b) = НОД(b, a Mod b)

Приводимая ниже рекурсивная функция программирует алгоритм Евклида.

Function НОД(Целое1 As Long, Целое2 As Long) As Long

If Целое2 Mod Целое1 = О Then

НОД = Целое1

Else

НОД = НОД(Целое2, Целое! Mod Целое2)

End If

End Function

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

10. Работа с файлами

10.1 Типы файлов в VBA

В VBA допустима работа с тремя типами текстовых файлов.

Файл последовательного доступа Рассматривается как последовательность строк произвольной длины, разделенных специальными символами. Чтение и запись в файл производится построчно
Файл произвольного доступа Состоит из записей фиксированной длины и размер записи указывается при его открытии. Это позволяет локализовать любую запись в файле по ее номеру
Бинарный файл Является частным случаем файла произвольного доступа. Размер записи в бинарном файле считается равным 1 байту

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

Обсудим инструкции, связанные с открытием файла для операций ввода/вывода, а также с закрытием файла по завершению работы с ним.

Open – разрешает выполнение операций ввода/вывода при работе с файлом. Синтаксис:

Open Путь For Режим [Access Доступ] [Блокировка] _

As [#]НомерФайла [Lеп=Длина]

Путь – строковое выражение, указывающее имя файла

Режим – устанавливает режим работы с файлом. Допустимые значения: Append, Binary, Input, Output или Random.

Доступ – устанавливает операции, разрешенные с открытым файлом. Допустимые значения: Read, write или Read Write/

Блокировка – устанавливает операции, разрешенные с открытым файлом другим процессам. Допустимые значения:

Shared, Lock Read, Lock Write и Lock Read Write.

НомерФайла — допустимый номер файла. Число в интервале от 1 до 255. Обратите внимание на то, что параметру НомерФайла предшествует символ #. Значение НомерФайла нельзя изменять, пока файл открыт. Но при следующем открытии файла НомерФайла может быть другим числом.

Длина – число, меньшее либо равное 32 767 (байт). Для файлов, открытых в режиме Random, это значение является длиной записи. Для файлов с последовательным доступом это значение является числом буферизуемых символов.

Close. Про инструкцию open важно также знать, что во время ее работы VBA также резервирует файловый буфер в памяти компьютера для ускорения процесса записи и считывания (прямое записывание информации на диск может существенно замедлить выполнение программы, что особенно заметно при работе с большими файлами). Максимальное число файловых буферов устанавливается в системном файле Config.sys.

Завершает операции ввода/вывода с файлом, открытым с помощью инструкции open. Эта инструкция очищает буфер и указывает операционной системе обновить FAT (таблицу размещения файлов). Важно, чтобы каждый файл по завершении работы с ним был закрыт, иначе это может привести к частичной потере информации. Синтаксис:

Close [СписокНомеровФайлов]

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

[[#]НомерФайла] [, [#]НомерФайла] ...

FreeFile – функция возвращает доступный номер, который может использоваться в инструкции Open.

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

Open "Первый" For Binary Access Write As #1

Close #1

10.3 Ввод данных в файл последовательного доступа

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

Print – записывает форматированные данные в файл последовательного доступа. Синтаксис:

Print #НомерФайла, [СписокВывода]

НомерФайла – Номер файла

СписокВывода – выражение (или список выражений), записываемое в файл. В аргументе СписокВывода разделителем списка выводимых выражений является "," (данные выводятся подряд) или "," (данные выводятся по зонам). Кроме того, в аргументе СписокВывода допускается использование функций Spc и Tab:

• Spc (n) – используется для вставки n пробелов в файл

• Tab (n) – устанавливает курсор в столбец с номером n

Write – Записывает неформатированные данные в файл последовательного доступа. В отличие от инструкции Print, инструкция Write вставляет запятые между элементами и заключает строки в кавычки по мере записи их в файл. Синтаксис:

Write #НомерФайла, [СписокВывода]

НомерФайла – номер файла;

СписокВывода – выражение или список выражений записываемых в файл

Данные, записанные с помощью инструкции Write, обычно считываются из файла с помощью инструкции Input.

Приведем две процедуры, использующие инструкции Print и Write для создания файлов последовательного доступа. Сначала рассмотрим процедуру с инструкцией Print.

Sub ПримерИспользованияРгint

Open "С:&bsol;Новый" For Output As #1

' Печатает текст в файл Print #1, "Тест"

' Печатает пустую строку в файл I

Print #1,

' Печатает в двух зонах печати

Print #1, "Зона 1"; Tab; "Зона 2" ; Spc(3); "3 пробела"

Close #1

End Sub

Результатом описанных выше инструкций будет файл со следующим содержимым:

Тест

Зона 1 Зона 2 3 пробела

Перейдем теперь к примеру процедуры, создающей файл последовательного доступа при помощи инструкции Write.

Sub ПримерИспользованияWrite

Open "ЕщеПример" For Output As #1

Write #1, "Пример"; "использования"

Write #1, "инструкции";

Write #1, "Write"

x = 1

Write #1, "Число"; x Close #1

End Sub

Результатом описанных выше инструкций будет файл со следующим содержимым:

"Пример","использования" "инструкции","Write"

"Число",1

Обратите внимание на автоматическое размещение в файле разделителей-запятых, и на то, что строковая информация берется в кавычки. В процедуре ПpимepИспользованияWrite вторая инструкция Write специально заканчивается знаком ";". Это обеспечивает вывод данных третьей инструкцией Write в ту же строку файла, в которую выводила вторая инструкция.

10.4 Вывод данных из файла последовательного доступа

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

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

Input #НомерФайла, СписокПеременных

НомерФайла – номер файла

СписокПеременных – список переменных, следует присвоить значения, считанные из файла. Переменные в списке разделяются запятыми.