Автоматизация заполнения списка заказа в фирме занимающейся ремонтом техники

Эта задача встретилась в реальной деятельности организации, занимающейся ремонтом дорогостоящей строительной техники. Разработка будет включать несколько листов данных и листов управления.

Итак, будем считать, что мы располагаем рядом контрагентов (заказчиков), которые обращаются к нам по поводу ремонта их техники. Ремонт, как правило, связан с заменой большого количества деталей.

Основные трудности работы персонала связаны с обеспечением хранения и извлечения информации по каждому контракту, а также с формированием необходимых отчетов. В этом разделе мы разработаем единую информационную базу, которая позволит существенно облегчить труд сотрудников офиса.

Итак, начнем разработку с создания новой книги. Ее первый лист, который нам потребуется создать показан на рис.3.1. Он представляет справочную информацию по нашим заказчикам (фирмам).Здесь каждая строка представляет запись об одной из наших организаций-партнеров. Столбец Код предназначен для присвоения каждой фирме уникального кода (для того, чтобы однозначно идентифицировать каждую фирму). Дальнейшая информация достаточно стандартна – название, адрес, телефон, факс и ряд финансовых реквизитов.

Рис.3.1.

В верхней части листа располагается кнопка для ввода очередной записи – записи о новой фирме. Конечно, пользователь, работающий с данной книгой, может при появлении у нашей фирмы очередного партнера внести информацию о нем в очередную свободную строку. Однако для удобства с одной стороны и контроля с другой мы разработаем более удобную технологию. Программная процедура при этом будет самостоятельно отслеживать появление повторяющихся кодов фирм и блокировать подобные ситуации.

НЕ нашли? Не то? Что вы ищете?

Во-первых, нам потребуется создать форму ввода, которая приведена на рис.3.2. От пользователя требуется внести данные в необходимые поля и щелкнуть по кнопке для фиксации данных на листе Клиенты. Такие действия приведут к тому, что в очередную свободную строку листа будет внесена информация по новой фирме. При этом процедура обработки щелчка по кнопке предварительно проверит – встречался ли уже такой код у фирм? Если да, то ввод будет отменен. Также ввод будет отменен если пользователь оставит поле пустым.

Рис.3.2.

Таким образом, наша ближайшая цель – создать форму ввода (рис.3.2) и расположить на ней необходимые элементы управления. С формами в этом издании мы еще не сталкивались, поэтому рассмотрим процесс ее создания более подробно.

Для создания пользовательской формы необходимо перейти в окно Microsoft Visual Basic (рис.3.3). Здесь требуется воспользоваться разделом UserForm меню Insert. В результате на экране перед вами появится новая форма – это фактически контейнер для элементов управления.

У формы, как и любого элемента управления, есть свойства. Для того, чтобы открыть окно свойств следует воспользоваться разделом Properties Window из меню View. Изменим Name на Client, а также свойство Caption – Форма для ввода нового клиента. Значение свойства Caption будет отражено в заголовке формы.

Далее расположим на форме необходимые элементы управления. В соответствие с рис.3.2 на форме нам необходимо разместить 7 элементов типа Надпись и 7 элементов типа Текстовое окно. При этом значение свойства Name для надписей принципиального значения не имеет, т. к. программно мы обращаться к ним не будет. И для этих элементов его можно выбрать произвольно (главное, что не было повторяющихся имен). В таблице 3.1 приведены имена для текстовых окон.

Рис.3.3.

Таблица 3.1. Значения свойства Name для текстовых окон

Подпись около текстового окна

Name

Код

Cod

Название фирмы

Firma

Адрес

Adress

Телефон

Tel

Факс

Fax

ИНН

Inn

КПП

Kpp

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

Листинг 3.1. Обработка щелчка по кнопке Внести.

Private Sub CommandButton1_Click()

If Cod. Text = “” Then

MsgBox ("Поле код необходимо заполнить")

Exit Sub

End If

Nom = 0

While Worksheets(“Клиенты”).Cells(Nom + 2, 2).Value <> ""

Nom = Nom + 1

Wend

For i = 1 To Nom

CodList = Worksheets(“Клиенты”).Cells(i + 1, 1).Value

If CStr(CodList) = CStr(Cod. Text) Then

MsgBox ("Такой код фирмы уже встречался")

Exit Sub

End If

Next

Worksheets(“Клиенты”)..Cells(i + 1, 1).Value = Cod. Text

Worksheets(“Клиенты”)..Cells(i + 1, 2).Value = Firma. Text

Worksheets(“Клиенты”).Cells(i + 1, 3).Value = Adress. Text

Worksheets(“Клиенты”).Cells(i + 1, 4).Value = Tel. Text

Worksheets(“Клиенты”).Cells(i + 1, 5).Value = Fax. Text

Worksheets(“Клиенты”).Cells(i + 1, 6).Value = Inn. Text

Worksheets(“Клиенты”).Cells(i + 1, 7).Value = Kpp. Text

MsgBox ("Информация внесена")

Client. Hide

End Sub

Важный момент связан с предпоследней строй листинга 3.1. Здесь для формы Client применяется метод Hide, который приводит к закрытию формы. Разумеется ее необходимо сначала отобразить и об этом мы еще не говорили. На листинге 3.2 приведена процедура, которая выполняется по щелчку по кнопке (рис.3.1). Здесь используется метод Show.

Листинг 3.2. Обработка щелчка по кнопке Внести нового клиента.

Private Sub CommandButton1_Click()

Client. Show

End Sub

На рис. 3.4 приведен результат заполнения формы данными о фирме. Теперь щелчком по кнопке Внести эти данные переносятся на текущий рабочий лист.

Рис.3.4.

Перейдем к разработке еще двух листов. Один из них по названием Номенклатура показан на рис.3.5. В каждой строке листа располагается название конкретной запчасти. Поле Номер запчасти позволяет однозначно идентифицировать конкретную запчасть.

Рис.3.5.

Лист Номенклатура является справочным, и не содержит элементов управления. Технически пользователь просто вручную заполняет этот прайс. Еще один лист, который также не содержит элементов управления показан на рис.3.6.

Рис.3.6.

Данный лист содержит информацию о заказах – названиях и их составе. Во-первых, в столбце А указывается уникальный код для каждого заказа. Далее располагаются поля для отражения даты заказа и кода фирмы (по коду фирмы легко определить реквизиты фирмы). Начиная с 5-го столбца располагается информация о запчастях, которые входят в заказ. Структура записи о запчасти выглядит следующим образом: в 5-й колонке код запчасти, далее в 6-й количество таких запчастей в заказе, в 7-й колонке код другой запчасти и соответственно далее количество.

Однако для внесения этой информации мы создадим специальный лист. Это связано с удобством для пользователя, а также контролем уникальности номера заказа. Поэтому, разработаем лист, показанный на рис.3.7.

Рис.3.7.

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

Теперь перейдем к рассмотрению процедур. Первое, что потребуется – это заполнить список Список запчастей.

Листинг 3.3. Процедура выполняемая при активизации листа.

Private Sub Worksheet_Activate()

Spk1.Clear

N = 0

While Worksheets("Номенклатура").Cells(N + 2, 1).Value <> ""

N = N + 1

Wend

For i = 1 To N

Spk1.AddItem Worksheets("Номенклатура").Cells(i + 1, 1).Value + _

" " + Worksheets("Номенклатура").Cells(i + 1, 2).Value + " " + _

CStr(Worksheets("Номенклатура").Cells(i + 1, 3).Value) + " руб."

Next

End Sub

Следующее – обеспечить обработку щелчка по кнопке Включить.

Листинг 3.4. Процедура обработки щелчка по кнопке Включить.

Private Sub CommandButton1_Click()

nom = Spk1.ListIndex

N = 0

While Cells(N + 11, 1).Value <> ""

N = N + 1

Wend

Cells(N + 11, 1) = _

Worksheets("Номенклатура").Cells(Spk1.ListIndex + 2, 1)

Cells(N + 11, 2) = _

Worksheets("Номенклатура").Cells(Spk1.ListIndex + 2, 2)

Cells(N + 11, 3) = _

Worksheets("Номенклатура").Cells(Spk1.ListIndex + 2, 3)

Cells(N + 11, 4) = Col. Text

End Sub

Листинг 3.5. Процедура обработки щелчка по кнопке Включить в список заказов.

Private Sub InputSpk_Click()

VerZakaz = CStr(Range("C3").Value)

If VerZakaz = "" Then

MsgBox ("Поле кода заказа необходимо заполнить")

Exit Sub

End If

nom = 0

While Worksheets("Названия заказов").Cells(nom + 2, 2).Value <> ""

nom = nom + 1

Wend

For i = 1 To nom

CodList = Worksheets("Названия заказов").Cells(i + 1, 1).Value

If CStr(CodList) = VerZakaz Then

MsgBox ("Такой код заказа уже встречался")

Exit Sub

End If

Next

Worksheets("Названия заказов").Cells(N + 2, 1).Value = _

Range("C3").Value

Worksheets("Названия заказов").Cells(N + 2, 2).Value = Date

NDetal = 0

While Cells(NDetal + 11, 2).Value <> ""

nom = nom + 1

Wend

For i = 1 To nom

Worksheets("Названия заказов").Cells(N + 2, 5 + (i - 1) * 2).Value = Cells(i + 10, 1).Value

Worksheets("Названия заказов").Cells(N + 2, 5 + (i - 1) * 2 + 1).Value = Cells(i + 10, 4).Value

Next

End Sub

Терерь перейдем к отчетам. Однн из них показан на рис.3.8. Здесь требуется автоматическое заполнение ячейки листа отводимой для заказчика. Также требуется заполнение адреса, телефона и факса. Табличная часть на рис.3.8 используется в случае, если число позиций в заказе не превышает трех. В противном случае данная табличная часть не заполняется, а создается другой документ Приложение (рис.3.9).

Перейдем теперь к разработке этих функциональных особенностей.

Рис.3.9.

Рис.3.10.

Во-первых, на листе Названия заказов создадим кнопку Создать отчет (рис.3.11). По этой кнопке будет открываться форма, где от пользователя требуется выбрать заказ по которому требуется напечать отчет.

Рис.3.11.

На рис.3.12 показана форма ввода, которая открывается по кнопке Создать отчет. На листинге

Листинг 3.6. Процедура обработки щелчка по кнопке Создать отчет.

Private Sub CommandButton1_Click()

Zakaz. Show

End Sub

На листинге 3.7 приведена процедура, которая выполняется при активизации формы. Ее назначение заключается в заполнении списка (точнее элемента управления – Поле со списком).

Листинг 3.6. Процедура выполняемая при активизации формы

Private Sub UserForm_Activate()

nom = 0

While Worksheets("Названия заказов").Cells(nom + 2, 1).Value <> ""

nom = nom + 1

Wend

Spk1.Clear

For i = 1 To nom

nomfirma = Worksheets("Названия заказов").Cells(i + 1, 3).Value

nfir = 0

While Worksheets("Клиенты").Cells(nfir + 2, 1).Value <> ""

nfir = nfir + 1

Wend

flag = 0

For j = 1 To nfir

If nomfirma = Worksheets("Клиенты").Cells(j + 1, 1).Value Then

Firma = Worksheets("Клиенты").Cells(j + 1, 2).Value

flag = 1

Exit For

End If

Next

If flag = 0 Then

MsgBox "Фирмы с кодом " + CStr(nomfirma) + " нет"

Else

Spk1.AddItem CStr(Worksheets("Названия заказов").Cells(i + 1, _

1).Value) + " " + _

CStr(Worksheets("Названия заказов").Cells(i + 1, 2).Value) + _

" " + _

CStr(Firma)

End If

Next

End Sub

Следующая процедура – обработка щелчка по кнопке Заполнить акт и приложение. В зависимости от количества позиций заказа она заполнять или только лист АКТ или параллельно с актом еще и лист приложение. На листинге приведен первоначальный вариант, который приводит к заполнению только акта (в случае небольшого количества заявок).

Private Sub CommandButton1_Click()

nomzak = Spk1.ListIndex

coldet = 0

While Worksheets("Íàçâàíèÿ çàêàçîâ").Cells(nomzak + 2, 5 + coldet * 2).Value <> ""

coldet = coldet + 1

Wend

nprais = 0

While Worksheets("Íîìåíêëàòóðà").Cells(nprais + 2, 1).Value <> ""

nprais = nprais + 1

Wend

nfirm = 0

While Worksheets("Êëèåíòû").Cells(nfirm + 2, 1).Value <> ""

nfirm = nfirm + 1

Wend

codfirm = Worksheets("Íàçâàíèÿ çàêàçîâ").Cells(nomzak + 2, 3).Value

For i = 1 To nfirm

If codfirm = Worksheets("Êëèåíòû").Cells(i + 1, 1).Value Then

nazv = Worksheets("Êëèåíòû").Cells(i + 1, 2).Value

adr = Worksheets("Êëèåíòû").Cells(i + 1, 3).Value

Tel = Worksheets("Êëèåíòû").Cells(i + 1, 4).Value

Fax = Worksheets("Êëèåíòû").Cells(i + 1, 5).Value

Inn = Worksheets("Êëèåíòû").Cells(i + 1, 6).Value

End If

Next

Worksheets("ÀÊÒ").Cells(6, 3).Value = nazv

Worksheets("ÀÊÒ").Cells(7, 3).Value = "Àäðåñ:" + adr

Worksheets("ÀÊÒ").Cells(8, 3).Value = "Òåëåôîí:" + Tel

Worksheets("ÀÊÒ").Cells(9, 3).Value = "Ôàêñ:" + Fax

If coldet < 4 Then

For i = 1 To coldet

Worksheets("ÀÊÒ").Cells(i + 12, 2).Value = _

Worksheets("Íàçâàíèÿ çàêàçîâ").Cells(nomzak + 2, 5 + (i - 1) * 2).Value

For j = 1 To nprais

If CStr(Worksheets("ÀÊÒ").Cells(i + 12, 2).Value) = _

CStr(Worksheets("Íîìåíêëàòóðà").Cells(j + 1, 1).Value) Then

nazvanie = CStr(Worksheets("Íîìåíêëàòóðà").Cells(j + 1, 2).Value)

tarif = CStr(Worksheets("Íîìåíêëàòóðà").Cells(j + 1, 3).Value)

Exit For

End If

Next

Worksheets("ÀÊÒ").Cells(i + 12, 3).Value = nazvanie

Worksheets("ÀÊÒ").Cells(i + 12, 3).Value = nazvanie

Worksheets("ÀÊÒ").Cells(i + 12, 5).Value = tarif

Worksheets("ÀÊÒ").Cells(i + 12, 4).Value = _

Worksheets("Íàçâàíèÿ çàêàçîâ").Cells(nomzak + 2, 5 + (i - 1) * 2 + 1).Value

Next

End If

Hide

End Sub