Смекни!
smekni.com

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

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

Line Input #НомерФайла, ИмяПеременной

Синтаксис инструкции Line Input # содержит следующие элементы:

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

ИмяПеременной – имя переменной типа Variant или String.

Функция EOF – Функция возвращает значение True при достижении конца файла. Синтаксис:

EOF(НомерФайла)

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

Do While Not EOF(l) Loop

или, для тех пользователей, кто предпочитает инструкцию

While - Wend инструкции Do While - Loop, следующий эквивалентный цикл:

While Not EOF(l) Wend

Функция Input – возвращает значение типа String, содержащее символы из файла, открытого в режиме Input или Binary. Функция Input считывает данные, записываемые в файл с помощью инструкции Print # или Put. Синтаксис:

Input(Число, [#]НомерФайла)

Число задает число возвращаемых символов. Если аргумент число равен 1, то производится посимвольное считывание данных.

Приведем пример использования инструкции Input # для считывания данных из файла. В этом примере предполагается, что на диске существует файл ГруппаЭкономистов, содержащий информацию о студентах. Файл был создан при помощи инструкции Write # и состоит из двух столбцов, в первом из которых указывается фамилия, а во втором – оценка студента. Для удобства работы с информацией введен пользовательский тип Студенты. Процедура ПримерИспользованияInput последовательно считывает фамилии и оценки из файла и выводит их в ячейки первого и второго столбца рабочего листа.

Type Студенты

Фамилия As String * 20

Оценка As String * 3

End Type

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

Dim Студент As Студенты

Open "ГруппаЭкономистов" For Input As #2

i = 1

Do While Not EOF(2) With Студент

Input #2, .Фамилия, .Оценка

Cells (i, 1).Value = .Фамилия

Cells(i, 2).Value = .Оценка

End With

i = i + 1

Loop

Close #2

End Sub

Приведем пример использования инструкции Line Input # для считывания данных из файла ГруппаЭкономистов, имеющего ту же структуру, что и в предыдущем примере, но созданного с помощью инструкции Print #. Инструкция Line input # считывает всю строку из файла в строковую переменную. Поэтому в этом случае уже нет необходимости использовать введенный пользовательский тип, а достаточно ограничиться только обычной строковой переменной. Вся считываемая информация строка за строкой вводится список диалогового окна.

Private Sub UserForm_Initialize()

Dim Студент As String

Open "ГруппаЭкономистов" For Input As #1

i = 1

With ListBoxl

.Clear

Do While Not EOF(1)

Line Input #1, Студент

.AddItem Студент

i = i + 1

Loop

Close #1

End With

End Sub


10.5 Работа с файлом произвольного доступа

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

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

Put [#]НомерФайла, [НомерЗаписи], ИмяПеременной

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

НомерЗаписи – номер записи (режим Random) или номер байта (режим Binary), с которого следует начать запись или аргумент НомерЗаписи опущен, то записывается на то место, где был установлен указатель после выполнения последней инструкции Get или Put, либо куда он переведен с помощью функции Seek;

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

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

Get [#]Номерфайла, [НомерЗаписи], ИмяПеременной

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

НомерЗаписи – номер записи (для файлов в режиме Random) или номер байта (для файлов в режиме Binary), с которого следует начать чтение;

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

Seek – функция возвращает значение типа Long, определяющее текущее положение указателя чтения/записи внутри файла, открытого с помощью инструкции Open. Синтаксис:

Seek(Номерфайла)

LOF – Функция возвращает значение типа Long, представляющее размер файла в байтах, открытого с помощью инструкции Open. Для определения размера закрытого файла следует использовать функцию FileLen. Синтаксис:

LOF(Номерфайла)

FileLen – возвращает значение типа Long, содержащее размер файла в байтах. Синтаксис:

FileLen(Путь)

Как видно из приведенного в предыдущем разделе примера, для считывания информации при помощи инструкции Input # из файла ГруппаЭкономистов, файл последовательного доступа иногда удобно задавать как последовательность записей (в данном случае, записей о студентах), причем каждая из записей формируется из группы полей (в данном случае из полей Фамилия и Оценка). Отметим, что такая группировка по записям не является чем-то присущим файлам последовательного доступа. Это просто подход, позволяющий упростить процесс последовательного считывания записей. В файле последовательного доступа существует только одна внутренняя структура, образованная разделителями (запятыми или специальными символами, обозначающими переход на новую строку).

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

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

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

Отметим, что при открытии файла произвольного доступа, в отличие от файла последовательного доступа, не надо специально указывать, открывается он для ввода или вывода информации. Ввод и вывод информации определяют команды Put и Get.

Приведем один пример работы с файлом произвольного доступа Группа экономистов, который имеет ту же структуру, что и в предыдущем примере. Файл создается с помощью процедуры ЗаписьВФайл, которая последовательно считывает данные из первого и второго столбца рабочего листа и затем вводит их в файл. В этой процедуре число вводимых записей фиксировано и равно 5. Процедура СчитываниеИзФайла производит обратное действие – считывает данные из файла и вводит их в ячейки третьего и четвертого столбца рабочего листа. Интересной особенностью файла произвольного доступа является то, что при работе с ним можно определить число записей не пересчитывая их. Число записей равно отношению размера файла к длине одной записи. Длина записи устанавливается при создании файла произвольного доступа и определяется типом переменной, при помощи которой файл был создан, размер открытого файла возвращается функцией Lof, а еще не открытого – функцией FileLen. В рассматриваемом случае число записей в файле равно Lof (l) / Len (Студент).

Type Студенты

Фамилия As;String * 20 Оценка As String * 3

End Type

Sub ЗаписьВФайл()

Dim Студент As Студенты

Dim i As Integer

Open "ГруппаЭкономистов" For Random As #1 Len = Len(Студент)

For i = 1 To 5

With Студент

.Фамилия = Cells (i, 1).Value .

Оценка = Cells(i, 2).Value

End With

Put #1, i. Студент

Next i

Close #1

End Sub

Sub СчитываниеИзФайла() Dim Студент As Студенты Dim i As Integer

Dim n As Integer

Open "ГруппаЭкономистов" For Random As #1 Len = Len(Студент)

n = LOF(l) / Len(Студент)

For i = 1 To n

Get #1, i. Студент

With Студент

Cells(i, 3).Value = .Фамилия

Cells(i, 4).Value = .Оценка

End With

Next i Close #1

End Sub

10.6 Наиболее употребляемые инструкции и функции при работе с файлами

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

ChDir – Изменяет текущую папку. Синтаксис:

ChDir путь

ChDrive – Изменяет текущий диск. Синтаксис:

ChDrive диск

Например,ChDrive "D"

CurDir – функция возвращает текущую папку.

FileCopy – копирует файл. Синтаксис:

FileCopy source, destination

Аргументы: source – строковое выражение, указывающее имя копируемого файла; destination – строковое выражение, указывающее имя результирующего файла. Аргумент destination может содержать имя каталога или папки и диска.

FileDateTime – функция возвращает дату и время последнего изменения файла. Синтаксис:

FileDateTime(путь)

Kill – Удаляет существующий файл. Синтаксис:

Kill путь

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

MkDir – Создает новую папку. Синтаксис:

MkDir путь

RmDir – Удаляет существующую папку. Синтаксис:

RmDir путь


11. Примеры решения задач и порядок разработки программ

11.1 Линейный алгоритм

Задание

Даны константы A и B и произвольное x, вводимое с клавиатуры. Вычислить значение выражения

и вывести значение y на экран.

1 Нажимаем сочетание клавиш Alt-F11 из любого приложения MS Office.

2 В меню выбрать пункт: Insert -> UserForm.

2.2 Меняем название формы Caption (в окне Properties UserForm1) на «Иванов И.И. Гр. Д-1-2005 Задача 1», что отобразится в заголовке окна.

3 Отображаем на экране панель компонентов Toolbox

4 Помещаем (с помощью мыши) на форму надпись Label с панели Toolbox.

4.1 Меняем название надписи на «Линейный алгоритм».

5 Помещаем (с помощью мыши) на форму кнопку CommandButton1 с панели Toolbox.

5.1 Меняем название кнопки Caption на «Расчет»; увеличиваем размер кнопки.

5.2 Двойным щелчком по кнопке Расчет попадаем в окно редактирования кода программы (в данном случае – подпрограммы-обработчика события нажатия кнопки).