Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Старые+лабы+по+VBA.doc
Скачиваний:
4
Добавлен:
05.09.2019
Размер:
70.66 Кб
Скачать

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. Задача: увеличить на 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.

  1. Добавление в файл произвольного доступа осуществляется записью в позицию за концом файла. Например, в файле 10 записей, чтобы добавить новую запись необходимо записать в позицию 11. Сложнее обстоит дело с удалением записей. Как правило, для этого переписывают все нужные записи в новый файл. Используя Kill, удаляют исходный файл и переименовывают новый, используя Name As. Напишите программу увольнения всех сотрудников, работающих по совместительству.

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

  3. Рассмотрим еще один тип доступа к файлам - двоичный. Этот доступ используется для чтения и записи каждой позиции байта в файле. Открывается файл для двоичного доступа с параметром 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

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

  1. Представленный метод шифровки требует двух процедур - шифровки и дешифровки. Есть более простой способ с использованием операции Xor (исключающего или). Двойное применение этой операции к значению возвращает исходное значение. Заменим «j = ((j + x) Mod 256)» на «j = j Xor x». Применим 1 раз шифровку. Посмотрим результат, а затем к нему еще раз применим шифровку. Что получилось?

  2. Описанные методы шифровки очень просты, и их легко взломать, посчитав частоту появления символов в тексте. Большей надежностью обладает метод, когда в качестве ключа к шифру задается некоторый вектор из чисел. Тогда первый байт меняется с использованием первого элемента вектора, второй - со вторым и т.д. Когда вектор закончится, для изменения очередного байта вновь берется первый элемент вектора. И так до конца файла. Самостоятельно напишите программу, которая реализует векторную шифровку и дешифровку.

1 Разная длина компонент - их главный недостаток при обработке и главное достоинство при хранении (компактность).

2 На самом деле открыть можно, но в редакторе будет представлена тарабарщина и псевдографика.

3 См. практическую работу № 8

4 Помните, что при любой операции чтения/записи позиция файла увеличивается на 1!

5 Она может быть опущена - тогда из текущей позиции.

6 См. практическую работу № 8

7 Если полученное число превышает 1 байт, то возьмем остаток от деления на 256

8 LOF - возвращает количество байт в файле

5