Формирование таблицы стоимости почасовых работ
Консультанты нередко сталкиваются с задачей оценки объема проделанной ими работы. Довольно часто они вовлечены в несколько проектов, затрачивая на каждый из них по несколько часов. В этом случае полезно иметь под рукой таблицу, в которой явно указано, какой счет должен быть выставлен, скажем, за работу по три часа в день в течение четырех дней по ставке 25 рублей в час.
Для генерирования такой таблицы была создана процедура PrintBillingChart, в которой использованы некоторые из рассмотренных в настоящей главе инструкций передачи управления. Вот ее полный текст:
Sub PrintBillingChart (curBaseRate As Currency, _
intMaxDays As Integer)
'Создание таблицы сумм оплаты за почасовую работу
'в пределах заданного количества дней
Dim intDays As Integer
Dim intHours As Integer
If intMaxDays > 6 Then
Debug.Print "Эта процедура ограничен;
Else
'Создание заголовка
Debug.Print "Почасовая ставка "& _
Format(curBaseRate, "Currency")
' Создание шапки таблицы
Debug.Print vbTab;
intDays = 0
Do Until intDays = intMaxDays
intDays = intDays + 1
Debug.Print CStr(intDays)& "дней" & vbTab;
Loop
Debug.Print
'Формирование самой таблицы
For intHours = 1 To 8
Debug.Print CStr(intHours) & vbTab;
intDays = 0
Do Until intDays = intMaxDays
intDays = intDays + 1
Debug.Print Format(intDays * intHours * curBaseRate, _
"Currency") & vbTab;
Loop
Debug.Print
Next intHours
End If
End Sub
В окне Immediate при вызове PrintBillingChart 25,4:
|
Почасовая ставка 25 |
|
|
|
|
1 дней |
2 дней |
3 дней |
4 дней |
1 |
25,00р. |
50,00р. |
75,00р. |
100,00р. |
2 |
50,00р. |
100,00р. |
150,00р. |
200,00р. |
3 |
75,00р. |
150,00р. |
225,00р. |
300,00р. |
4 |
100,00р |
200,00р. |
300,00р. |
400,00р. |
5 |
125,00р |
250,00р. |
375,00р. |
500,00р. |
6 |
150,00р |
300,00р. |
450,00р. |
600,00р. |
7 |
175,00р |
350,00р. |
525,00р. |
700,00р. |
8 |
200,00р |
400,00р. |
600,00р. |
800,00р. |
Как следует из таблицы, четырехдневная работа по три часа в день со ставкой 25 рублей в час оценивается в 300 рублей.
Открытие форм и обработка ошибок
После того как вы освоитесь с языком VBA, вам непременно захочется создавать собственные процедуры обработки событий или преобразовывать существующие макросы в процедуру событий. Это позволит впоследствии выявить ошибки, возникающие при обработке событий и, к тому же, хранить всю программу в одном месте (в редакторе VBE), а не распылять ее по множеству макросов.
База данных TimeTrack содержит шесть макросов. Пять из них вызываются из формы Switchboard и служат для открытия других форм. Вот пример программы, которым можно заменить все эти макросы и вставить собственную обработку ошибок:
Option Compare Database
Option Explicit
Private Sub cmdBillingReport13_Click()
On Error GoTo HandleErr
DoCmd.OpenForm "BillingReportSetupl3"
ExitHere:
Exit Sub
HandleErr:
MsgBox "Ошибка " & Err.Number &":"&_
Err.Description & "в cmdBillingReportl3_Click"
Resume ExitHere
End Sub
Private Sub cmdClients_Click()
On Error GoTo HandleErr
DoCmd.OpenForm "Clients"
ExitHere:
Exit Sub
HandleErr:
MsgBox "Ошибка " & Err.Number & ": " & _
Err.Description & "в cmdClients_Click"
Resume ExitHere
End Sub
Private Sub cmdEmployees_Click()
On Error GoTo HandleErr
DoCmd.OpenForm "Employees"
ExitHere:
Exit Sub
HandleErr:
MsgBox "Ошибка " & Err.Number & " : " & _
Err.Description & "в cmdEmployees_Click"
Resume ExitHere
End Sub
Private Sub cmdProjects_Click()
On Error GoTo HandleErr
DoCmd.OpenForm "Projects"
ExitHere:
Exit Sub
HandleErr:
MsgBox "Ошибка " & Err.Number & ": " & _
Err.Description
Resume ExitHere
End Sub
Private Sub cmdTimeslips_Click()
On Error GoTo HandleErr
DoCmd.OpenForm "Timeslips"
ExitHere:
Exit Sub
HandleErr:
MsgBox "Ошибка " & Err.Number & ": " & Err.Description
Resume ExitHere
End Sub
Предупреждение:
Помните, что вам нужно изменить названия кнопок формы так, чтобы они соответствовали программе.
В этом фрагменте программы продемонстрирована простая модель обработки ошибок, обычно применяемая по умолчанию, когда не требуется производить более сложные действия. Каждая из процедур начинается с инструкции on Error Goto, за ней следует метка, к которой будет осуществляться безусловный переход при возникновении ошибок. Завершается выполнение каждой процедуры оператором Exit Sub, возвращающим управление форме. Именно этот оператор выполняется первым, если при открытии формы не возникает ошибок; ему же передается управление после обработки ошибок в случае наличия таковых с помощью оператора Resume. Внутри тела фрагмента обработки ошибки открывается окно сообщения, отображающее некоторые свойства встроенного объекта Err. В этом объекте хранится информация о последней ошибке.
Последний макрос базы данных TimeTrack используется формой BillingReportSetup13 для открытия отчета. Преобразование этого сценария в процедуру VBA будет лишь немного сложнее обычного открытия формы, поскольку дополнительно потребуется указать, что отчет должен открываться в режиме предварительного просмотра:
Private Sub cmdOpenReport_Click()
On Error GoTo HandleErr
DoCmd.OpenReport "BillingReportl3", acViewPreview, , , , _ chkSummary
ExitHere:
Exit Sub
HandleErr:
MsgBox "Ошибка " & Err.Number & ": " & _
Err.Description & "в cmdBillingReportl3_Click"
Resume ExitHere
End Sub
Если с помощью обозревателя объектов посмотреть на метод OpenReport объекта DoCmd, то можно увидеть, что он имеет один параметр, содержащий список аргументов соответствующего макроса. Вторым параметром данного метода является способ открытия отчета. В данном случае этому аргументу мы передаем значение встроенной константы vbViewPreview, определяющее режим предварительного просмотра отчета. В общем случае аргументы метода DoCmd следуют в том же порядке, что и аргументы соответствующего макроса, что значительно упрощает процесс преобразования макросов в процедуры на языке VBA.