Базовые операторы ввода-вывода VBA и работа с файлами




Методические указания

Данные в памяти ЭВМ хранятся в виде двоичных чисел. Единственное, что может сделать процессор с данными – это извлечь содержимое некой ячейки памяти, выполнить над ним некоторое заранее оговоренное и выбранное из перечня возможных действие и занести число (результат) назад в память в ту же или другую ячейку. Вполне естественным является следующий вопрос: каким способом числа попали в ячейку памяти первоначально?

Существует всего четыре варианта ответа. Во-первых, это данные могли остаться в ячейке памяти от предыдущей программы или, если программа загружается в память сразу после включения машины, в ячейке памяти осталась случайная комбинация установок триггеров, возникшая после подачи напряжения на ОЗУ. Часто такие данные называют мусором. Во-вторых, данные могут быть размещены в ячейке вместе с программой, то есть сама программа при компиляции предусматривает некое начальное значение в конкретной ячейке памяти. В-третьих, число могло попасть в ячейку в результате выполнения команды процессора на запись данных в ОЗУ, например, при выполнении оператора присваивания. Наконец, в четвертых, число могло быть занесено в ячейку памяти в результате выполнения команды ввода.

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

Вполне естественным было бы ожидать то, что любой язык программирования высокого уровня содержит в своем составе команды или операторы ввода вывода. Поскольку на первом этапе развития вычислительной техники способы подключения устройств ввода-вывода к процессору существенно рознились, языки программирования предусматривали отдельные операторы для вывода на печать, вывода на дисплей, ввода с клавиатуры, файловой работы. В настоящее время произошла унификация подобного рода операторов. Так, в языке VBA сохранились несколько операторов, смысл которых представлен в табл. 7. Основным назначением базовых операторов ввода вывода VBA является работа с файлами. Файлпредставляет собой единицу хранения данных, имеющих конкретный смысл. Так, файл может быть программой (исполняемыми кодами), исходным текстом, документом, просто хранилищем записей. Физически файл хранится, как правило, на накопителях на магнитных дисках, хотя операционная система машины рассматривает любое внешнее устройство как приемник или источник файлов.

В VBA существует три способа организации данных в файле. Эти типы определяют и тип доступа к файлу. Различают:

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

Перед началом работы программы с файлом он должен быть открыт инструкцией Open, которая задает имя открываемого файла (включая указание пути к нему). При открытии указывается номер открываемого канала системы. Дополнительно может быть задан тип файла (последовательного доступа, произвольного доступа, двоичный), ключ записи и состояние файла (для чтения, записи или добавления). Кроме этого для файла может быть указан его задаваемый размер в байтах. Номер свободного канала может быть определен предварительно с помощью инструкции FreeFile.

Пример 21. Открытие для чтения несуществующего файла. Выполнение этого фрагмента программы приведет к выдаче системой сообщения об ошибке “Файл не найден” и прекращению работы программы.

Open "test1. sss " For Input As #1

Close #1

Пример 22. Открытие для записи не существующего файла последовательного доступа. Выполнение этого фрагмента программы приведет к созданию в текущем каталоге нового файла test1.hhh. Поскольку вывод в файл не производился, размер созданного файла 0 байт.

Dim canal As Integer

'Определение номера свободного файлового канала ввода-вывода

canal = FreeFile()

Open "test1. sss " For Output As #canal

Close #canal

Если файл уже существует, то при открытии его в состоянии Output старый файл удалится, а новый запишется на его место. Если предполагается внесение изменений в уже существующий файл, он должен быть открыт в состоянии Append.

Пример 23. Программа записи файла исходных данных для начисления зарплаты в соответствии с рис. 1

Open "Зарплата.sss" For Output As #1

'Запись в файл

Print #1, "Иванов В.Н."

Print #1, 1234

Write #1, "Трофимова Л.А."

Write #1, 1234

Write #1, "Семенова Е.Г.", 1000, "Степанов А.Г.", 900

Close #1

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

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

Type Запись_файла

Фамилия_И_О As String

Начислено_Ведомость As Currency

End Type

Тогда программа работы с файлом произвольного доступа может содержать следующие операторы:

Dim record As Запись_файла

Dim nomber As Integer, j As Integer

Open "Зарплата1.rrr" For Random As #1

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

record.Фамилия_И_О = "Иванов В.Н."

record.Начислено_Ведомость = 1234

Put #1, 1, record

'Чтение только что сделанной записи

Get #1, 1, record 'Считывается только что записанное значение из файла

record.Фамилия_И_О = "Трофимова Л.А."

'record.Начислено_Ведомость содержит считанное из файла число 1234

Put #1, 2, record

record.Фамилия_И_О = "Семенова Е.Г."

record.Начислено_Ведомость = 1000

'Запись в файл произвольного доступа по текущему номеру счетчика

Put #1,, record 'Действие с записью 3

j = Seek(1) 'Значение указателя записи равно 4

record.Фамилия_И_О = "Степанов А.Г."

record.Начислено_Ведомость = 900

Put #1, j, record

Close #1

Таблица 7. Операторы ввода вывода VBA [3]

Действие Ключевые слова
Создать или редактировать файл Open
Закрыть файл Close, Reset
Управление форматами записи Format, Print, Print #, Spc, Tab, Width #
Копирование файлов FileCopy
Чтение свойств файлов EOF, FileAttr, FileDateTime, FileLen, FreeFile, GetAttr, Loc, LOF, Seek
Определение размера файла FileLen
Установка или чтение атрибутов файлов FileAttr, GetAttr, SetAttr
Управление свойствами файлов Dir, Kill, Lock, Unlock, Name
Чтение последовательных файлов Input #, Line Input #
Запись в последовательный файл Print #, Write #
Чтение файлов произвольного доступа или двоичных Get
Запись в файл произвольного доступа или двоичный Put
Задание номера записи файла произвольного доступа Seek

Файл произвольного доступа открывается с указанием типа Random и по умолчанию доступен для чтения и записи. Явное указание режима только чтения или только записи обеспечивается за счет добавления ключевых слов Access Read или Access Write.

Для записи в файл произвольного доступа можно воспользоваться оператором Put. Его первый параметр есть номер канала, второй – номер записи в файле (может отсутствовать), третий – имя переменной, значение которой надо записать в файл. Чтение информации из файла может быть осуществлено оператором Get, параметры которого аналогичны.

В системе существует внутренний указатель текущего номера рабочей записи файла. Его начальное значение равно нулю. Каждый раз при выполнении операторов Put и Get значение указателя становится равным номеру записи, с которой выполнялся оператор, плюс единица. Если в операторах Put и Get номер записи явно не задан, то новое действие будет выполняться с записью, номер которой содержится в указателе. Текущее значение указателя номера рабочей записи может быть получено оператором Seek. Двоичные файлы представляют собой разновидность файлов с произвольным доступом с элементарными записями размером в один байт, в связи с чем указатель текущего номера рабочей записи двоичного файла имеет смысл счетчика байтов. Программирование действий с записями двоичных файлов проводится так же, как и в случае работы с файлами произвольного доступа.

В процессе работы с файлом изменение его содержимого происходит в буфере операционной системы, а не на диске. Это обстоятельство приходится принимать во внимание, например, при отладке программы. Если при работе с отладчиком интегрированной системы отладки выполнить команду Run, Reset, то изменения файла будут потеряны. Непосредственное завершение работы с файлом и запись данных на диск происходит в момент выполнения инструкции Close. Кроме этого, запись информации на диск (закрытие файла) происходит в момент завершения работы всей пользовательской программы. Для снижения вероятности ошибок программирования целесообразно всегда после завершения действий с файлом принудительно закрывать его инструкцией Close.

Задание

Используйте согласованный с преподавателем вариант задания (табл. 1), выполненную на его основе таблицу Excel, написанную программу вычислений в таблице и созданный на ее основе класс, позволяющий производить требуемое количество таблиц и обработку данных в них. Научитесь работать с последовательными файлами и файлами произвольного доступов. Напишите программу, позволяющую сохранять исходные данные вашей таблицы в виде файлов последовательного или произвольного доступов. Включите ее в состав методов класса. Используйте сохраненные файлы в следующем сеансе работы с таблицей для восстановления в ней исходных данных.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-04-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: