Vba excel конец файла

Return to VBA Code Examples

EOF Description

Returns the value indicating if the end of a file has been reached (Boolean).

EOF Syntax

In the VBA Editor, you can type  “EOF(” to see the syntax for the EOF Function:

The EOF function contains an argument:

FileNumber: Any valid file number.

Examples of Excel VBA EOF Function

To test the EOF function, create a text file “test.txt” on the D drive.(D:test.txt) Assume that the content of the file is as following.

abc
1 2 3
xy z

Please run the following code.

Sub Input_Fx_Example()
    Dim strContent As String
    Dim MyChar
    Open "D:test.txt" For Input As #1    ' Open file.
    Do While Not EOF(1)    ' Loop until end of file.
        MyChar = Input(1, #1)    ' Get one character.
        strContent = strContent & MyChar '
    Loop
    MsgBox strContent
    Close #1    ' Close file.
End Sub

Then, the result will be as following.

Here, used EOF function to determine that  the end of a file has been reached.

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

Чтение и запись в файл, открытый с помощью оператора Open. Операторы Input, Line Input, Write и функция EOF. Примеры использования в VBA Excel.

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

Оператор Input #

Оператор Input # считывает данные из открытого файла с последовательным доступом и присваивает эти данные переменным.

Оператор Input # используется только с файлами, открытыми в режиме Input или Binary. При прочтении стандартные строковые или числовые значения присваиваются переменным без изменения.

Синтаксис оператора Input #:

Input #Номер_файла, Переменные

Компоненты оператора Input #:

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

Особенности применения оператора Input #:

  • Элементы данных в файле должны быть указаны в том же порядке, что и переменные в списке Переменные, и соответствовать им по типу данных. Если переменная числовая, а данные текстовые, этой переменной будет присвоено нулевое значение.
  • Если при чтении данных достигнут конец файла, чтение прерывается и возникает ошибка. Для ее предупреждения в коде VBA Excel используется функция EOF.
  • Чтобы данные из файла могли быть правильно прочитаны и записаны в переменные с помощью оператора Input #, они должны быть записаны в файл с помощью оператора Write #. Он обеспечивает правильное разделение каждого из полей (элементов) данных.

Оператор Line Input #

Оператор Line Input # считывает одну строку из открытого файла с последовательным доступом и присваивает ее значение строковой переменной.

Оператор Line Input # считывает из файла по одному символу до тех пор, пока не встретится символ возврата каретки (Chr(13)) или последовательность символа возврата каретки и перевода строки (Chr (13) + Chr(10)).

Синтаксис оператора Line Input #:

Line Input #Номер_файла, Переменная

Компоненты оператора Line Input #:

  • Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
  • Переменная – обязательный параметр, представляющий из себя имя переменной, объявленной как String или Variant, которой присваивается строка, считанная из файла.

Оператор Write #

Оператор Write # записывает данные в файл с последовательным доступом.

Синтаксис оператора Write #:

Write #Номер_файла, [Данные]

Компоненты оператора Write #:

  • Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
  • Данные – необязательный параметр, представляющий из себя одно или несколько числовых или строковых выражений, разделенных запятой, которые нужно записать в файл.

Особенности применения оператора Write #:

  • Данные, записанные с помощью оператора Write #, считываются из файла с помощью оператора Input #.
  • Если опустить параметр Данные и добавить запятую после Номер_файла, в файл будет добавлена пустая строка.
  • Несколько выражений в списке Данные могут быть разделены точкой с запятой или запятой.
  • Числовые данные всегда записываются с точкой в качестве разделителя целой и дробной части.
  • Оператор Write # вставляет запятые между элементами и прямые парные кавычки вокруг строк при их записи в файл.
  • После записи в файл последнего символа из параметра Данные оператор Write # вставляет символы возврата каретки и перевода строки (Chr (13) + Chr(10)).

Функция EOF

Функция EOF возвращает логическое значение True, когда достигнут конец файла, открытого для последовательного (Input) или произвольного (Random) доступа.

Синтаксис функции EOF:

Номер_файла – это номер, присвоенный файлу при открытии с помощью оператора Open.

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

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

Пример 1
Открытие (или создание, если он не существует) текстового файла для чтения и записи и запись в него одной строки, состоящей из двух текстовых и одного числового значений. Файл с именем myFile1.txt будет создан в той же папке, где расположен файл Excel с кодом VBA.

Sub Test1()

Dim ff As Integer

‘Получаем свободный номер для открываемого файла

ff = FreeFile

‘Открываем (или создаем) файл для чтения и записи

Open ThisWorkbook.Path & «myFile1.txt» For Output As ff

‘Записываем в файл одну строку

Write #ff, «Дает корова молоко!», _

«Куда идет король?», 25.35847

‘Закрываем файл

Close ff

‘Открываем файл для просмотра

ThisWorkbook.FollowHyperlink (ThisWorkbook.Path & «myFile1.txt»)

End Sub

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

Пример 2
Открытие (или создание, если он не существует) файла без расширения для чтения и записи и запись в него трех строк: двух текстовых и одной в числовом формате. Файл с именем myFile2 будет создан в той же папке, где расположен файл Excel с кодом VBA.

Так как у файла нет расширения, Windows выведет диалоговое окно для выбора открывающей его программы. Выберите любой текстовый редактор или интернет-браузер.

Sub Test2()

Dim ff As Integer

‘Получаем свободный номер для открываемого файла

ff = FreeFile

‘Открываем (или создаем) файл для чтения и записи

Open ThisWorkbook.Path & «myFile2» For Output As ff

‘Записываем в файл три строки

Write #ff, «Дает корова молоко!»

Write #ff, «Куда идет король?»

Write #ff, 25.35847

‘Закрываем файл

Close ff

‘Открываем файл для просмотра

ThisWorkbook.FollowHyperlink (ThisWorkbook.Path & «myFile2»)

End Sub

Пример 3
Считываем строку, разделенную на отдельные элементы, из файла myFile1.txt и записываем в три переменные, по типу данных соответствующие элементам.

Sub Test3()

Dim ff As Integer, str1 As String, _

str2 As String, num1 As Single

‘Получаем свободный номер для открываемого файла

ff = FreeFile

‘Открываем файл myFile1.txt для чтения

Open ThisWorkbook.Path & «myFile1.txt» For Input As ff

‘Считываем строку из файла и записываем в переменные

Input #ff, str1, str2, num1

Close ff

‘Смотрим, что записалось в переменные

MsgBox «str1 = « & str1 & vbNewLine _

& «str2 = « & str2 & vbNewLine _

& «num1 = « & num1

End Sub

Попробуйте заменить в этом примере строку Input #ff, str1, str2, num1 сначала на строку Input #ff, str1, затем на строку Line Input #ff, str1, чтобы наглядно увидеть разницу между операторами Input # и Line Input #.

В следующих примерах (4 и 5) замена оператора Input # на Line Input # не приведет ни к каким изменениям, так как данные в строках файла myFile2 не разделены на элементы (поля).

Пример 4
Считываем поочередно три строки из файла myFile2 и записываем в три элемента массива, объявленного как Variant, так как в этот файл ранее были записаны две строки с текстом и одна с числом.

Sub Test4()

Dim ff As Integer, a(2) As Variant, i As Byte

‘Получаем свободный номер для открываемого файла

ff = FreeFile

‘Открываем файл myFile2 для чтения

Open ThisWorkbook.Path & «myFile2» For Input As ff

‘Считываем строки из файла и записываем в элементы массива

   For i = 0 To 2

      Input #ff, a(i)

   Next

Close ff

‘Смотрим, что записалось в элементы массива

MsgBox «a(0) = « & a(0) & vbNewLine _

& «a(1) = « & a(1) & vbNewLine _

& «a(2) = « & a(2)

End Sub

Пример 5
Считываем с помощью цикла Do While… Loop все строки из файла myFile2 и записываем построчно в переменную, объявленную как String (число из третьей строки запишется как текст). Для остановки цикла при достижении конца файла используем функцию EOF.

Sub Test5()

Dim ff As Integer, a As Variant, b As String

‘Получаем свободный номер для открываемого файла

ff = FreeFile

‘Открываем файл myFile2 для чтения

Open ThisWorkbook.Path & «myFile2» For Input As ff

‘Считываем строки из файла и записываем в элементы массива

   Do While Not EOF(ff)

      Input #ff, a

      b = b & a & vbNewLine

   Loop

Close ff

‘Смотрим, что записалось в переменную

MsgBox b

End Sub


Предыдущая часть темы об открытии файла для ввода и вывода информации опубликована в статье: Оператор Open (синтаксис, параметры). Смотрите также связанную статью: Функция FreeFile.

Смотрите, как создавать и открывать текстовые файлы с помощью методов CreateTextFile и OpenTextFile. Чтение файла, запись и добавление информации с помощью объекта TextStream.


EOF

EOF(FileNumber)

Функция EOF(End Of File) проверяет, достигнут ли конец файла. С помощью этой функции можно избежать ошибок, возникающих при попытках чтения или записи после достижения конца файла. Функция EOF возвращает значение False до тех пор, пока не будет достигнут конец файла. При использовании с файлами, открытыми в режиме Random или Binary, функция EOF возвращает значение True, если последней выполненной инструкции Get не удалось считать целую запись; в противном случае возвращается значение False.
Для файлов, открытых для доступа в режиме Binary, попытка чтения файла с помощью функции Input до возвращения функцией EOF значения True приводит к ошибке. При чтении двоичных файлов с помощью функции Input следует вместо функции EOF использовать функции LOF и Loc или использовать с функцией EOF инструкцию Get

Возвращаемое значение

Функция возвращает значение типа Integer, содержащее логическое значение True, при достижении конца файла
Примечание При обработке файлов, открытых с помощью Output, функция EOF всегда возвращает True

Параметры

FileNumber
Обязательный аргумент типа Integer, указывающий на любой допустимый номер файла

Пример

' В данном примере функция EOF
' используется для обнаружения конца файла. Предполагается,
' что MYFILE является текстовым файлом, который содержит
' несколько строк текста
Dim InputData
 ' Открываем файл для чтения
Open "MYFILE" For Input As #1
Do While Not EOF(1) ' Достигнут ли конец файла?
 Line Input #1, InputData ' Читаем строку данных
 Debug.Print InputData ' Выводим в окно отладки
Loop
' Закрываем файл
Close #1 

Категория
Функции работы с файлами

Главная » Функции VBA »

28 Апрель 2011              99055 просмотров

  • CurDir() — функция, которая возвращает путь к каталогу(для указанного диска), в котором по умолчанию будут сохраняться файлы:
        Dim sCurDir As String
        sCurDir = CurDir("D")
  • Dir() — позволяет искать файл или каталог по указанному пути на диске. Пример использования можно посмотреть в статье: Просмотреть все файлы в папке
  • EOF() — при операции записи в файл на диске эта функция вернет True, если вы находитесь в конце файла. Обычно используется при работе с текстовыми файлами — .txt. При сохранении книг Excel лучше использовать стандартные методы: Save и SaveAs.
  • Error() — позволяет вернуть описание ошибки по ее номеру. Генерировать ошибку нужно при помощи метода RaiseError() специального объекта Er.
  • Print — записывает в открытый файл указанный текст. Далее будет приведен пример использования данной функции
  • FreeFile() — позволяет определить номер следующего свободного файла, который можно использовать как номер файла при его открытии методом Open. Предпочтительно применять именно этот метод определения номера файла(вместо статичного #1), чтобы не было неоднозначности обращения к файлам. Ниже приведены примеры применения данной функции при обращении к файлам
  • FileAttr() — позволяет определить, как именно был открыт файл в файловой системе: на чтение, запись, добавление, в двоичном или текстовом режиме и т.п. Применяется для работы с текстовыми файлами, открытыми при помощи Open "C:Text1.txt" For [] As #1
    Открыть файл можно несколькими способами, приведу примеры наиболее распространенных вариантов:

    • Input() — открывает текстовый файл на чтение. Т.е. таким методом можно открыть файл и вытянуть из него данные. Например, чтобы считать информацию из файла C:Text1.txt и вывести ее в окно Immediate можно применить такой код:
          Dim MyChar
          Open "C:Text1.txt" For Input As #1 'Открываем файл функцией Open() на чтение(Input)
          Do While Not EOF(1)  'пока файл не кончился
              ' Получаем по одному символу и добавляем его к предыдущим
              MyChar = MyChar & Input(1, #1)
          Loop
          Close #1 ' Закрываем файл
          'Выводим его содержание в окно Immediate
          '(отобразить Immediate: Ctrl+G в окне редактора VBA)
          Debug.Print MyChar
          'или в MsgBox
          MsgBox MyChar, vbInformation, "www.excel-vba.ru"
    • Ouput() — метод открывает файл для записи. Например, чтобы записать в файл строку, содержащую все ячейки в выделенном диапазоне, можно использовать такой код:
      Sub SelectionToTxt()
          Dim s As String, rc As Range
          Dim ff
          'запоминаем все значения из выделенной строки в строку
          For Each rc In Selection
              If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки
                  s = rc.Value
              Else 'если уже записано - добавляем через TAB
                  s = s & vbTab & rc.Value
              End If
          Next
          ff = FreeFile
          'Открываем текстовый файл
          'если файла нет - он будет создан
          Open "C:Text1.txt" For Output As #ff
          'записываем значение строки в файл
          Print #ff, s
          Close #ff ' Закрываем файл
      End Sub

      Важно помнить, что при открытии файла таким методом(Output) все предыдущие данные из файла стираются и в файле будет записано только то, что мы записали в текущем сеансе. Если данные необходимо добавить к имеющимся — используется метод Append

    • Append() — метод открывает файл для записи, но в отличии от Output записывает данные в конец файла, а не перезаписывает текущие данные. Например, код добавления выделенных ячеек как одной строки в имеющийся файл будет выглядеть так:
      Sub SelectionToTxt_Add()
          Dim s As String, rc As Range
          Dim ff
          'запоминаем все значения из выделенной строки в строку
          For Each rc In Selection
              If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки
                  s = rc.Value
              Else 'если уже записано - добавляем через TAB
                  s = s & vbTab & rc.Value
              End If
          Next
          ff = FreeFile
          'Открываем текстовый файл
          'если файла нет - он будет создан
          Open "C:Text1.txt" For Append As #ff
          'записываем значение строки в файл
          Print #ff, s
          Close #ff ' Закрываем файл
      End Sub
  • FileDateTime() — позволяет получить информацию о последнем времени обращения к указанному файлу. Если к файлу после создания ни разу не обращались, то это будет время создания файла. Если попытаться обратиться к уже открытой книге/файлу — то будет получено время открытия книги/файла, а не создания или сохранения.
        sFileDateTime = FileDateTime("C:Text1.txt")
  • FileLen() — позволяет определить длину указанного файла в байтах:
        MsgBox FileLen("C:Text1.txt") & " bites", vbInformation, "www.excel-vba.ru"
  • GetAttr() — возможность обратиться к файлу к файловой системе и получить информацию об его атрибутах (скрытый, доступен только для чтения, архивный и т.п.)
  • InputB() — позволяет указывать количество байт, которые надо считать из файла. Альтернатива методу Open в случаях, когда необходимо считывать данные не по конкретным строкам, а именно побайтово.
  • Loc() — от Location, то есть местонахождение — возвращает число, которое определяет текущее место вставки или чтения в открытом файле.
  • Seek() — очень похожа на функцию Loc(), но Seek() возвращает информацию о позиции, с которой будет выполняться следующая операция чтения или вставки.
  • LOF() — length of file — позволяет определить длину открытого файла в байтах.

Статья помогла? Сделай твит, поделись ссылкой с друзьями!

Named Arguments

EOF Function 249

Syntax

EOF( filenumber) filenumber

Use: Required

Data: Integer

Any valid file number.

Return Value

An integer containing -1 (True), or 0 (False). Description

Returns an integer evaluating to True (-1) when the end of a file has been reached; until the end of the file is reached, EOF returns False (0).

Rules at a Glance

• filenumber must be a valid number used in the Open statement to open either a random or sequential file.

• If you have opened the file using either random or binary access, a Get statement that can’t read a complete record (i.e., an attempt to access a record past the last record in the file) causes EOF to return True.

Example iFile = FreeFile

Open sFilename for Input as #iFile Do While Not EOF(iFile)

LineInput #iFile, sDataLine

Loop

Close #iFile Programming Tips & Gotchas

• EOF allows you to test whether the end of a file has been reached without generating an error.

• Because EOF dates back to the times when VB didn’t support an intrinsic Boolean data type, the function uses an integer data type to hold the 0 and -1 False and True values.

• Because you always write data to sequential files at the end of the file, the file marker is always at the end of the file, and EOF therefore always returns True when testing files opened with their modes set equal to either input or append.

• As Visual Basic is continually enhanced with new functions and new objects, there are more efficient and elegant alternatives to some of the VB language elements that have been with us since before «Visual» was even thought of! The following snippets compare methods of populating an array with data extracted from a comma-delimited text file. The first snippet uses a standard Do…Loop and EOF flag:

250 Chapter 7- The Language Reference

Dim sFilename As String Dim sContents As String Dim iFile As Integer

Dim sArray() As String iFile = FreeFile sFilename = «testinput.txt» ReDim sArray(0)

Open sFilename For Input As #1 Do While Not EOF(1)

Input #1, sContents

ReDim Preserve sArray(UBound(sArray) + 1) sArray(UBound(sArray)) = sContents Loop Close #1

You can replace this with a single call to the Input function, passing to it the length of the text file, and, if you’re using VB6, you can call the Split function to parse the comma-delimited string:

Dim sFilename As String Dim sContents As String Dim iFile As Integer

Dim sArray() As String sFilename = «testinput.txt»

Open sFilename For Input As #iFile sContents = Input(LOF(iFile), iFile) Close #iFile sArray = Split(sContents, «,»)

Again, for VB6 users only, there is the object-oriented way of extracting the data, again passing the resulting string to the Split function to be parsed. For this example to work, you have to create a project reference to the Microsoft Scripting Runtime Library, which gives you access to the File System Object:

Dim sFilename As String

Dim sArray() As String

Dim ofsFileSys As New Scripting.FileSystemObject Dim ofsTextStream As TextStream sFilename = «testinput.txt» Set ofsTextStream = _

ofsFileSys.OpenTextFile(sFilename) sArray = Split(ofsTextStream.ReadAll, «,») Set ofsTextStream = Nothing

• Don’t confuse the EOF Function with the EOF property of the RDO, DAO, and ADO recordsets and result sets. The former is a function for testing the position of the file pointer in a file opened using the VBA Open statement; the latter is a property that indicates the state of the record pointer in a database or recordset opened using automation.

• The AtEndOfStream property is the TextStream object’s equivalent to the EOF function.

EOF Function 251

See Also

File System Objects, Get Statement, Loc Function, LOF Function, Open Statement

Continue reading here: Erase Statement

Was this article helpful?

Начиная с первых версий VBA, файлы обрабатывались с помощью оператора Open и других файловых операторов и функций. Эти механизмы со временем будут вытеснены объектной моделью FSO (File System Object), но они полностью поддерживаются в версии 5.0.

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

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

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

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

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

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

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

Для работы с папками и дисками:

Функция Dir возвращает значение типа String, представляющее имя файла, каталога или папки, которое удовлетворяет указанному шаблону имени файла, набору атрибутов файла или метке тома на диске.

Dir[(путь[, атрибуты])]

Здесь путь (Необязательный) — строковое выражение, указывающее имя файла; может содержать имя каталога или папки и диска. Если путь не найден, возвращается пустая строка («»). Атрибуты (Необязательный) — константа или числовое выражение, описывающее атрибуты файла. Если этот аргумент опущен, возвращаются все файлы, имена которых удовлетворяют аргументу путь.

Функция Dir поддерживает использование подстановочных знаков для нескольких символов (*) и для одиночного символа (?) для указания нескольких файлов.

При первом вызове функции Dir необходимо указать путь, в противном случае возникает ошибка. Если указаны атрибуты файла, наличие аргумента путь является обязательным.

Функция Dir возвращает первое имя файла, имя которого удовлетворяет аргументу путь. Для получения остальных файлов, имена которых удовлетворяют указанному пути, следует повторно вызвать функцию Dir без аргументов. Если файлов, имена которых удовлетворяют указанному пути, не осталось, возвращается пустая строка («»). При следующем после возврата пустой строки вызове функции необходимо указать аргумент путь; в противном случае возникает ошибка. Изменить значение аргумента путь можно в любой момент, не дожидаясь, пока закончатся файлы, имена которых удовлетворяют текущему пути. Рекурсивный вызов функции Dir запрещен. Вызов функции Dir с атрибутом vbDirectory не приводит к последовательному возврату подкаталогов.

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

Пример: ‘ Возвращает список каталогов на диске C:.

MyPath = "c:"	' Указывает путь.
MyName = Dir(MyPath, vbDirectory)	' Возвращает первый элемент.
Do While MyName <> ""	' Начинает цикл.
' Игнорирует текущий каталог и каталог предыдущего уровня.
If MyName <> "." And MyName <> ".." Then
' является ли MyName каталогом.
If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
Debug.Print MyName	' Выводит элемент если это каталог
End If	.
End If
MyName = Dir	' Возвращает следующий элемент.
Loop

Инструкция ChDir — Изменяет текущий каталог или папку.

ChDir путь

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

Инструкция ChDir изменяет текущий каталог, но не изменяет стандартный диск. Например, если стандартным является диск C, то после выполнения следующей инструкции стандартным каталогом станет каталог на диске D, но стандартным диском останется диск C:

ChDir «D:TMP»

Функция CurDir — Возвращает значение типа Variant (String), представляющее текущий путь.

CurDir[(диск)]

Необязательный аргумент диск является строковым выражением, указывающим существующий диск. Если диск не указан или аргумент диск является пустой строкой («»), функция CurDir возвращает путь к текущему диску.

Инструкция MkDir — Создает новый каталог или папку.

MkDir путь

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

Инструкция RmDir — Удаляет существующий каталог или папку.

RmDir путь

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

При попытке удалить с помощью инструкции RmDir каталог (или папку), который содержит файлы, возникает ошибка. Для предварительного удаления всех файлов из каталога или папки следует использовать инструкцию Kill.

Инструкция ChDrive — Изменяет текущий диск.

ChDrive диск

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

Для работы со свойствами файлов:

Функция FileDateTime — Возвращает значение типа Variant (Date), содержащее дату и время создания или последнего изменения файла.

FileDateTime(путь)

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

Функция FileLen — Возвращает значение типа Long, содержащее размер файла в байтах.

FileLen(путь)

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

Если в момент вызова функции FileLen указанный файл открыт, возвращается размер этого файла до его открытия. Для определения размера открытого файла следует использовать функцию LOF.

Функция GetAttr — возвращает значение типа Integer, содержащее атрибуты файла, каталога или папки.

GetAttr(путь)

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

Значение, возвращаемое функцией GetAttr, являются суммой следующих значений:

vbNormal 0 Обычный.

vbReadOnly 1 Только чтение.

vbHidden 2 Скрытый.

vbSystem 4 Системный.

vbDirectory 16 Каталог или папка.

vbArchive 32 Файл был изменен после последнего резервирования.

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

Result = GetAttr(FName) And vbArchive

Если архивный атрибут установлен, будет возвращено ненулевое значение.

Инструкция SetAttr — задает атрибуты файла.

SetAttr pathname, attributes

Здесь pathname (Обязательный) — строковое выражение, указывающее имя файла; может содержать имя каталога или папки и диска.

attributes (Обязательный) — константа или числовое выражение, задающее атрибуты файла.

Ниже приведены допустимые значения аргумента attributes:

vbNormal 0 Обычный (по умолчанию).

vbReadOnly 1 Только чтение.

vbHidden 2 Скрытый.

VbSystem 4 Системный.

vbArchive 32 Файл был изменен после последнего резервирования.

При попытке изменения атрибутов открытого файла возникает ошибка выполнения.

Для манипулирования файлами:

Инструкция FileCopy — Копирует файл.

FileCopy source, destination

Здесь source (Обязательный) — строковое выражение, указывающее имя файла, подлежащего копированию. Аргумент source может содержать имя каталога или папки и диска.

destination (Обязательный) — строковое выражение, указывающее имя результирующего файла. Аргумент destination может содержать имя каталога или папки и диска.

При попытке скопировать открытый файл с помощью инструкции FileCopy возникает ошибка.

Инструкция Name — Изменяет имя файла, каталога или папки.

Name староеИмя As новоеИмя

Здесь староеИмя (Обязательный) — строковое выражение, указывающее имя и положение существующего файла; может содержать имя каталога или папки и диска.

новоеИмя (Обязательный) — строковое выражение, указывающее новое имя и положение файла; может содержать имя каталога или папки и диска. Файл с таким именем не должен существовать.

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

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

Инструкция Kill — удаляет файлы с диска.

Kill путь

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

Инструкция Kill поддерживает использование подстановочных знаков для нескольких символов (*) и для одиночного символа (?) для указания нескольких файлов.

При попытке удалить открытый файл с помощью инструкции Kill возникает ошибка. Для удаления каталогов следует использовать инструкцию RmDir.

Для управления файлами:

Инструкция Open — разрешает выполнение с файлом операций ввода/вывода.

Open путь For режим [Access доступ] [блокировка] As [#]номерФайла [Len=длина]

Здесь путь (Обязательный) — строковое выражение, указывающее имя файла; может содержать имя каталога или папки и имя диска.

режим (Обязательный) — ключевое слово, указывающее режим файла: Append, Binary, Input, Output или Random. По умолчанию, файл открывается в режиме Random.

доступ (Необязательный) — ключевое слово, указывающее операции, разрешенные с открытым файлом: Read, Write или Read Write.

блокировка (Необязательный) — ключевое слово, указывающее операции, разрешенные с открытым файлом другим процессам: Shared, Lock Read, Lock Write и Lock Read Write.

номерФайла (Обязательный) — допустимый номер файла в интервале от 1 до 511 включительно. Для определения следующего свободного номера файла следует использовать функцию FreeFile.

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

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

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

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

Если аргумент режим имеет значение Binary, предложение Len игнорируется.

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

Функция FreeFile — Возвращает значение типа Integer, представляющее следующий номер файла, доступный для использования с инструкцией Open.

FreeFile[(диапазонНомеров)]

Необязательный аргумент диапазонНомеров является выражением типа Variant, указывающим диапазон, из которого возвращается следующий свободный номер файла. Значение 0 (используется по умолчанию) задает возвращение номера файла из диапазона 1 — 255 включительно. Значение 1 задает возвращение номера файла из диапазона 256 — 511.

Функцию FreeFile используют для возвращения незанятого номера файла.

Инструкция Close — завершает операции ввода/вывода с файлом, открытым с помощью инструкции Open.

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

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

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

Если аргумент списокНомеровФайлов опущен, закрываются все активные файлы, открытые с помощью инструкции Open.

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

Инструкция Close разрывает связь между файлом и соответствовавшим ему номером файла.

Инструкция Reset — Закрывает все файлы, открытые с помощью инструкции Open.

Reset

Инструкция Reset закрывает все активные файлы, открытые с помощью инструкции Open, и записывает содержимое всех буферов файлов на диск.

Для позиционирования в открытом файле:

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

Seek(номерФайла)

Обязательный аргумент номерФайла является выражением типа Integer, содержащим допустимый номер файла.

Функция Seek возвращает значение в интервале от 1 до 2 147 483 647 (т.е. 2^31 — 1) включительно.

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

Random Номер записи, которая будет считана или записана следующей.

Binary, Output, Append, Input Номер байта, с которого начинается выполнение следующей операции ввода/вывода. Первому байту файла соответствует 1, второму 2 и т.п.

Функция EOF — Возвращает значение типа Integer содержащее логическое значение True при достижении конца файла.

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

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

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

Функция EOF возвращает значение False до тех пор, пока не будет достигнут конец файла. При использовании с файлами, открытыми в режиме Random или Binary, функция EOF возвращает значение True, если последней выполненной инструкции Get не удалось считать целую запись; в противном случае возвращается значение False.

Для файлов, открытых для доступа в режиме Binary, попытка чтения файла с помощью функции Input до возвращения функцией EOF значения True приводит к ошибке. При чтении двоичных файлов с помощью функции Input следует вместо функции EOF использовать функции LOF и Loc или использовать с функцией EOF инструкцию Get.

Ввод/вывод в файлы различных типов доступа.

Последовательный доступ к файлам:

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

Файлы, открытые для последовательного доступа, допускают следующие операции:

ввод символов в файл (Input);

вывод символов из файла (Output);

добавление символов в файл (Append).

Чтобы открыть файл для последовательного доступа, следует использовать оператор Open:

Open pathname For [Input | Output | Append] As filenum [Len = Buffersize]

Когда последовательный файл открывается для ввода (Input), файл должен существовать, иначе возникнет ошибка. Однако при попытке открыть несуществующий файл для операций вывода (Output) или добавления (Append) оператор Open сначала создает файл, а затем открывает его. Номер файла filenum является обязательным и может быть получен с помощью функции FreeFile. Необязательный параметр Len задает число символов в буфере для операций копирования данных из файла в приложение. Чем больше буфер, тем реже производятся обращения к диску. После открытия файла для операций Input, Output или Append его надо закрыть с помощью оператора Close, прежде чем открывать для операции другого типа.

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

Dim Lines As String, NextLine As String

Do Until EOF (FileNum)

Line Input # FileNum, NextLine

Lines = Lines + NextLine + Chr(13) + Chr(10)

Loop

Оператор Line Input # распознает последовательность символов CR/LF, но не включает их в переменную. О сохранении этих символов должен позаботиться программист.

Можно также использовать оператор Input #, который читает числа и/или строковые выражения, записанные в файл. Например, для чтения строки адреса можно использовать следующий оператор:

Input # FileNum, name, street, city, zip, country

Можно использовать функцию Input () для копирования любого числа символов из файла в переменную при условии, что они могут поместиться в этой переменной:

Lines = Input (n, FileNum)

Чтобы скопировать целый файл в переменную, следует использовать функцию InputB. Так как она возвращает строку в коде ANSI, для преобразования ее в строку UNICODE надо применять функцию StrConv:

Lines = StrConv(InputB(LOF(FileNum), FileNum), vbUnicode)

Для записи строк в файл следует открыть его для последовательного вывода (Output) или добавления (Append), а затем использовать оператор Print #, например:

Print #FileNum, Text

Существует также оператор Write #, который записывает список чисел и/или строковых выражений в файл. Он автоматически отделяет каждое выражение запятой и заключает строковые выражения в кавычки:

AnyString = «AnyChars» : AnyNum = 12345

Write #FileNim, AnyString, AnyNum

Результат будет выглядеть так:

«AnyChars»,12345

Рассмотрим более полный пример, в котором читается текстовый файл, ищутся строки, начинающиеся с одинаковой буквы, и выводятся в другой текстовый файл:

Sub пример12()
Dim first() As String, s() As String
Dim n As Integer, i As Integer, k As Integer
Dim fn As Integer, x As String
i = 1: k = 0
fn = FreeFile
Open "D:input.txt" For Input As fn
Do While Not EOF(fn)
ReDim Preserve s(1 To i)
ReDim Preserve first(1 To i)
Line Input #fn, s(i)
first(i) = Left(s(i), 1)
i = i + 1
Loop
Close #fn
i = i - 1
fn = FreeFile
Open "D:output.txt" For Output As fn
For n = 1 To i
If n <> i Then
For k = n + 1 To i
If first(k) = first(n) Then
Print #fn, s(n), s(k)
End If
Next k
End If
Next n
Close #fn
End Sub

Произвольный доступ к файлам:

Байты в файлах произвольного доступа формируют записи, каждая из которых содержит одно или более полей. Запись с одним полем соответствует любому стандартному типу. Запись с несколькими полями соответствует определяемому пользователем типу. Например, тип Worker, определяемый ниже, создает 19 байтные записи, которые состоят из трех полей:

Type Worker

LastName As String * 10

Title As String * 7

Rank As String * 2

End Type

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

‘Переменная записей

Public Employee As Worker

‘Текущая запись

Public Position As Long

‘Номер последней записи в файле

Public LastRecord As Long

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

Open pathname [ For Random] As filenumber Len = reclength

Так как типом доступа по умолчанию является произвольный (random), ключевые слова For Random не обязательны.

Выражение Len = reclength задает размер каждой записи в байтах. Заметим, что каждая строковая переменная в VBA хранится в формате Unicode, и надо задать длину этой строки. Если reclength меньше, чем действительная длина записываемой в файл записи, генерируется ошибка. Если reclength больше действительной длины записи, то запись сохраняется, но дисковое пространство при этом будет расходоваться нерационально.

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

Dim FileNum As Integer, RecLength As Long, Employee As Person

‘ Вычисляем длину каждой записи.

RecLength = LenB (Employee)

‘ Получаем следующий доступный номер файла.

FileNum = FreeFile

‘ Открываем новый файл оператором Open.

Open «MYFILR.FIL» For Random As FileNum Len = RecLength

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

Для копирования записей в переменные следует использовать оператор Get. Например, чтобы скопировать запись из файла Employee Records в переменную Employee, можно использовать следующий код:

Get FileNum, Position, Employee

В этой строке Employee содержит номер, который оператор Open использовал для открытия файла; Position содержит номер записи, которая копируется; переменная Employee, объявленная с определенным пользователем типом Worker, получает содержимое записи.

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

Put # FileNum, Position, Employee

Этот код заменит запись с номером, заданным переменной Position, данными из переменной Employee.

Чтобы добавить новые записи в конец файла, открытого для произвольного доступа, следует использовать оператор Put, показанный в предыдущем фрагменте кода. Для этого надо установить значение переменной , Position равным на единицу больше номера последней записи в файле. Например, чтобы добавить новую запись в файл, содержащий пять записей, следует установить переменную Position равной 6.

Следующий оператор добавляет запись в конец файла:

LastRecord = LastRecord + 1

Put #FileNum, LastRecord, Employee

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

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

1. Создать новый файл.

2. Скопировать все необходимые из исходного файла в этот новый файл.

3. Закрыть исходный файл и с помощью оператора Kill удалить его.

4. С помощью оператора Name переименовать новый файл, дав ему имя исходного файла.

Доступ к двоичным файлам:

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

Чтобы открыть файл для двоичного доступа, используют следующий синтаксис Open:

Open pathname For Binary As filename

Отличие от оператора для произвольного доступа заключается в отсутствии указания длины записи с помощью предложения Len = RecLength. Будучи включено в оператор открытия двоичного файла, оно просто игнорируется, поскольку предполагается, что записи имеют произвольную длину. Отсюда следует, что невозможно организовать доступ к записям в произвольном порядке, а только последовательно, определяя длину каждой записи. В то же время можно непосредственно обращаться к каждому байту в файле.

Основы работы с файлами

Sub tt()

Call fun_Txt_Write(«123456789»)

s = fun_Txt_Read()

End Sub

Function fun_Txt_Write(ByVal s As String)

Open ThisWorkbook.Path & «LastDateMail.txt» For Output As #1

Write #1, s

Close #1

End Function

Function fun_Txt_Read() As String

Dim s As String

Open ThisWorkbook.Path & «LastDateMail.txt» For Input As #1

‘ Do

Line Input #1, fun_Txt_Read

‘ Loop Until EOF(1)

fun_Txt_Read = Mid(fun_Txt_Read, 2, Len(fun_Txt_Read) — 2)

Close #1

End Function

По виду доступа файлы можно разделить на:

1) последовательного доступа( текстовые);

2) прямого (произвольного)  доступа( типизированные);

3) двоичные .

Последовательность действий при записи / чтении файлов любого доступа:

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

2) чтение / запись( зависит от типа файла)

3) закрыть файл

Закрыть файл любого доступа:

Close #<числовой идентификатор>

Файлы  последовательного доступа (текстовые):

1) представляют последовательность символов, следовательно при открытии файла из текстового редактора (блокнот, wordpad, word)  можно видеть значения, которые туда записаны;

2) данные могут иметь некоторую структуру, организованную разделителями; это зависит от использования формата при выводе (вывод может быть форматным и бесформатным);

структурная единица такого файла –  обычно строка;

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

4) можно писать данные любых типов, при записи они преобразуются к строковому типу; читать можно данные любого типа, при чтении они из строкового преобразуются к нужному типу (если это возможно)

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

Открыть файл :

  • открывает файл для чтения:

Open “<имяФайла>” For Input  [тип блокировки] As #<числовой идентификатор>

  • открывает файл для записи:

Open “имяФайла” For Output  [тип блокировки] As #<числовой идентификатор>

  • открывает существующий файл для добавления   (то есть открывает файл для записи и ставит курсор в конец файла).

Open “имяФайла” For Append   [тип блокировки]  As #<числовой идентификатор>

Тип блокировки:

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

1) shared – общий доступ

2) lock read – блокировка чтения

3) lock write – блокировка записи

4)  lock read write – блокировка чтения и записи

Записать данные в файл:

  • бесформатный  вывод в файл:

Write #<числовой идентификатор>,  список вывода

  • ‘ форматный  вывод в файл, форматы basic используются в списке вывода; писать в файл  после установки указателя  можно только этой командой:

Print #<числовой идентификатор>,   список вывода

Читать данные из файла:

  • чтение из файла с безформатной записью данных:

Input #<числовой идентификатор>, <список переменных>

  • чтение из файла с форматной записью данных:

Line Input #<числовой идентификатор>,  <список переменных>

Установить  указатель на заданную позицию:

Seek #<числовой идентификатор>, <номерСимвола>              -после этой команды  чтение будут производиться с позиции <номерСимвола> по строкам, запись затирает старый файл.

Пример1:

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

Sub write_file()

Dim v_i As Integer

Dim v_s As String * 25

Dim v_b As Boolean

v_i = 93

v_s = «My text»

v_b = True

Open «test1.txt» For Output As #1

Write #1, “12345 — Ïðèìåð; ”

Write #1, v_i; v_b; v_s

Print #1, v_i; v_b; v_s

Print #1, 333444555

Close #1

End Sub

Результат (файл test1.txt после записи):

Рис 1 – файл test1.txt

Пример2:

Наберите текст макроса, который реализует считывание из файла test1.txt с использованием Input Line (считывается целыми строками) и Input (считывается по формату данных).

Для проверки конца файла использован EOF(<числовой идентификатор файла>). Если EOF(числовой идентификатор файла)=true, значит, достигнут конец файла.

Каждая прочитанная строка из файла test1.txt переписывается test2.txt

Sub read_file()

Open “g:vbatest1.txt” For Input As #1

Open “g:vbatest2.txt” For Output As #2

Dim t As String

Do

Line Input #1, t

Print #2, t

Loop Until EOF(1)

Print #2, “___________”

Seek #1, 1

Do

Input #1, t

Print #2, t

Loop Until EOF(1)

Close #2

Close #1

End Sub

Рис.2 – Результаты считывания из файла test1.txt в файл test2.txt

Файлы прямого (произвольного доступа) доступа :

1) могут содержать данные только одного типа;

2) файл разбит на записи определённой длины, которая определяется типом записываемых данных; каждая запись имеет номер;

3) данные можно читать в любом порядке,

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

5)  в файл прямого доступа можно писать массив значений и диапазон ячеек сразу за одну операцию, но !!! длина массива (диапазона)  не должна превышать 32 167 байт .

6) чтобы записать новые данные в конец файла, надо открыть его для записи и установить указатель на последнюю запись.

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

Команды для работы с файлами   прямого доступа:

Открыть файл  (и для чтения и для записи) :

Open “<имя файла>” For Random As #<числовой идентификатор> Len = Len(<имяПеременной>)

Записать данные в файл:

Put #<числовой идентификатор>, <номерЗаписи>, <переменная> – Записывает переменную в файл в позицию с указанным номером. Начальная позиция -1.

Читать данные из файла:

Get #<числовой идентификатор>, <номерПозиции>, <имяПеременной> – читает  запись с указанной позиции в переменную.

Установить указатель на нужную запись в файле:

Seek #<числовой идентификатор>, номер записи     ‘после этого запись будет производиться в конец файла.

Пример3: Создать файл, содержащий сведения о студентах (ФИО и дата рождения). Сохранить данные в файле «students». Файл будет из блоков по 33 байта (размер записи Student). Запись поблочная.

Первоначально следует определить тип пользователя в самом начале модуля:

Type Student

    b_d As Integer

    Name As String * 30

 End Type

Пример4: Написать программу для считывания записей из файла «students»… Переписать данные их типизированного файла в текстовый о тех студентах, возраст которых больше 20 лет.

Sub file_pd_get()

Dim T As Student

Open “g:vbastudent.txt” For Output As #2

Open “g:vbastudents” For Random As #1 Len = Len(T)

pos = 1

Do

Get #1, pos, T

If 2012 – T.b_d > 20 Then Print #2, T.Name & “  “; T.b_d

pos = pos + 1

Loop Until EOF(1)

Close #1

Close #2

End Sub

Особенности работы с файлами:

1)  необходимо соблюдать строгое соответствие между командами записи и чтения:

Запись

чтение

Write

Input

Print

Line   input

Put

Get

2) номер после знака  «#»  в операторах открытия, чтения / записи и закрытия файла должен быть одинаковым при работе с одним файлом;

Двоичные файлы

1) просто последовательность байтов или блоков байтов;

2) одна команда открывает для чтения и записи.;

Команды для работы с файлами   прямого доступа:

Открыть файл  (и для чтения и для записи) :

Open “<имя файла>” For binary As #<числовой идентификатор>

Записать данные в файл:

Put #<числовой идентификатор>, номерЗаписи, переменная  ‘ Записывает переменную в файл в позицию с указанным номером.

Читать данные из файла:

Get #<числовой идентификатор>, номерПозиции, имяПеременной  ‘ Читает  запись с указанной позиции в переменную.

Пример5: Запись в файл bin.txt значений от 0 до 255 через переменную типа integer (2 байта). Данные будут записаны просто как последовательность байтов, при открытии в блокноте, данные не будут иметь привычную для нас числовую форму.

Sub bin_file()

Dim i As Integer

Open “bin.txt” For Binary As #1

For i = 0 To 255

Put #1, , i

Next i

Close #1

End Sub

Рис.3 – файл bin.txt в блокноте.

Like this post? Please share to your friends:
  • Vba excel конец таблицы
  • Vba excel комментарии в коде
  • Vba excel комбобокс свойства
  • Vba excel команда если
  • Vba excel команда for