Программирование VBA. Федеральное агентство по образованию государственное образовательное учреждение высшего профессионального образования
Скачать 2.93 Mb.
|
2.14. Файлы VBA 2.14.1. Типы файлов в VBA В VBA допустима работа с тремя типами текстовых файлов. Файл последователь- ного доступа Последовательность строк произвольной длины, разделенных специальными символами. Чтение и запись в файл производится построчно Файл произвольного доступа Состоит из записей фиксированной длины и раз- мер записи указывается при его открытии. Это позволяет локализовать любую запись в файле по ее номеру Бинарный файл Является частным случаем файла произвольного доступа. Размер записи в бинарном файле счи- тается равным 1 байту 108 2.14.2. Открытие и закрытие файла Обсудим инструкции, связанные с открытием файла для операций ввода/вывода, а также с закрытием файла по завершению работы с ним. Open Разрешает выполнение операций ввода/вывода при работе с файлом. Формат инструкции: Open Путь For Режим [Access Доступ] [Блокировка] As [ # ] НомерФайла [Lеn=Длина] Путь – строковое выражение, указывающее имя файла Режим – устанавливает режим работы с файлом. Допустимые Зна- чения: Append, Binary, Input, Output или Random Доступ – устанавливает операции, разрешенные с открытым фай- лом. Допустимые значения: Read, Write или Read Write Блокировка – устанавливает операции, разрешенные с открытым файлом другим процессам. Допустимые значения: Shared, Lock Read, Lock Write и Lock Read Write Номер-файла – допустимый номер файла. Число в интервале от 1 до 255. Длина – число, меньшее либо равное 32 767 (байт). Close Завершает операции ввода/вывода с файлом, открытым с помощью инст- рукции Open. Формат инструкции: Close [СписокНомеровФайлов] Аргумент СписокНомеровФайлов может представлять один или несколько номеров файлов. При этом используется следующий синтаксис, где но- мерФайла представляет любой допустимый номер файла: [[#] номерФай- ла] [, [#] номерФайла] ... Если СписокНомеровФайлов не указан, инструкция Close закрывает все активные файлы, открытые инструкцией Open. Reset Закрывает все активные файлы, открытые с помощью инструкции Open, и записывает содержимое всех буферов файлов на диск, открытых с помо- щью инструкции Open. Формат инструкции: Reset FreeFile Функция возвращает доступный номер, который может использоваться в инструкции Open. 109 Приведем пример инструкции, открывающей для записи бинарный файл Первый из рабочей папки, и затем инструкции, закрывающей этот бинар- ный файл. Open "Первый" For Binary Access Write As #1 Close #1 2.14.3. Ввод данных в файл последовательного доступа Записывает форматированные данные в файл последовательного доступа. Формат инструкции: Print # НомерФайла, [СписокВывода] Номерфайла – любой допустимый файловый номер СписокВывода – выражение или список выражений, записываемое в файл. В аргументе СписокВывода разделителем списка выводимых выражений является ";" (данные выводятся подряд) или "," (данные выводятся по зонам). Write # Записывает неформатированные данные в файл последовательного дос- тупа. В отличие от инструкции Print, инструкция write вставляет запятые между элементами и заключает строки в кавычки по мере записи их в файл. Формат инструкции: Write #НомерФайла, [СписокВывода] НомерФайла – любой допустимый файловый номер СписокВывода – выражение или список выражений, записываемых в файл Данные, записанные с помощью инструкции Write, обычно счи- тываются из файла с помощью инструкции Input. Приведем две процедуры, использующие инструкции Print и Write для соз- дания файлов последовательного доступа. Sub ПримерИспользованияPrint() Open "Новый" For Output As #1 ' Print #1, "Тест" ' Печатает текст в файл ' Print #1, ' Печатает пустую строку в файл ' Print #1, "Зона 1"; Tab; "Зона 2"; Spc(3); "3 пробела" ' Печатает в двух зонах печати 110 ' Close #1 End Sub Sub ПримерИспользованияWrite() Open "ЕщеПример" For Output As #1 Write #1, "Пример"; "использования" Write #1, "инструкции" Write #1, "Write" x = 1 Write #1, "Число"; Close #1 End Sub Результатом описанных выше инструкций будет файл со следующим со- держимым: "Пример","использования" "инструкции","Write" "Число",1 Следует обратить внимание на автоматическое размещение в файле разделителей – запятых и то, что строковая информация берется в кавыч- ки. В процедуре ПримерИспользованияWrite вторая инструкция Write спе- циально заканчивается знаком ";". Это обеспечивает вывод данных треть- ей инструкцией Write в ту же строку файла, в которую выводила вторая инструкция. 2.14.4. Вывод данных из файла последовательного доступа Input # Считывает данные из открытого файла последовательного доступа и при- сваивает их переменным. Данные, считываемые с помощью инструкции Input #, обычно записываются в файл с помощью инструкции Write #. Формат инструкции: Input # НомерФайла, СписокПеременных Номерфайла – любой допустимый файловый номер СписокПеременных – список разделённых запятыми переменных, которым следует присвоить значения, считанные из файла Line Input # Считывает одну строку из открытого файла последовательного доступа и присваивает ее переменной типа String. Данные, считываемые с помощью инструкции Line input #, как правило, записываются в файл с помощью ин- струкции Print #. Формат инструкции: Line Input #НомерФайла, ИмяПеременной 111 Синтаксис инструкции Line Input # содержит следующие элементы: НомерФайла – номер файла ИмяПеременной – имя переменной типа Variant или String Функция Input Возвращает значение типа String, содержащее символы из файла, откры- того в режиме Input или Binary. Функция input считывает данные, записы- ваемые в файл с помощью инструкции Print # или Put. Формат инструкции: Input (Число, [#] НомерФайла) Число задает число возвращаемых символов. Если аргумент Число равен 1, то производится посимвольное считывание данных. Функция EOF Функция возвращает значение True при достижении конца файла. Формат инструкции: EOF (НомерФайла) При последовательном считывании информации из файла часто исполь- зуется следующий цикл: Do While Not EOF(l) Loop или While Not EOF (I) Wend. Пример Ниже приведены две процедуры: ЗаписьПоследоватФайла и ЧтениеПоследоватФайла,– в которых создаётся, а затем читается файл Ведомость, размещаемый в папке E:\VBA_INTERNET. При чтении файла, созданного процедурой ЗаписьПоследоватФайла, отличие действия инст- рукций Input и Line Input в процедуре ЧтениеПоследоватФайла проявятся при чтении записи, созданной инструкцией Write #1, "Алексеев С.С.", 206709, "Информатика", "Отлично". Инструкция Line Input #1, Ввод счи- тает ее целиком в переменную Ввод, в то время, как инструкция Input #1, Ввод считывает записи последовательно, и для чтения всей строки дол- жен выполниться четыре раза. Sub ЗаписьПоследоватФайла() Open "e:\VBA_INTERNET\Ведомость" For Output As #1 Print #1, "Алексеев С.С.", 206709 Print #1, "Информатика" Write #1, "Отлично" Write #1, "Алексеев С.С.", 206709, "Информатика", "Отлично" Close #1 End Sub Sub ЧтениеПоследоватФайла() Dim Ввод Open "e:\VBA_INTERNET\Ведомость" For Input As #1 Input #1, Ввод: MsgBox Ввод Input #1, Ввод: MsgBox Ввод 112 Input #1, Ввод: MsgBox Ввод Line Input #1, Ввод: MsgBox Ввод Close #1 End Sub Ниже приведены диалоговые окна, выводимые инструкцией MsgBox. 2.14.5. Работа с файлом произвольного доступа Приведем инструкции ввода/вывода информации при работе с фай- лом произвольного доступа, а также инструкции определения длины фай- ла и текущей позиции указателя в файле. Put Записывает содержимое переменной в файл произвольного доступа. Формат инструкции: Put [#] НомерФайла, [НомерЗаписи] , ИмяПеременной НомерФайла – номер файла НомерЗаписи – номер записи (режим Random) или номер байта (режим Binary), с которого следует начать запись. Если аргумент НомерЗаписи опущен, то записывается на то место, где был уста- новлен указатель после выполнения последней инструкции Get или Put, либо куда он переведен с помощью функции Seek ИмяПеременной – имя переменной, содержащей данные, которые следует записать в файл Get Читает данные из открытого файла произвольного доступа в переменную. Формат инструкции: Get [#] НомерФайла, [НомерЗаписи] , ИмяПеременной НомерФайла – номер файла НомерЗаписи – номер записи (для файлов в режиме Random) или номер байта (для файлов в режиме Binary), с которого следует на- чать чтение 113 Имяпеременной – имя переменной, в которую следует поместить считанные данные Seek Функция возвращает значение типа Long, определяющее текущее поло- жение указателя чтения/записи внутри файла, открытого с помощью инст- рукции Open. Формат функции: Seek (НомерФайла) LOF Функция возвращает значение типа Long, представляющее размер файла в байтах, открытого с помощью инструкции Оpen . Для определения раз- мера закрытого файла следует использовать функции FileLen. Формат функции: LOF (НомерФайла) FileLen Функция возвращает значение типа Long, содержащее размер файла в байтах. Формат функции: FileLen (Путь ) Как видно из приведенного в предыдущем разделе примера для счи- тывания информации при помощи инструкции Input #, файл последова- тельного доступа иногда удобно задавать как последовательность запи- сей, причем каждая из записей формируется из группы полей. В файле последовательного доступа существует только одна внутренняя структура, образованная разделителями: запятыми или специальными символами, обозначающими переход на новую строку. В противоположность файлам последовательного доступа, в файлах произвольного доступа запись является встроенным элементом. Файл произвольного доступа – это файл, упорядоченный по номерам записей, что позволяет быстро переместиться на любую запись, минуя предыду- щие. При создании файла произвольного доступа указывается макси- мальная длина каждой записи. Само собой разумеется, что в любую за- пись можно вводить данные, занимающие не всё место, выделенное для записи, но нельзя ввести данные, требующие больше места, чем допусти- мая длина записи. Лишняя информация будет просто усекаться. Отметим, что при открытии файла произвольного доступа, в отличие от файла последовательного доступа, не надо специально указывать, от- крывается он для ввода или вывода информации. Ввод и вывод информа- ции определяют команды Put и Get. Приведем пример работы с файлом произвольного доступа Ведо- мость. Файл создается с помощью процедуры ЗаписьВФайлПД, которая 114 последовательно считывает данные из первого и второго столбца рабоче- го листа и затем вводит их в файл. В этой процедуре число вводимых за- писей фиксировано и равно 3. Процедура СчитываниеИзФайлаПД произ- водит обратное действие – считывает данные из файла и вводит их в ячейки третьего и четвертого столбца рабочего листа. При работе с файлом произвольного доступа можно определить чис- ло записей, не пересчитывая их. Число записей равно отношению размера файла к длине одной записи. Длина записи устанавливается при создании файла произвольного доступа и определяется типом переменной, при по- мощи которой файл был создан. Размер открытого файла определяется функцией LOF, а еще не открытого – функцией FileLen. В рассматривае- мом случае число записей в файле равно LOF(l) / Len(Студент). Структура записи Студент определяется на модульном уровне, т.е. перед первой процедурой модуля. Type Студент Фамилия As String * 20 Оценка As String * 5 End Type Sub ЗаписьВФайлПД() Dim Студент As Студент Dim i As Integer Open "Список" For Random As #1 Len = Len(Студент) For i = 2 To 4 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(1) / Len(Студент) + 1 For i = 2 To n Get #1, i, Студент With Студент Cells(i, 3).Value = .Фамилия Cells(i, 4).Value = .Оценка End With 115 Next i Close #1 End Sub Ниже приведены таблицы Excel до и после выполнения процедуры Счи- тываниеИзФайлаПД. 2.15. Создание процедуры Создание первой процедуры проекта требует выполнения двух по- следовательных шагов: 1. вставка модуля в рабочую книгу; 2. написание процедуры в этом модуле. Приложение может содержать один или несколько модулей. Имея не- сколько модулей, можно организовать их по назначению, виду и т.п. Соз- дадим процедуру, которая будет выводить на экран окно сообщения. Для создания этой процедуры нужно выполнить следующие действия. 1. Открыть новую рабочую книгу. Выполнить команду Сервис > Макрос > Редактор Visual Basic. Откроется окно редактора Visual Basic. В левой части окна редактора Visual Basic появится окно проектов Project Explorer. Если окно проектов не появится, надо нажать комбинацию клавиш 116 2. Если окно проектов VBAProject (Книга1)не откроется, то открыть его, щелкнув левой кнопкой мыши по значку элемента VBAProject (Книга1). 3. Щелкнуть правой кнопкой мыши на элементе ЭтаКнига. В появив- шемся контекстном меню выбрать команду Insert > Module. В прило- жение будет добавлен модуль. + 117 В верхней части окна кода модуля находится инструкция Option Explicit, которая принуждает явно описывать все переменные с помощью инструкций Dim, Private, Public, ReDim и Static. Если попытаться использо- вать переменную без её объявления, то при компиляции кода будет выда- на ошибка. Эта инструкция в новом модуле появляется только тогда, когда в диалоговом окне Options на вкладке Editor установлен флажок опции RequireVariableDeclaration. Диалоговое окно Options открывается коман- дой Tools > Options. 4. Выполнить команду Insert > Procedure. Откроется диалоговое окно Add Procedure. 5. Ввести имя процедуры, например, ПерваяПроцедура. В секции Туре установить переключатель Sub. 6. Щелкнуть на кнопке ОК. В пустой строке находится текстовый курсор, предлагая начать ввод кода процедуры. 7. Нажать клавишу Таb и ввести следующий текст: MsgBox "Это процедура VBA" После того как введено MsgBox и нажата клавиша пробела, появится окно с информацией о данной инструкции. Делать отступ текста с помо- щью клавиши Таb не обязательно. Отступ делается для более легкого чтения кода. 7. Нажать клавишу Enter. Ниже приведена введённая процедура. 118 VBA требует выполнения определенных правил для имен подпро- грамм и функций. Эти правила таковы. Первые три символа имени должны быть буквами. Имя может содержать буквы, цифры и знаки подчеркивания. Имя не может содержать пробелы, точки, запятые, восклицатель- ные знаки (!) и символы @, &, $, #. Имя не должно иметь более 255 символов. 2.16. Выполнение процедуры После создания процедуры её можно сразу выполнить. Для этого су- ществует несколько способов. Можно использовать команду Run Sub|UserForm (Выполнить подпрограмму|экранную форму) из меню Run (Выполнить) или щелкнуть на кнопке Run Sub|UserForm стандартной пане- ли инструментов или нажать клавишу F5. Итак, чтобы выполнить процеду- ру, нужно сделать следующее. 1. Щёлкнуть кнопкой Run Sub|UserForm стандартной панели инструмен- тов редактора Visual Basic. Процедура выполнится и отобразит окно сообщения: 2. Щёлкнуть кнопкой ОК. Произойдёт возврат в окно редактора Visual Basic. 2.17. Сохранение процедуры Чтобы сохранить новую процедуру, надо сохранить рабочую книгу, где находится эта процедура. Можно сохранить рабочую книгу из редактора Visual Basic. Для этого нужно: 1. выполнить команду File > Save Книга (Файл > Сохранить книгу). Если рабочая книга еще ни разу не сохранялась, дать ей имя; 2. ввести Первая в качестве имени книги и нажать клавишу Enter. Рабочая книга, модуль и процедура будут сохранены. 2.18. Запись последовательности действий пользователя Excel позволяет записывать последовательность действий пользова- теля, а затем преобразовать их в код VBA. Записанный VBA код макроса может служить основой для дальнейших разработок, а также является хо- рошим учебным материалом для изучения VBA. Например, чтобы узнать, как в VBA записать последовательность каких-либо действий, нужно запи- сать макрос, выполняющий эти действия, и затем проанализировать код макроса и при необходимости внести изменения в него. Пример 119 Создать макрос, используя запись последовательности действий пользователя, для решения следующей задачи. При работе в Excel необходимо часто вводить на рабочий лист на- именование и “шапку” таблицы, приведённой ниже. Для этого нужно выполнить следудующие действия: 1. Выделить блок ячеек A1:D1. 2. Объединить ячейки блока. 3. Ввести наименование таблицы (слово |