Листинг 17.2. Код обработчика события Open для рабочей книги (html, txt)

Таким образом, открывая книгу, мы отображаем форму и не даем пользователю доступ к листу, закрывая форму, мы закрываем и книгу, что, опять же, не дает пользователю возможности вручную редактировать данные. Эти ограничения можно обойти. Например, в ходе разработки этой программы вам понадобится править ее код, анализировать таблицу с данными. Поэтому, если вы нажмете сочетание клавиш Ctrl+Pause Break - выполнение программы остановится, вы сможете редактировать код, вручную работать с таблицей.

Если вы будете создавать подобный проект для практических целей - возможно, для того, чтобы максимально усложнить доступ пользователя к данным, есть смысл зашифровать их. К сожалению, парольная защита проектов в MS Office встроенными средствами не слишком эффективна, поэтому вы либо должны быть готовы к потенциальному несанкционированному доступу, либо должны предусмотреть дополнительные меры безопасности. Хотя, надо отметить, что практически любую систему безопасности можно либо обойти, либо взломать.

Теперь давайте рассмотрим код элементов управления формы frm_In.

Код формы frm_In

Листинг 17.3 содержит код формы frm_In.

Private Sub cmd_Exit_Click()

frm_In.Hide

'Скрывая frm_In мы автоматически

'переходим к frm_Main

End Sub

 

Private Sub cmd_Rec_Click()

'Адрес строки для записи

Dim num_Address

'Вычисляем номер строки для записи

num_Address = ActiveSheet.Range("B1") + _

ActiveSheet.Range("B2")

'Записываем номер в первую ячейку строки

ActiveSheet.Cells(num_Address, 1) = _

ActiveSheet.Range("B1")

'Запишем дату во вторую ячейку

ActiveSheet.Cells(num_Address, 2) = _

Date

'В третьей ячейке - тип операции

ActiveSheet.Cells(num_Address, 3) = _

cbo_Type.Value

'В четвертой - сумма

ActiveSheet.Cells(num_Address, 4) = _

Val(txt_Sum)

'В пятой - примечание

ActiveSheet.Cells(num_Address, 5) = _

txt_Info

'Запишем новый номер строки

ActiveSheet.Range("B1") = _

ActiveSheet.Range("B1") + 1

'Сбросим все установки на форме

Initial

End Sub

 

Private Sub UserForm_Activate()

'При активации формы

'инициализируем элементы управления

Initial

End Sub

 

Sub Initial()

'Инициализация элементов управления

lbl_Date = Date

lbl_RecNum = ActiveSheet.Range("B1")

cbo_Type.Clear

cbo_Type.AddItem "Доход"

cbo_Type.AddItem "Расход"

cbo_Type.Value = "Доход"

txt_Info = ""

txt_Sum = ""

End Sub

Листинг 17.3. Код формы frm_In (html, txt)

Рассмотрим код формы frm_Out

Код формы frm_Out

Листинг 17.4 содержит код формы frm_Out. Обратите внимание на пользовательскую процедуру Load_Data(). Мы передаем ей параметр num_Index - номер строки, который должен быть отображен. Работа обработчиков нажатия на кнопки перемещения и обработчика, выполняющегося при выборе даты на календаре сводится к вычислению нужного номера строки и вызову этой процедуры.

Private Sub UserForm_Initialize()

'Загружаем первую строку

Load_Data (1)

End Sub

 

Private Sub cmd_Backward_Click()

'Назад строка

If Val(lbl_RecNum) > 1 Then

Load_Data (Val(lbl_RecNum) - 1)

End If

End Sub

 

Private Sub cmd_Exit_Click()

frm_Out.Hide

End Sub

 

Private Sub cmd_First_Click()

'Загружаем первую строку

Load_Data (1)

End Sub

 

Private Sub cmd_Forward_Click()

'Далее строка

If Val(lbl_RecNum) < ActiveSheet.Range("B1") Then

Load_Data (Val(lbl_RecNum) + 1)

End If

End Sub

 

Private Sub cmd_Last_Click()

'Загружаем последнюю строку

Load_Data (ActiveSheet.Range("B1") - 1)

End Sub

 

Private Sub cld_First_Click()

'Просматриваем таблицу,

'находим первую запись

'за выбранную дату и выводим эту запись

For i = 1 To ActiveSheet.Range("B1") - 1

If ActiveSheet.Cells _

(i + ActiveSheet.Range("B2"), 2) = _

cld_First.Value Then

Load_Data (i)

Exit For

End If

Next i

End Sub

 

Private Sub cmd_Rec_Click()

'Адрес строки для записи

Dim num_Address

'Вычисляем номер строки для записи

num_Address = Val(lbl_RecNum + _

ActiveSheet.Range("B2"))

'Так как мы разрешили модифицировать

'лишь сумму и примечание - запишем их

'в текущую строку

'Запишем сумму

ActiveSheet.Cells(num_Address, 4) = _

Val(txt_Sum)

'Запишем примечание

ActiveSheet.Cells(num_Address, 5) = _

txt_Info

End Sub

 

Sub Load_Data(num_Index As Integer)

'Принимает номер строки и выводит

'Данные из этой строки

'Адрес строки для чтения

Dim num_Address

'Вычисляем номер строки для чтения

num_Address = num_Index + _

ActiveSheet.Range("B2")

'Выводим номер записи

lbl_RecNum = _

ActiveSheet.Cells(num_Address, 1)

'Выводим дату

lbl_Date = _

ActiveSheet.Cells(num_Address, 2)

'Выводим тип операции

lbl_Type = _

ActiveSheet.Cells(num_Address, 3)

'Выводим сумму

txt_Sum = _

ActiveSheet.Cells(num_Address, 4)

'Выводим примечание

txt_Info = _

ActiveSheet.Cells(num_Address, 5)

End Sub