Microsoft Excel

трюкиприёмырешения

Пример формирования денежных начислений при помощи VBA Excel

Рассмотрим пример, в котором с помощью уже знакомых элементов управления мы создадим автоматизированную книгу для формирования списка сотрудников для получения денежного вознаграждения. Начнем создание новой книги, и один из листов (рис. 2.20) будет содержать списки сотрудников различных филиалов (или различных подразделений). Фактически это достаточно статическая справочная информация, которая время от времени корректируется (производится добавление и удалите сведений непосредственно в ячейках рабочего листа). Эти данные будут использоваться далее па первом листе, который назовем Начисления (рис. 2.21).

Рис. 2.20. Списки сотрудников филиалов

Рис. 2.20. Списки сотрудников филиалов

В верхней части листа Начисления расположены три переключателя для выбора одного из филиалов. Далее, правее — поле со списком и три кнопки. Значения свойства Name всех перечисленных элементов управления указаны в табл. 2.1.

Таблица 2.1. Перечень элементов управления на листе Начисления

Тип элемента управления Name Caption
Переключатель Op1 Филиал 1
Переключатель Op2 Филиал 2
Переключатель Op3 Филиал 3
Кнопка VKL Включить
Кнопка CLR Очистка
Кнопка Prn Печать
Поле со списком SPK

Поясним, в чем заключается функционирование книги. Цель достаточно простая — заполнить необходимыми данными столбцы В, С и D. А именно: заполнить выборочный список сотрудников с указанием денежного вознаграждения. Для этого предназначено поле со списком и кнопка Включить.

Рис. 2.21. Оформление листа Начисления

Рис. 2.21. Оформление листа Начисления

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

1
2
3
4
5
6
7
8
9
10
11
' Листинг 2.28. Обработка щелчка на переключателе Филиал 1
Private Sub Op1_Click()
N = 0
While Worksheets(2).Cells(N + 2, 1).Value <> ""
N = N + 1
Wend
Spk.Clear
For i = 1 To N
    Spk.AddItem Worksheets(2).Cells(i + 1, 1).Value
Next
End Sub

Процедуры, выполняемые по щелчкам на других переключателях (Филиал 2 и Филиал 3), представлены в листинге 2.29.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
' Листинг 2.29. Обработка щелчков на переключателях Филиал 2 и Филиал 3
Private Sub Op2_Click()
N = 0
While Worksheets(2).Cells(N + 2, 2).Value <> ""
N = N + 1
Wend
Spk.Clear
For i = 1 To N
    Spk.AddItem Worksheets(2).Cells(i + 1, 2).Value
Next
End Sub
 
Private Sub Op3_Click()
N = 0
While Worksheets(2).Cells(N + 2, 3).Value <> ""
N = N + 1
Wend
Spk.Clear
For i = 1 To N
    Spk.AddItem Worksheets(2).Cells(i + 1, 3).Value
Next
End Sub

Теперь, после того как поле со списком включает сотрудников выбранного филиала, пользователь должен указать необходимую фамилию и затем щелчком на кнопке Включить добавить ее в перечень (столбец С) на листе Начисления (рис. 2.22). Процедура, которая для этого потребуется, приведена в листинге 2.30.

1
2
3
4
5
6
7
8
9
' Листинг 2.30. Обработка щелчка на кнопке Включить
Private Sub Vk1_Click()
N = 0
While Cells(N + 8, 2).Value <> ""
    N = N + 1
Wend
Cells(N + 8, 2).Value = N + 1
Cells(N + 8, 3).Value = Spk.Text
End Sub

Теперь необходимо разработать процедуру (листинг 2.31) заполнения листа Печать, где информация приведена без лишних элементов управления. В ней для формирования необходимых границ мы воспользовались коллекцией Borders. На рис. 2.23 приведен один из вариантов ее заполнения.

Рис. 2.22. Внесение фамилий и начисленных сумм

Рис. 2.22. Внесение фамилий и начисленных сумм

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
' Листинг 2.31. Процедура, выполняемая по щелчку на кнопке Печать
Private Sub Prn_Click()
' Подсчет числа строк с фамилиями на 3-м листе
N = 0
While Worksheets(3).Cells(N + 5, 3).Value <> ""
    N = N + 1
Wend
' Очистка информации с удалением границ
For i = 1 To N
        For j = 1 To 3
        Worksheets(3).Cells(4 + i, j + 1).Value = ""
    Worksheets(3).Cells(4 + i, j + 1).Borders.LineStyle = xlNone
    Next
Next
' Подсчет числа строк с фамилиями на 1-м листе
N1 = 0
While Cells(N1 + 8, 3).Value <> ""
    N1 = N1 + 1
Wend
' Цикл для заполнения 3-го листа
For i = 1 To N1
    Worksheets(3).Cells(4 + i, 2).Value = i
    Worksheets(3).Cells(4 + i, 3).Value = Cells(i + 7, 3)
    Worksheets(3).Cells(4 + i, 4).Value = Cells(i + 7, 4)
' Оформление ячеек границей
    For j = 1 To 3
    Worksheets(3).Cells(4 + i, j + 1).Borders.LineStyle = xlContinuous
    Next
Next
Worksheets(3).Activate
End Sub
Рис. 2.23. Оформление листа Печать

Рис. 2.23. Оформление листа Печать

Теперь осталась только процедура, выполняемая по щелчку на кнопке Очистка. Она приведена в листинге 2.32. Разработка готова, и вы можете проверить ее работоспособность.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
' Листинг 2.32. Процедура, выполняемая по щелчку на кнопке Очистка
Private Sub Clr_Click()
N = 0
While Cells(N + 8, 2).Value <> ""
    N = N + 1
Wend
' Очистка данных на текущем листе
Range(Cells(8, 2), Cells(8 + N, 4)) = ""
' Подсчет заполненных ячеек на третьем листе
N = 0
While Worksheets(3).Cells(N + 5, 3).Value <> ""
    N = N + 1
Wend
' Очистка ячеек на третьем листе
For i = 1 To N
    For j = 1 To 3
    Worksheets(3).Cells(4 + i, j + 1).Value = ""
    Worksheets(3).Cells(4 + i, j + 1).Borders.LineStyle = xlNone
    Next
Next
End Sub
Top