
- •Практическая работа работа с файлами в vba. Файлы последовательного доступа
- •Input #1, j ‘читаем элемент файла
- •Практическая работа работа с файлами в vba. Файлы произвольного и бинарного доступа
- •If eof(1) Then 'если конец файла - выходим из цикла чтения элементов
- •If eof(1) Then 'если конец файла - выходим из цикла чтения элементов
If eof(1) Then 'если конец файла - выходим из цикла чтения элементов
Exit Do
Else
With MyRecord 'переносим прочитанные поля на лист Excel
Cells(i + 1, 1) = .ID
Cells(i + 1, 2) = .Family
Cells(i + 1, 3) = .Name
Cells(i + 1, 4) = .LenService
Cells(i + 1, 5) = .Category
Cells(i + 1, 6) = .BirthDay
Cells(i + 1, 7) = .Combine
Cells(i + 1, 8) = .Post
Cells(i + 1, 9) = .Degree
End With
i = i + 1
End If
Loop
Close #1 ' Закрываем файл
End Sub
Эта процедура использует ранее записанный макрос Заголовок6 и процедуру Примечания. Процедура Примечания добавляет к заголовкам таблицы примечания. Это можно сделать, используя Вставка\Примечание или программно:
Public Sub Примечания()
Range("1:1").ClearComments ‘очистка примечаний первой строки
Range("A1").AddComment ‘добавить примечание к заголовку первого столбца
Range("A1").Comment.Visible = False
Range("A1").Comment.Text "Номер сотрудника"
‘…
End Sub
Самостоятельно напишите код для добавления примечаний к остальным столбцам.
Задача: увеличить на 1 разряд категорию работнику кафедры, который проработал дольше всех.
Sub ПоискВетерана()
Dim max As Integer, nmax As Integer, i As Integer
Dim MyRecord As Employee ' Объявляем переменную типа запись
Open "bd.dat" For Random As #1 Len = Len(MyRecord)
i = 1
max = -1
Do
Get #1, , MyRecord ' Читаем одну запись
If eof(1) Then 'если конец файла - выходим из цикла чтения элементов
Exit Do
Else
If MyRecord.LenService > max Then
max = MyRecord.LenService
nmax = i
End If
i = i + 1
End If
Loop
Get #1, nmax, MyRecord ' Читаем запись с максимальным стажем
MsgBox ("Дольше всего работает " & MyRecord.LenService & " гг " & Trim(MyRecord.Family) & " " & Trim(MyRecord.Name))
MyRecord.Category = MyRecord.Category + 1 'Повышаем категорию
Put #1, nmax, MyRecord ' переписываем информацию о ветеране
Close #1 ' Закрываем файл
End Sub
После выполнения процедуры повторите вызов FileInTable на чистом листе и сравните таблицы. Проверьте, как изменится результат, если в Put опустить позицию nmax.
Добавление в файл произвольного доступа осуществляется записью в позицию за концом файла. Например, в файле 10 записей, чтобы добавить новую запись необходимо записать в позицию 11. Сложнее обстоит дело с удалением записей. Как правило, для этого переписывают все нужные записи в новый файл. Используя Kill, удаляют исходный файл и переименовывают новый, используя Name As. Напишите программу увольнения всех сотрудников, работающих по совместительству.
Самостоятельно напишите программу просмотра записей своей базы данных в форме, созданной ранее, без занесения информации в лист Excel. Решите задачу поиска и модификации записи файла с использованием формы.
Рассмотрим еще один тип доступа к файлам - двоичный. Этот доступ используется для чтения и записи каждой позиции байта в файле. Открывается файл для двоичного доступа с параметром Binary. При этом можно, как и в файле с произвольным доступом и писать, и читать одновременно. Запись осуществляется функцией Put, а чтение - Get. Разница между произвольным и двоичным файлами в способе интерпретации информации - в первом случае это, как правило, структурированная запись, а во втором случае - набор неинтерпретируемых байт. Есть задачи, в которых нам не нужна интерпретация, например, задачи шифровки. Самый простой способ зашифровать файл - увеличить каждый элемент (байт) на некоторое число X7.
Sub Шифровка()
Dim i As Integer, j As Byte, x As Integer
x = InputBox("Введите код шифровки")
Open "exampl.txt" For Binary As #1
Open "exampl2.txt" For Binary As #2
'открываем файл на чтение и присваиваем ему номер 1
For i = 1 To LOF(1) ' Повторяем, пока не конец файла8
Get #1, , j
j = ((j + x) Mod 256)
Put #2, , j
Next i
Close #1 ' Закрываем файл
Close #2 ' Закрываем файл
End Sub
Файл может быть текстовый или любого другого типа. Посмотрите в блокноте результат шифровки. Самостоятельно напишите процедуру дешифровки.
Представленный метод шифровки требует двух процедур - шифровки и дешифровки. Есть более простой способ с использованием операции Xor (исключающего или). Двойное применение этой операции к значению возвращает исходное значение. Заменим «j = ((j + x) Mod 256)» на «j = j Xor x». Применим 1 раз шифровку. Посмотрим результат, а затем к нему еще раз применим шифровку. Что получилось?
Описанные методы шифровки очень просты, и их легко взломать, посчитав частоту появления символов в тексте. Большей надежностью обладает метод, когда в качестве ключа к шифру задается некоторый вектор из чисел. Тогда первый байт меняется с использованием первого элемента вектора, второй - со вторым и т.д. Когда вектор закончится, для изменения очередного байта вновь берется первый элемент вектора. И так до конца файла. Самостоятельно напишите программу, которая реализует векторную шифровку и дешифровку.
1 Разная длина компонент - их главный недостаток при обработке и главное достоинство при хранении (компактность).
2 На самом деле открыть можно, но в редакторе будет представлена тарабарщина и псевдографика.
3 См. практическую работу № 8
4 Помните, что при любой операции чтения/записи позиция файла увеличивается на 1!
5 Она может быть опущена - тогда из текущей позиции.
6 См. практическую работу № 8
7 Если полученное число превышает 1 байт, то возьмем остаток от деления на 256
8 LOF - возвращает количество байт в файле