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