Microsoft Excel

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

Модернизируем в VBA автоматизированный бланк заказа

В предыдущей статье мы рассмотрели один из вариантов формирования бланка заказа. Понятно, что в многочисленных практических ситуациях требуются различные бланки. Рассмотрим разработку автоматизированного бланка вида, показанного на рис. 2.5. В этом случае прайс-лист формируется из товаров общей категории (рис. 2.6), и при открытии книги все поля со списками на первом листе книги заполняются одинаковым набором товаров. В отличие от предыдущей статьи, в книгу добавлена дополнительная функциональность — столбец для указания количества единиц выбранного товара. В другом столбце (Е) подсчитывается сумма по каждому товару, указанному в бланке — это обычная формула в ячейке (произведение стоимости единицы товара на количество). Такая организация бланка позволяет получить в заказе несколько однотипных товаров (например, несколько сумок).

Рис. 2.5. Модернизированный вариант бланка

Рис. 2.5. Модернизированный вариант бланка

В листинге 2.5 представлена процедура, выполняемая при открытии книги. С учетом предыдущих разработок, строки программы не требуют дополнительного комментария. Заметим только, что имена списков выбраны следующим образом — Spk1, Spk2, Spk3, Spk4, Spk5. В отличие от только что рассмотренного бланка, в этом случае списки заполняются одинаково — всеми позициями номенклатуры, которые имеются в прайс-листе.

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.5. Процедура, выполняемая при открытии книги
Private Sub Workbook_open()
' Очистка списков на первом листе книги
Worksheet(1).Spk1.Clear
Worksheet(1).Spk2.Clear
Worksheet(1).Spk3.Clear
Worksheet(1).Spk4.Clear
Worksheet(1).Spk5.Clear
' Подсчет в переменной N количества товаров по прайсу
N = 0
While Worksheets(2).Cells(N + 2, 1).Value <> ""
    N = N + 1
Wend
' Заполнение списков
For i = 2 To N + 1
Worksheets(1).Spk1.AddItem Worksheets(2).Cells(i, 1).Value
Worksheets(1).Spk2.AddItem Worksheets(2).Cells(i, 1).Value
Worksheets(1).Spk3.AddItem Worksheets(2).Cells(i, 1).Value
Worksheets(1).Spk4.AddItem Worksheets(2).Cells(i, 1).Value
Worksheets(1).Spk5.AddItem Worksheets(2).Cells(i, 1).Value
Next
' Установка начальных параметров
Worksheets(1).Spk1.ListIndex = -1
Worksheets(1).Spk2.ListIndex = -1
Worksheets(1).Spk3.ListIndex = -1
Worksheets(1).Spk4.ListIndex = -1
Worksheets(1).Spk5.ListIndex = -1
Worksheets(1).Nomer.Text = ""
Worksheets(1).Range("A7:A11").Value = ""
Worksheets(1).Range("C7:D11").Value = ""
End Sub

После открытия книги ее функциональность обеспечивается процедурами, выполняемыми по щелчкам на списках товаров — когда мы выбираем котгкретный товар.

В листинге 2.6 представлена процедура, выполняемая при щелчке на первом списке (самом верхнем). Здесь первая строка обеспечивает выбор цены из прайс-листа для соответствующего товара. Следующие строки — установку единицы в качестве номера строки и единицы в качестве количества единиц выбранной номенклатуры. Для автоматического вычисления суммы в ячейке Е7 установим формулу =C7*D7.

В реальной работе часто требуется отменять принятое решение — отменять выбранную позицию товара. Для реализации этого мы использовали процедуру Spk1_Change, которая автоматически выполняется при изменениях в поле со списком. На рис. 2.7 приведен текст данной процедуры, который обеспечивает при удалении информации из поля со списком сброс значений в ячейках А7, С7, D7.

1
2
3
4
5
6
7
' Листинг 2.6. Процедура, выполняемая по щелчку на первом списке
Private Sub Spk1_Click()
Range("C7").Value = _
Worksheets(2).Cells(Spk1.ListIndex + 2, 2).Value
Range("A7").Value = 1
Range("D7").Value = 1
End Sub
1
2
3
4
5
6
7
8
' Листинг 2.7. Процедура, выполняемая при изменениях в первом списке
Private Sub Spk1_Change()
If Spk1.Text = "" Then
    Range("A7").Value = ""
    Range("C7").Value = ""
    Range("D7").Value = ""
End If
End Sub
Рис. 2.6. Общий прайс-лист товаров

Рис. 2.6. Общий прайс-лист товаров

Таким образом, процедуры, приведенные в листингах 2.6 и 2.7, обеспечивают работу пользователя с первой строкой бланка заказа. В листингах 2.8 и 2.9 приведены аналогичные процедуры для второй строки бланка.

1
2
3
4
5
6
7
' Листинг 2.8. Процедура, выполняемая по щелчку на втором списке
Private Sub Spk2_Click()
Range("C8").Value = _
Worksheets(2).Cells(Spk2.ListIndex + 2, 2).Value
Range("A8").Value = 2
Range("D8").Value = 1
End Sub
1
2
3
4
5
6
7
8
' Листинг 2.9. Процедура, выполняемая при изменениях во втором списке
Private Sub Spk2_Change()
If Spk2.Text = "" Then
    Range("A8").Value = ""
    Range("C8").Value = ""
    Range("D8").Value = ""
End If
End Sub
Рис. 2.7. Печать бланка заказа

Рис. 2.7. Печать бланка заказа

Осталось обеспечить печать бланка (рис. 2.7). В листинге 2.10 приведена процедура, которая обеспечивает заполнение печатной формы.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
' Листинг 2.10. Процедура печати бланка
Private Sub Prn_Click()
' Очистка табличной части печатной формы
Worksheets(3).Range("A11:E16").Value = ""
' Перенос информации с бланка в печатную форму
For i = 1 To 5
    Worksheets(3).Cells(i + 10, 1).Value = Cells(6 + i, 1).Value
    Worksheets(3).Cells(i + 10, 3).Value = Cells(6 + i, 3).Value
    Worksheets(3).Cells(i + 10, 4).Value = Cells(6 + i, 4).Value
    Worksheets(3).Cells(i + 10, 5).Value = Cells(6 + i, 5).Value
Next
Worksheets(3).Cells(11, 2).Value = Spk1.Text
Worksheets(3).Cells(12, 2).Value = Spk2.Text
Worksheets(3).Cells(13, 2).Value = Spk3.Text
Worksheets(3).Cells(14, 2).Value = Spk4.Text
Worksheets(3).Cells(15, 2).Value = Spk5.Text
Worksheets(3).Range("D2").Value = Nomer.Text
Worksheets(3).Range("D16").Value = "ИТОГО"
Worksheets(3).Range("E16").Value = Range("E12").Value
Worksheets(3).Activate
End Sub
Top