Заполнение таблицы excel через форму vba

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

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

Итак, начнем работу с создания новой рабочей книги Microsoft Excel. Один из ее листов показан на рис. 3.1. В нем размещается справочная информация по нашим заказчикам (клиентам). Каждая строка на листе Клиенты представляет запись об одной из наших организаций-партнеров. Обратим внимание на то, что в дальнейшем в программных процедурах обращение к данному листу будет производиться по имени, поэтому следует присвоить ему имя Клиенты. Столбец Код предназначен для присвоения каждой фирме уникального кода (для того, чтобы однозначно идентифицировать каждую фирму). В целом информация, представленная в строках листа (см. рис. 3.1), достаточно стандартная: название, адрес, телефон, факс и ряд финансовых реквизитов.

Рис. 3.1. Справочная информация о клиентах

Рис. 3.1. Справочная информация о клиентах

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

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

Рис. 3.2. Форма ввода информации о клиентах

Рис. 3.2. Форма ввода информации о клиентах

Таким образом, наша ближайшая цель — создать форму ввода (рис. 3.2) и расположить на ней необходимые элементы управления. С формами мы еще не сталкивались, поэтому рассмотрим процесс их создания более подробно. Для создания пользовательской формы необходимо перейти в окно редактора Visual Basic. Здесь требуется воспользоваться разделом UserForm в меню Insert (рис. 3.3). В результате на экране появится новая форма, которая фактически представляет собой контейнер для размещения на ней необходимых элементов управления.

Рис. 3.3. Пользовательская форма в среде Microsoft Visual Basic

Рис. 3.3. Пользовательская форма в среде Microsoft Visual Basic

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

Далее расположим на форме необходимые элементы управления. Для этого сначала необходимо отобразить на экране панель инструментов (View ► Toolbox). В соответствии с рис. 3.2 на форме нам следует разместить 7 элементов управления типа Label (надпись) и 7 элементов TextBox (текстовое окно). При этом значения свойства Name для надписей принципиального значения не имеют, так как программно мы обращаться к ним не будем. Для этих элементов выберите рассматриваемые значения произвольно (главное, чтобы не было повторяющихся имен — иначе среда Microsoft Visual Basic обратит на это внимание). Аналогичное свойство для текстовых окоп лам потребуется в программных процедурах, поэтому в табл. 3 приведены значения свойства Name текстовых окон, которые следует установить.

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

Подпись Name
Код Cod
Название фирмы Firma
Адрес Adress
Телефон Tel
Факс Fax
ИНН Inn
КПП Kpp

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

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
' Листинг 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
    If CStr(Worksheets("Клиенты").Cells(i + 1, 2).Value = _
    CStr(Firma.Text) And _
    CStr(Worksheets("Клиенты").Cells(i + 1, 3).Value) = _
    CStr(Adress.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). Здесь для отображения на экране формы Client используется метод Show.

1
2
3
4
' Листинг 3.2. Обработка щелчка на кнопке Ввести нового клиента
Private Sub CommandButton1_Click()
	Client.Show
End Sub

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

Рис. 3.4. Внесение информации о новом клиенте

Рис. 3.4. Внесение информации о новом клиенте

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

Рис. 3.5. Информация о номенклатуре

Рис. 3.5. Информация о номенклатуре

Лист Номенклатура является справочным и не содержит элементов управления. Технически пользователь просто вручную заполняет данный прайс-лист. Еще один лист, который также не содержит элементов управления, показан на рис. 3.6. Здесь содержится информация о заказах — названиях и их составе. Столбец А предназначен для уникального кода каждого заказа. Далее располагаются поля для отображения даты заказа и кода фирмы (по коду фирмы легко определить необходимые реквизиты организации).

Рис. 3.6. Лист для хранения информации о заказах

Рис. 3.6. Лист для хранения информации о заказах

Начиная с пятого столбца размещается информация о запасных частях, которые входят в заказ. Структура этой информации выглядит следующим образом: в пятом столбце код запчасти, далее в шестом количество таких запчастей в заказе, затем в седьмом столбце код другой запчасти, и далее их количество. Таким образом, в каждой строке перечисляется все содержимое определенного заказа. Понятно, что вручную заполнять подобную информацию не слишком удобно. Для этого мы создадим специальный лист с необходимыми элементами управления. В результате будет обеспечено удобство для пользователя, а также контроль уникальности кода заказа. Лист, который будет выполнять необходимый «функционал», показан на рис. 3.7. В качестве названия листа выберем Бланк для нового заказа.

Рассмотрим организацию листа Бланк для нового заказа и техническую работу пользователя с ним. Ячейка C1 отводится для номера заказа. Ниже поясняющего текста Заказчик (расположенного в ячейке А1) располагается элемент управления «Поле со списком». В качестве значения свойства Name этого элемента управления выбрано Firma. Ниже поясняющего текста Список запчастей располагается еще один элемент управления «Поле со списком». В качестве значения свойства Name выбрано Spk.

Щелчком на определенной запчасти она включается в заказ, который формируется с 11-й строки на данном листе. Столбцы Номер запчасти, Наименование и Цена заполняются исходя из имеющейся информации на листе Номенклатура. Пользователю следует лишь внести количество единиц указанной детали в перечне запасных частей. Для этого предназначено текстовое окно (Name — Col) с надписью выше — Количество. После этого осталось щелкнуть на кнопке Включить (Name — InputNom), и в очередную свободную строку на данном листе запишется новая позиция заказа.

Рис. 3.7. Лист для формирования заказа

Рис. 3.7. Лист для формирования заказа

После того как список запасных частей таким образом заполнен и номер заказа указан, осталось щелкнуть на кнопке Включить в список заказов. В качестве значения свойства Name этой кнопки выбрано InputSpk. За счет программной процедуры это приводит к переносу информации о заказе на лист Названия заказов. Таким образом, теперь можно перейти к рассмотрению процедур, которые обеспечивают выполнение описанных действий. Когда пользователь в процессе работы с книгой переходит на лист Бланк для нового заказа, списки заказчиков и запасных частей должны быть заполнены. Проще всего это обеспечить с помощью процедуры, выполняемой при активизации листа, которая представлена в листинге 3.3.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
' Листинг 3.3. Процедура, выполняемая при активизации листа
Private Sub Worksheet_Activate()
Firma.Clear
N = 0
While Worksheets("Клиенты").Cells(N + 2, 1).Value <> ""
    N = N + 1
Wend
For i = 1 To N
    Firma.AddItem Worksheets("Клиенты").Cells(i + 2, 2).Value
Next
Spk.Clear
N = 0
While Worksheets("Nomen").Cells(N + 2, 1).Value <> ""
    N = N + 1
Wend
For i = 1 To N
    Spk.AddItem Worksheets("Nomen").Cells(i + 1, 1).Value + _
    "" + Worksheets("Номенклатура").Cells(i + 1, 2).Value + "" + _
    CStr(Worksheets("Номенклатура").Cells(i + 1, 3).Value) + "руб."
Next
End Sub

Приведенная процедура заполнения полей со списками организаций и запчастей похожа на рассмотренные ранее примеры и не требует комментария. Более интересна следующая процедура (листинг 3.4), которая выполняется при щелчке на кнопке Включить.

1
2
3
4
5
6
7
8
9
10
11
12
' Листинг 3.4. Процедура обработки щелчка на кнопке Включить
Private Sub InputNom_Click()
Nom = Spk.ListIndex
N = 0
While Cells(N + 11, 1).Value <> ""
    N = N + 1
Wend
Cells(N + 11, 1) = Worksheets("Номенклатура").Cells(Spk.ListIndex + 2, 1)
Cells(N + 11, 2) = Worksheets("Номенклатура").Cells(Spk.ListIndex + 2, 2)
Cells(N + 11, 3) = Worksheets("Номенклатура").Cells(Spk.ListIndex + 2, 3)
Cells(N + 11, 4) = Col.Text
End Sub

Здесь в переменную Nom заносится индекс (номер) элемента, который выделен в элементе управления «Поле со списком», отведенном для запасных частей. Далее подсчитывается число уже заполненных позиций в заказе — они располагаются начиная с 11-й строки. После этого в следующую свободную строку заносится очередная запись. При этом количество единиц указанной позиции заказа извлекается из содержимого текстового окна Col.

Теперь на очереди другая процедура (листинг 3.5), которая переносит информацию с листа Бланк для нового заказа на лист Названия заказов, о котором мы уже говорили. В начале процедуры InputSpk_Click() предварительно проверяется — внесена ли информация в ячейку C1. Далее производится поиск присутствия заказа с указанным на листе номером. В случае положительного ответа на этот вопрос процедура не производит запись, а возвращает пользователя к работе с листом формирования нового заказа. В случае уникальности нового номера заказа процедура последовательно переносит имеющуюся информацию в каталог заказов. Для формирования даты используется стандартная функция VBA Date.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
' Листинг 3.5. Процедура обработки щелчка на кнопке Включить в список заказов
Private Sub InputSpk_Click()
' Номер потенциального заказа
VerZakaz = CStr(Range("C1").Value)
If VerZakaz = "" Then
    MsgBox ("Поле кода заказа необходимо заполнить")
    Exit Sub
End If
If Firma.ListIndex = -1 Then
    MsgBox ("Необходимо указать фирму")
    Exit Sub
End If
' Извлечение информации о коде фирмы
CodFirma = Worksheets("Клиенты").Cells(Firma.ListIndex + 2, 1).Value
' Подсчет числа имеющихся заказов
N = 0
While Worksheets("Названия заказов").Cells(N + 2, 1).Value <> ""
    N = N + 1
Wend
' Проверка возможного повтора номера заказа
For i = 1 To N
    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("C1").Value
' Использование стандартной функции для получения даты
Worksheets("Названия заказов").Cells(N + 2, 2).Value = Date
Worksheets("Названия заказов").Cells(N + 2, 3).Value = CodFirma
' Вводим переменную для подсчета суммы
NDetal = 0
While Cells(NDetal + 11, 2).Value <> ""
    NDetal = NDetal + 1
Wend
' Подсчет числа деталей в заказе
SymmaItog = 0
For i = 1 To NDetal
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
SymmaItog = SymmaItog + CLng(Cells(i + 10, 4).Value) * _
CLng(Cells(i + 10, 3).Value)
Next
Worksheets("Названия заказов").Cells(N + 2, 4).Value = SymmaItog
    MsgBox ("Заказ включен")
End Sub

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

Рис. 3.8. Пример формирования заказов

Рис. 3.8. Пример формирования заказов

Перейдем к отчетам, и один из них показан на рис. 3.9. На этом листе часть информации статична (заголовок и подписи столбцов), а ряд ячеек заполняется исходя из содержания конкретного заказа, которое зафиксировано на листе Названия заказов.

Рис. 3.9. Отчет о заказе

Рис. 3.9. Отчет о заказе

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

Рис. 3.10. Приложение к отчету о заказе

Рис. 3.10. Приложение к отчету о заказе

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

Процедура, вызываемая щелчком на кнопке Создать отчет, представлена в листинге 3.6. Ее назначение — открыть форму, обеспечивающую необходимый интерфейс для формирования отчета (см. рис. 3.11).

1
2
3
4
' Листинг 3.6. Процедура обработки щелчка на кнопке Создать отчет
Private Sub CommandButton1_Click()
	Zakaz.Show
End Sub

Рис. 3.11. Форма выбора заказа для отчета

Рис. 3.11. Форма выбора заказа для отчета

В листинге 3.7 приведена процедура, которая выполняется при активизации формы. Ее назначение заключается в заполнении элемента управления «Поле со списком». При этом сначала подсчитывается количество заказов, уже имеющихся в базе данных. Информация о том, какая фирма его сделала, расположена на листе Клиенты. Поэтому для заполнения поля со списком на рис. 3.11 необходимо обратиться к информации о клиентах.

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
' Листинг 3.7. Процедура, выполняемая при активизации формы
Private Sub UserForm_Activate()
' Подсчет числа заказов
Nom = 0
While Worksheets("Названия заказов").Cells(Nom + 2, 1).Value <> ""
    Nom = Nom + 1
Wend
' Подсчет числа фирм
Nfir = 0
While Worksheets("Клиенты").Cells(Nfir + 2, 1).Value <> ""
    Nfir = Nfir + 1
Wend
' Очистка и последующее заполнение поля со списком
Spk.Clear
' Перебор числа заказов
For i = 1 To Nom
' Извлечение кода фирмы
NomFirma = Worksheets("Названия заказов").Cells(i + 1, 3).Value
    For j = 1 To Nfir
    If NomFirma = Worksheets("Клиенты").Cells(j + 1, 1).Value Then
    Firma = Worksheets("Клиенты").Cells(j + 1, 2).Value
    ' При нахождении фирмы выход из цикла
    Exit For
    End If
    Next
Spk.AddItem CStr(Worksheets("Названия заказов").Cells(i + 1, 1).Value) _
+ " " + CStr(Worksheets("Названия заказов").Cells(i + 1, 2).Value) _
+ " " + CStr(Firma)
Next
End Sub

Теперь пользователь должен выбрать интересующую его фирму (рис. 3.12). Следующая процедура — обработка щелчка на кнопке Заполнить акт и приложение. Учитывая сложность полного программного кода, приведем его сначала для варианта заполнения только листа АКТ (листинг 3.8).

Рис. 3.12. Выбор заказа для отчета

Рис. 3.12. Выбор заказа для отчета

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

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
' Листинг 3.8. Процедура обработки щелчка на кнопке Заполнить акт и приложение
Private Sub CommandButton1_Click()
' Определяем индекс выбранного заказа в списке
NomSpk = Spk.ListIndex
' Подсчет количества деталей в выбранном заказе
ColDet = 0
While Worksheets("Название заказа").Cells(NomSpk + 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(NomSpk + 2, 3).Value
For i = 1 To NFirm
' Нахождение реквизитов фирмы по ее коду
If CodFirm = Worksheets("Клиенты").Cells(i + 1, 1).Value Then
    Название заказа = 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
    Exit For
End If
Next
' Внесение найденных реквизитов в поля на листе АКТ
Worksheets("Акт").Cells(6, 3).Value = Nazv
Worksheets("Акт").Cells(7, 3).Value = "ADRES:" + Adr
Worksheets("Акт").Cells(8, 3).Value = "telefon:" + Tel
Worksheets("Акт").Cells(9, 3).Value = "phaks:" + Fax
Worksheets("Акт").Cells(6, 5).Value = _
Worksheets("Название заказа").Cells(NomSpk + 2, 1)
' Очистка области для перечня запасных частей
Worksheets("Акт").Range("A13:F15") = ""
' Заполнение табличной части листа АКТ
If ColDet < 4 Then
    For i = 1 To ColDet
' Формирование порядкового номера перечня
Worksheets("Акт").Cells(i + 12, 1).Value = i
Worksheets("Акт").Cells(i + 12, 2).Value = _
Worksheets("Название заказа").Cells(NomSpk + 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, 5).Value = Tarif
Worksheets("Акт").Cells(i + 12, 4).Value = _
Worksheets("Название заказа").Cells(NomSpk + 2, _
5 + (i - 1) * 2 + 1).Value
Worksheets("Акт").Cells(i + 12, 6).Value = Tarif * _
Worksheets("Акт").Cells(i + 12, 4).Value
Next
End If
Hide
End Sub

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

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

Далее по коду фирмы с листа Клиенты извлекается информация о заказчике, которая далее переносится на лист АКТ. После этого производится заполнение табличной части. Здесь мы реализовали только ситуацию, когда количество деталей не превышает трех:

С учетом ранее рассмотренной организации листа Клиенты информация о кодах запасных частей располагается начиная с 5-го столбца. Поэтому следующая конструкция позволяет получить данные о составе заказа:

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

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

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

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
' Листинг 3.9. Изменение процедуры щелчка на кнопке Заполнить акт и приложение
Private Sub CommandButton1_Click()
' Определяем индекс выбранного заказа в списке
NomSpk = Spk.ListIndex
' Подсчет количества деталей в выбранном заказе
ColDet = 0
While Worksheets("Названия заказов").Cells(NomSpk + 2, _
    5 + ColDet * 2).Value <> ""
    ColDet = ColDet + 1
Wend
' Подсчет количества позиций по прайсу
NPrais = 0
While Worksheets("Номенклатура").Cells(NFirm + 2, 1).Value <> ""
	NPrais = NPrais + 1
Wend
' Подсчет числа фирм
NFirm = 0
    NFirm = NFirm + 1
Wend
' Извлекаем код фирмы в выбранном заказе
CodFirm = Worksheets("Названия заказов").Cells(NomSpk + 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
    Exit For
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
    Worksheets("АКТ").Cells(6, 5).Value = _
    Worksheets("Названия заказов").Cells(NomSpk + 2, 1)
    Worksheets("Приложение").Cells(1, 6).Value = _
    Worksheets("Названия заказов").Cells(NomSpk + 2, 1)
    ' Очистка области для перечня запасных частей
    Worksheets("АКТ").Range("A13:F15") = ""
    Worksheets("Приложение").Range("A4:F100") = ""
If ColDet < 4 Then
    For i = 1 To ColDet
    Worksheets("АКТ").Cells(i + 12, 1).Value = i
    Worksheets("АКТ").Cells(i + 12, 2).Value = _
    Worksheets("Названия заказов").Cells(NomSpk + 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, 5).Value = Tarif
    Worksheets("АКТ").Cells(i + 12, 3).Value = _
    Worksheets("Названия заказов").Cells(NomSpk + 2, _
    5 + (i - 1) * 2 + 1).Value
    Worksheets("АКТ").Cells(i + 12, 6).Value = _
    Worksheets("АКТ").Cells(i + 12, 4).Value * Tarif
Next
Else
    For i = 1 To ColDet
    Worksheets("Приложение").Cells(i + 3, 1).Value = i
    Worksheets("Приложение").Cells(i + 3, 2).Value = _
    Worksheets("Названия заказов").Cells(NomSpk + 2, _
    5 + (i - 1) * 2).Value
    For j = 1 To NPrais
    If CStr(Worksheets("Приложение").Cells(i + 3, 2).Value) = _
    CStr(Worksheets("Номенклатура").Cells(j + 1, 1).Value) Then
    Nazvanie = CStr(Worksheets("Номенклатура").Cells(j + 1, 2).Value)
    Tarif = CStr(Worksheets("Номенклатура").Cells(j + 1, 2).Value)
    Exit For
    End If
Next
    Worksheets("Приложение").Cells(i + 3, 3).Value = Nazvanie
    Worksheets("Приложение").Cells(i + 3, 5).Value = Tarif
    Worksheets("Приложение").Cells(i + 3, 4).Value = _
    Worksheets("Названия заказов").Cells(NomSpk + 2, _
    5 + (i - 1) * 2 + 1).Value
    Worksheets("Приложение").Cells(i + 3, 6).Value = _
    Worksheets("Приложение").Cells(i + 3, 4).Value * Tarif
Next
End If
Hide
End Sub

Рис. 3.13. Заполнение листа АКТ при большом перечне деталей

Рис. 3.13. Заполнение листа АКТ при большом перечне деталей

Рис. 3.14. Заполнение листа Приложение

Рис. 3.14. Заполнение листа Приложение

На рис. 3.13 и 3.14 приведено, соответственно, заполнение листов АКТ и Приложение при четырех позициях в заказе. В этом случае детали заказа включаются на лист Приложение.

Создание пользовательской автоформы с помощью кода VBA и ее преимущества перед встроенной автоформой Excel. Отображение встроенной автоформы.

Чтобы использовать в Excel встроенную автоформу, необходимо добавить кнопку ее вызова на панель инструментов. Как это сделать, смотрите в статье «Умная таблица» в Excel.

Встроенная автоформа работает с любой таблицей Excel, а не только с «умной». Главное, чтобы приложение могло интерпретировать диапазон как таблицу. Для этого необходимо выделить заголовки столбцов отличающимся от тела таблицы форматированием (цветом, курсивом, полужирным начертанием) и заполнить хотя бы одну строку.

Чтобы отобразить встроенную автоформу Excel, выберите ячейку внутри таблицы и нажмите кнопку вызова автоформы на панели инструментов.

Главный недостаток встроенной автоформы Excel заключается в невозможности использования раскрывающихся списков для заполнения ее полей. Для таблицы на изображении выше мы создадим с помощью кода VBA Excel пользовательскую автоформу с текстовыми полями и раскрывающимися списками.

Создание пользовательской автоформы

Рабочая таблица и списки

Наименования полей и наборы данных для раскрывающихся списков при создании пользовательской автоформы будем брать с листа «Списки».

Все изменения в наименования полей и наборы данных также вносятся на листе «Списки». На лист «Таблица» наименования граф копируются с листа «Списки» формулами, строка заголовков закреплена и добавлена кнопка «Новая запись» для вызова пользовательской автоформы.

В коде VBA, создающем автоформу, используются имена листов: Лист1 («Таблица») и Лист2 («Списки»). Благодаря этому, можно переименовывать ярлычки листов без внесения изменений в код. Кнопка «Новая запись» добавлена на рабочий лист из коллекции «Элементы ActiveX».

Создание проекта формы

Добавьте в проект VBA пользовательскую форму UserForm1 и добавьте на нее кнопки CommandButton1 и CommandButton2:

Размеры формы и кнопок не имеют значения, мы будем задавать их программно.

Код инициализации автоформы

В процессе инициализации формы мы будем добавлять элементы управления, их расположение и размеры. Наименования полей таблицы будут записаны в параметры Caption элементов Label.

Поля таблицы для заполнения в пользовательской автоформе будут представлены элементами TextBox и ComboBox. Если в таблице на листе «Списки» под наименованием графы есть данные для раскрывающегося списка, на форму добавляется ComboBox, если нет – TextBox.

Процедура размещается в модуле пользовательской формы UserForm1.

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

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

Private Sub UserForm_Initialize()

‘Включаем обработчик ошибок и объявляем переменные

On Error GoTo TxtEr

Dim myArr As Variant, n1 As Byte, n2 As Long, i1 As Byte, i2 As Long, myCont1 As Control, myCont2 As Control

‘Копируем в массив myArr данные из таблицы на листе «Списки»

myArr = Лист2.Cells(1, 1).CurrentRegion

‘Определяем количество строк

n1 = UBound(myArr, 1)

‘Определяем количество столбцов

n2 = UBound(myArr, 2)

‘Если в массиве 1 строка, нет данных для раскрывающихся списков, полезнее будет встроенная автоформа

If n1 = 1 Then

    MsgBox «У вас нет данных для раскрывающихся списков, воспользуйтесь встроенной автоформой Excel!»

    Exit Sub

End If

‘Ограничиваем пользовательскую автоформу 12 полями (количество можно увеличить)

If n2 > 12 Then

    MsgBox «Количество столбцов превышает 12!»

    Exit Sub

End If

‘Проходим циклом по условным столбцам таблицы с листа «Списки» в массиве

For i1 = 1 To n2

    ‘Добавляем элемент управления Label и задаем необходимые параметры

    Set myCont1 = Me.Controls.Add(«Forms.Label.1»)

        With myCont1

            .Caption = myArr(1, i1)

            .Width = 70

            .Height = 18

            .Left = 20

            .Top = 30 * i1

        End With

    ‘Если второй элемент в столбце не пустой, добавляем ComboBox с именем «Control№»+i1

    If myArr(2, i1) <> Empty Then

        Set myCont2 = Me.Controls.Add(«Forms.ComboBox.1», «Control№» & i1)

            ‘Заполняем ComboBox данными из списка под названием графы

            For i2 = 2 To n1

                If myArr(i2, i1) = Empty Then Exit For

                myCont2.AddItem myArr(i2, i1)

            Next

    ‘Иначе (если второй элемент в столбце пустой) добавляем TextBox с именем «Control№»+i1

    Else

        Set myCont2 = Me.Controls.Add(«Forms.TextBox.1», «Control№» & i1)

    End If

        ‘Задаем необходимые параметры элементу управления myCont2

        With myCont2

            ‘Если наименование графы — «Дата», элемент управления заполняется текущей датой и временем

            If myCont1.Caption = «Дата» Then .Text = Format(Now, «General Date»)

            .Width = 136

            .Height = 18

            .Left = 90

            .Top = 30 * i1

        End With

Next

‘Задаем параметры пользовательской автоформы

With Me

    .Height = myCont1.Top + 100

    .Width = 260

    .Caption = «Новая запись в таблицу»

End With

‘Задаем параметры кнопки «OK»

With CommandButton1

    .Top = myCont1.Top + 40

    .Left = 60

    .Width = 60

    .Height = 20

    .Caption = «OK»

End With

‘Задаем параметры кнопки «Отмена»

With CommandButton2

    .Top = myCont1.Top + 40

    .Left = 130

    .Width = 60

    .Height = 20

    .Caption = «Отмена»

End With

‘Выходим из процедуры, если не произошла ошибка

Exit Sub

TxtEr:

‘Если произошла ошибка, выводим сообщение с ее описанием

MsgBox «Произошла ошибка: « & Err.Description

End Sub

Элементам управления формы, по желанию, можно добавить наименования и размеры шрифтов.

Процедуры для кнопок

Процедуру для кнопки рабочего листа «Новая запись», отображающую пользовательскую форму на экране, размещаем в модуле листа «Таблица»:

Private Sub CommandButton1_Click()

    UserForm1.Show

End Sub

Код кнопки пользовательской формы CommandButton1 («OK»), записывающий новую строку в таблицу, размещаем в модуле формы:

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

Private Sub CommandButton1_Click()

‘Включаем обработчик ошибок и объявляем переменные

On Error GoTo TxtEr

Dim n3 As Byte, n4 As Byte, i As Byte

    ‘Определяем количество строк и столбцов в таблице на листе «Таблица»

    With Лист1.Cells(1, 1).CurrentRegion

        n3 = .Columns.Count

        n4 = .Rows.Count

    End With

    ‘Заполняем новую строку таблицы данными из пользовательской автоформы

    With Лист1

        For i = 1 To n3

            .Cells(n4 + 1, i) = Controls(«Control№» & i).Text

        Next

        ‘Добавляем границы ячейкам новой строки

        .Range(Cells(n4 + 1, 1), Cells(n4 + 1, n3)).Borders.LineStyle = True

    End With

    ‘Закрываем форму

    Unload Me

‘Выходим из процедуры, если не произошла ошибка

Exit Sub

TxtEr:

‘Если произошла ошибка, выводим сообщение с ее описанием

MsgBox «Произошла ошибка: « & Err.Description

End Sub

Процедуру для кнопки пользовательской формы CommandButton2 («Отмена»), закрывающую форму, размещаем в модуле формы:

Private Sub CommandButton2_Click()

    Unload Me

End Sub


Создание UserForm для заполнения таблицы

VIDEO56

Дата: Четверг, 04.02.2016, 07:05 |
Сообщение № 1

Группа: Проверенные

Ранг: Обитатель

Сообщений: 262


Репутация:

23

±

Замечаний:
0% ±


Excel 2010

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


Всем удачного дня!

 

Ответить

Wasilich

Дата: Четверг, 04.02.2016, 09:04 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 1232


Репутация:

326

±

Замечаний:
0% ±


2003

А какая необходимость в UserForm? В чем ее смысл? %)

 

Ответить

VIDEO56

Дата: Четверг, 04.02.2016, 09:24 |
Сообщение № 3

Группа: Проверенные

Ранг: Обитатель

Сообщений: 262


Репутация:

23

±

Замечаний:
0% ±


Excel 2010

Требование руководителя.


Всем удачного дня!

 

Ответить

VIDEO56

Дата: Четверг, 04.02.2016, 09:25 |
Сообщение № 4

Группа: Проверенные

Ранг: Обитатель

Сообщений: 262


Репутация:

23

±

Замечаний:
0% ±


Excel 2010

Wasilic, я понимаю что это лишняя приблуда в файле без которой можно легко обойтись.


Всем удачного дня!

 

Ответить

parovoznik

Дата: Четверг, 04.02.2016, 12:09 |
Сообщение № 5

Группа: Проверенные

Ранг: Обитатель

Сообщений: 426


Репутация:

26

±

Замечаний:
20% ±


Excel 2013

VIDEO56, посмотрите мой пример. Если подойдет будем дальше допиливать. :D

 

Ответить

VIDEO56

Дата: Четверг, 04.02.2016, 12:32 |
Сообщение № 6

Группа: Проверенные

Ранг: Обитатель

Сообщений: 262


Репутация:

23

±

Замечаний:
0% ±


Excel 2010

parovoznik, спасибо. То что нужно. Лучше не придумаешь. Только месяц оплаты нужен порядковый номер месяца. Думаю разберусь как исправить выпадающий список!


Всем удачного дня!

 

Ответить

parovoznik

Дата: Четверг, 04.02.2016, 13:27 |
Сообщение № 7

Группа: Проверенные

Ранг: Обитатель

Сообщений: 426


Репутация:

26

±

Замечаний:
20% ±


Excel 2013

VIDEO56, исправил месяца

 

Ответить

VIDEO56

Дата: Четверг, 04.02.2016, 13:44 |
Сообщение № 8

Группа: Проверенные

Ранг: Обитатель

Сообщений: 262


Репутация:

23

±

Замечаний:
0% ±


Excel 2010

parovoznik, Спасибо. Сам допетрил. А как в форму загнать окно справочных цифр. Числа будут подтягиваться скажем с ячейки AA1???


Всем удачного дня!

 

Ответить

parovoznik

Дата: Четверг, 04.02.2016, 13:54 |
Сообщение № 9

Группа: Проверенные

Ранг: Обитатель

Сообщений: 426


Репутация:

26

±

Замечаний:
20% ±


Excel 2013

VIDEO56, цифры должны отражаться в комбе?
А зачем с ячейки AA1.
У Вас есть лист «база» . За колонкой менеджер ,прописывайте цифры

 

Ответить

VIDEO56

Дата: Четверг, 04.02.2016, 14:10 |
Сообщение № 10

Группа: Проверенные

Ранг: Обитатель

Сообщений: 262


Репутация:

23

±

Замечаний:
0% ±


Excel 2010

Да в комбе. Как сумма для ориентира. Изменению она не подлежит.


Всем удачного дня!

 

Ответить

VIDEO56

Дата: Вторник, 01.03.2016, 16:37 |
Сообщение № 11

Группа: Проверенные

Ранг: Обитатель

Сообщений: 262


Репутация:

23

±

Замечаний:
0% ±


Excel 2010

Прошу помочь с кодом.
Как прописать чтобы данные из Me.TextBox6 и Me.TextBox5 дублировались в ячейку А1 и В2 соответственно. И новые данные вносились только в эти ячейки?
[vba]

Код

Private Sub CommandButton1_Click() ‘перенос данных с формы на лист
Application.ScreenUpdating = False ‘отключили обновление экрана

‘ проверка правильности введенных данных

If Me.TextBox3.Value = «» Then: MsgBox «Не указана дата.», 48, «Сообщение»: Exit Sub

      With Sheets(«Учет») ‘Применительно к листу Учет
        lastrow = .Cells(Rows.Count, 1).End(xlUp).Row
        Cells(lastrow + 1, 1) = CDate(Me.TextBox3)
        Cells(lastrow + 1, 3) = CDbl(Me.TextBox2)
          Cells(lastrow + 1, 8) = Me.ComboBox3
          Cells(lastrow + 1, 10) = Me.ComboBox1
          Cells(lastrow + 1, 9) = Me.ComboBox2
          Cells(lastrow + 1, 4) = Me.TextBox4
          Cells(lastrow + 1, 5) = Me.TextBox5
          Cells(lastrow + 1, 2) = Me.TextBox1
          Cells(lastrow + 1, 6) = Me.TextBox6
        Cells(lastrow + 1, 7) = CDate(Me.TextBox7)

           End With

[/vba]


Всем удачного дня!

 

Ответить

_Boroda_

Дата: Вторник, 01.03.2016, 16:40 |
Сообщение № 12

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Не понял. Также, как и остальное написано
[vba]

Код

Cells(1, 1) = Me.TextBox6

[/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

VIDEO56

Дата: Среда, 02.03.2016, 08:50 |
Сообщение № 13

Группа: Проверенные

Ранг: Обитатель

Сообщений: 262


Репутация:

23

±

Замечаний:
0% ±


Excel 2010

Александр,спасибо.


Всем удачного дня!

 

Ответить

Visual Basic is an excellent language for automating repetitive tasks in Excel. Imagine taking your automation up a notch by creating highly functional user forms that also look tidy to the end-users.

User forms in VBA present you with a blank canvas; you can design and organize the forms to fit your needs at any given time.

In this guide, you will learn to create a student-based data entry form that captures relevant information in linked Excel sheets.

Creating a User Form With Excel VBA

Open a new Excel workbook and perform a few preliminary steps before you start creating your data-entry form.

Save your workbook with the desired name; don’t forget to change the file’s type to an Excel Macro-Enabled Workbook.

Add two sheets to this workbook, with the following names:

  1. Sheet1: Home
  2. Sheet2: Student Database

Excel sheet

Feel free to change these names as per your requirements.

In the Home sheet, add a button to control the user form macro. Go to the Developer tab and click on the Button option from the Insert drop-down list. Place the button anywhere on the sheet.

Excel workbook

Once you’ve placed the button, rename it. Right-click on it, and click on New to assign a new macro to show the form.

Enter the following code in the editor window:

  Sub Button1_Click()UserForm.ShowEnd Sub 

Once the Home and Student Database sheets are ready, it’s time to design the user form. Navigate to the Developer tab, and click on Visual Basic to open the Editor. Alternatively, you can press ALT+F11 to open the editor window.

Click on the Insert tab and select UserForm.

A blank user form is ready for use; an accompanying toolbox opens along with the form, which has all the essential tools to design the layout.

Excel VBA editor

From the toolbox, select the Frame option. Drag this to the user form and resize it.

In the (name) option, you can change the name of the frame. To showcase the name on the front-end, you can change the name in the Caption column.

Next, select the Label option from the toolbox and insert two labels within this frame. Rename the first one as Application Number and the second as Student ID.

Userform in Excel VBA

The same renaming logic applies; change the names via the Caption option within the Properties window. Make sure you select the respective label before changing its name.

Next, insert two text boxes next to the label boxes. These will be used to capture the user’s inputs. Change the names of two text boxes via the (Name) column within the Properties window. The names are as follows:

  • Textbox1: txtApplicationNo
  • Textbox2: txtStudentID

Designing the Student Details Frame

Insert a vertical frame and add 10 labels and 10 text boxes. Rename each of them in the following manner:

  • Label3: Name
  • Label4: Age
  • Label5: Address
  • Label6: Phone
  • Label7: City
  • Label8: Country
  • Label9: Date of Birth
  • Label10: Zip Code
  • Label11: Nationality
  • Label12: Gender

Insert corresponding text boxes next to these labels; insert two (or more) optionbutton boxes from the user form toolbox next to the gender label. Rename them Male and Female (along with Custom), respectively.

Designing the Course Details Frame

Add another vertical frame and insert six labels and six text boxes corresponding to each label. Rename the labels as follows:

  • Label13: Course Name
  • Label14: Course ID
  • Label15: Enrollment Start Date
  • Label16: Enrollment End Date
  • Label17: Course duration
  • Label18: Department

Designing the Payment Details Frame

Insert a new frame; add a new label and rename it «Do you wish to update the Payment details?» Insert two optionbuttons; rename them Yes and No.

Similarly, add a new frame containing two additional labels and two combo boxes. Rename the labels as follows:

  • Label19: Payment Received
  • Label20: Mode of Payment

Designing the Navigation Pane

In the final frame, add three buttons from the toolbox, which will contain code for the execution of the forms.

Rename the buttons in the following manner:

  • Button1: Save Details
  • Button2: Clear Form
  • Button3: Exit

Userform in Excel VBA

Writing the Automated Form Code: Save Details Button

Double-click on the Save Details button. In the ensuing module, insert the following code:

  Private Sub CommandButton2_Click()&lsquo;declare the variables used throughout the codesDim sht As Worksheet, sht1 As Worksheet, lastrow As Long'Add validations to check if character values are being entered in numeric fields.If VBA.IsNumeric(txtApplicationNo.Value) = False ThenMsgBox "Only numeric values are accepted in the Application Number", vbCriticalExit SubEnd IfIf VBA.IsNumeric(txtStudentID.Value) = False ThenMsgBox "Only numeric values are accepted in the Student ID", vbCriticalExit SubEnd IfIf VBA.IsNumeric(txtAge.Value) = False ThenMsgBox "Only numeric values are accepted in Age", vbCriticalExit SubEnd IfIf VBA.IsNumeric(txtPhone.Value) = False ThenMsgBox "Only numeric values are accepted in Phone Number", vbCriticalExit SubEnd IfIf VBA.IsNumeric(Me.txtCourseID.Value) = False ThenMsgBox "Only numeric values are accepted in Course ID", vbCriticalExit SubEnd If'link the text box fields with the underlying sheets to create a rolling databaseSet sht = ThisWorkbook.Sheets("Student Database")'calculate last populated row in both sheetslastrow = sht.Range("a" & Rows.Count).End(xlUp).Row + 1'paste the values of each textbox into their respective sheet cellsWith sht.Range("a" & lastrow).Value = txtApplicationNo.Value.Range("b" & lastrow).Value = txtStudentID.Value.Range("c" & lastrow).Value = txtName.Value.Range("d" & lastrow).Value = txtAge.Value.Range("e" & lastrow).Value = txtDOB.Value.Range("g" & lastrow).Value = txtAddress.Value.Range("h" & lastrow).Value = txtPhone.Value.Range("i" & lastrow).Value = txtCity.Value.Range("j" & lastrow).Value = txtCountry.Value.Range("k" & lastrow).Value = txtZip.Value.Range("l" & lastrow).Value = txtNationality.Value.Range("m" & lastrow).Value = txtCourse.Value.Range("n" & lastrow).Value = txtCourseID.Value.Range("o" & lastrow).Value = txtenrollmentstart.Value.Range("p" & lastrow).Value = txtenrollmentend.Value.Range("q" & lastrow).Value = txtcourseduration.Value.Range("r" & lastrow).Value = txtDept.ValueEnd Withsht.Activate'determine gender as per user's inputIf optMale.Value = True Then sht.Range("g" & lastrow).Value = "Male"If optFemale.Value = True Then sht.Range("g" & lastrow).Value = "Female"'Display a message box, in case the user selects the Yes radio buttonIf optYes.Value = True ThenMsgBox "Please select the payment details below"Else:Exit SubEnd IfEnd Sub 

If you’re not sure what parts or any of the code means, don’t worry. We’ll explain it thoroughly in the next section.

Automated Form Code Explained

The textboxes will contain a mix of text and numeric values, so it’s essential to restrict the user’s input. The Application Number, Student ID, Age, Phone, Course ID, and Course Duration should contain only numbers, while the rest will contain text.

Using an IF statement, the code triggers error pop-ups if the user enters a character or text value in any of the numeric fields.

Since the error validations are in place, you need to link the text boxes with the sheet cells.

The lastrow variables will calculate the last populated row, and store the values in them for dynamic use.

Finally, the values are pasted from the text boxes into the linked Excel sheet.

Clear Form and Exit Button Codes

In the clear button, you need to write the code to clear the existing values from the user form. This can be done in the following manner:

  With Me.txtApplicationNo.Value = "".txtStudentID.Value = ""..txtName.Value = "".txtAge.Value = "".txtAddress.Value = "".txtPhone.Value = "".txtCity.Value = "".txtCountry.Value = "".txtDOB.Value = "".txtZip.Value = "".txtNationality.Value = "".txtCourse.Value = "".txtCourseID.Value = "".txtenrollmentstart.Value = "".txtenrollmentend.Value = "".txtcourseduration.Value = "".txtDept.Value = "".cmbPaymentMode.Value = "".cmbPayment.Value = "".optFemale.Value = False.optMale.Value = False.optYes.Value = False.optNo.Value = FalseEnd With 

In the exit button, enter the following code to close the user form.

  Private Sub CommandButton5_Click()Unload MeEnd Sub 

As a last step, you need to input a few final pieces of code to create the drop-down values for the combo boxes (within the payment frames).

  Private Sub UserForm_Activate()With cmbPayment.Clear.AddItem "".AddItem "Yes".AddItem "No"End WithWith cmbPaymentMode.Clear.AddItem "".AddItem "Cash".AddItem "Card".AddItem "Check"End WithEnd Sub 

VBA Automation Makes Work Easier

VBA is a multi-faceted language that serves many purposes. User forms are only one aspect within VBA—there are many other uses like consolidating workbooks and worksheets, merging multiple Excel sheets, and other handy automation uses.

No matter the automation goal, VBA is up to the task. If you keep learning and getting practice in, there’s no aspect of your workflow you can’t improve.

При упоминании баз данных (БД) первым делом, конечно, в голову приходят всякие умные слова типа SQL, Oracle, 1С или хотя бы Access. Безусловно, это очень мощные (и недешевые в большинстве своем) программы, способные автоматизировать работу большой и сложной компании с кучей данных. Беда в том, что иногда такая мощь просто не нужна. Ваш бизнес может быть небольшим и с относительно несложными бизнес-процессами, но автоматизировать его тоже хочется. Причем именно для маленьких компаний это, зачастую, вопрос выживания.

Для начала давайте сформулируем ТЗ. В большинстве случаев база данных для учета, например, классических продаж  должна уметь:

  • хранить в таблицах информацию по товарам (прайс), совершенным сделкам и клиентам и связывать эти таблицы между собой
  • иметь удобные формы ввода данных (с выпадающими списками и т.п.)
  • автоматически заполнять этими данными какие-то печатные бланки (платежки, счета и т.д.)
  • выдавать необходимые вам отчеты для контроля всего бизнес-процесса с точки зрения руководителя

Со всем этим вполне может справиться Microsoft Excel, если приложить немного усилий. Давайте попробуем это реализовать.

Шаг 1. Исходные данные в виде таблиц

Информацию о товарах, продажах и клиентах будем хранить в трех таблицах (на одном листе или на разных — все равно). Принципиально важно, превратить их в «умные таблицы» с автоподстройкой размеров, чтобы не думать об этом в будущем. Это делается с помощью команды Форматировать как таблицу на вкладке Главная (Home — Format as Table). На появившейся затем вкладке Конструктор (Design) присвоим таблицам наглядные имена в поле Имя таблицы для последующего использования:

Присвоение имени "умной таблице"

Итого у нас должны получиться три «умных таблицы»:

Умные таблицы для хранения данных

Обратите внимание, что таблицы могут содержать дополнительные уточняющие данные. Так, например, наш Прайс содержит дополнительно информацию о категории (товарной группе, упаковке, весу и т.п.) каждого товара, а таблица Клиенты — город и регион (адрес, ИНН, банковские реквизиты и т.п.) каждого из них.

Таблица Продажи будет использоваться нами впоследствии для занесения в нее совершенных сделок.

Шаг 2. Создаем форму для ввода данных

Само-собой, можно вводить данные о продажах непосредственно в зеленую таблицу Продажи, но это не всегда удобно и влечет за собой появление ошибок и опечаток из-за «человеческого фактора». Поэтому лучше будет на отдельном листе сделать специальную форму для ввода данных примерно такого вида:

Форма ввода

В ячейке B3 для получения обновляемой текущей даты-времени используем функцию ТДАТА (NOW). Если время не нужно, то вместо ТДАТА можно применить функцию СЕГОДНЯ (TODAY).

В ячейке B11 найдем цену выбранного товара в третьем столбце умной таблицы Прайс с помощью функции ВПР (VLOOKUP). Если раньше с ней не сталкивались, то сначала почитайте и посмотрите видео тут.

В ячейке B7 нам нужен выпадающий список с товарами из прайс-листа. Для этого можно использовать команду Данные — Проверка данных (Data — Validation), указать в качестве ограничения Список (List) и ввести затем в поле Источник (Source) ссылку на столбец Наименование из нашей умной таблицы Прайс:

Выпадающий список

Аналогичным образом создается выпадающий список с клиентами, но источник будет уже:

=ДВССЫЛ(«Клиенты[Клиент]»)

Функция ДВССЫЛ (INDIRECT) нужна, в данном случае, потому что Excel, к сожалению, не понимает прямых ссылок на умные таблицы в поле Источник. Но та же ссылка «завернутая» в функцию ДВССЫЛ работает при этом «на ура» (подробнее об этом было в статье про создание выпадающих списков с наполнением).

Шаг 3. Добавляем макрос ввода продаж

После заполнения формы нужно введенные в нее данные добавить в конец таблицы Продажи. Сформируем при помощи простых ссылок строку для добавления прямо под формой:

Форма ввода данных со строкой для загрузки

Т.е. в ячейке A20 будет ссылка =B3, в ячейке B20 ссылка на =B7 и т.д.

Теперь добавим элементарный макрос в 2 строчки, который копирует созданную строку и добавляет ее к таблице Продажи. Для этого жмем сочетание Alt+F11 или кнопку Visual Basic на вкладке Разработчик (Developer). Если эту вкладку не видно, то включите ее сначала в настройках Файл — Параметры — Настройка ленты (File — Options — Customize Ribbon). В открывшемся окне редактора Visual Basic вставляем новый пустой модуль через меню Insert — Module и вводим туда код нашего макроса:

Sub Add_Sell()
    Worksheets("Форма ввода").Range("A20:E20").Copy                         'копируем строчку с данными из формы
    n = Worksheets("Продажи").Range("A100000").End(xlUp).Row                'определяем номер последней строки в табл. Продажи
    Worksheets("Продажи").Cells(n + 1, 1).PasteSpecial Paste:=xlPasteValues 'вставляем в следующую пустую строку
    Worksheets("Форма ввода").Range("B5,B7,B9").ClearContents               'очищаем форму
End Sub

Теперь можно добавить к нашей форме кнопку для запуска созданного макроса, используя выпадающий список Вставить на вкладке Разработчик (Developer — Insert — Button):

Добавление кнопки для запуска макроса

После того, как вы ее нарисуете, удерживая нажатой левую кнопку мыши, Excel сам спросит вас — какой именно макрос нужно на нее назначить — выбираем наш макрос Add_Sell. Текст на кнопке можно поменять, щелкнув по ней правой кнопкой мыши и выбрав команду Изменить текст.

Теперь после заполнения формы можно просто жать на нашу кнопку, и введенные данные будут автоматически добавляться к таблице Продажи, а затем форма очищается для ввода новой сделки.

Шаг 4. Связываем таблицы

Перед построением отчета свяжем наши таблицы между собой, чтобы потом можно было оперативно вычислять продажи по регионам, клиентам или категориям. В старых версиях Excel для этого потребовалось бы использовать несколько функций ВПР (VLOOKUP) для подстановки цен, категорий, клиентов, городов и т.д. в таблицу Продажи. Это требует времени и сил от нас, а также «кушает» немало ресурсов Excel. Начиная с Excel 2013 все можно реализовать существенно проще, просто настроив связи между таблицами.

Для этого на вкладке Данные (Data) нажмите кнопку Отношения (Relations). В появившемся окне нажмите кнопку Создать (New) и выберите из выпадающих списков таблицы и названия столбцов, по которым они должны быть связаны:

Настройка связей между таблицами

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

Само-собой, аналогичным образом связываются и таблица Продажи с таблицей Клиенты по общему столбцу Клиент:

Связывание таблиц

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

Шаг 5. Строим отчеты с помощью сводной

Теперь для анализа продаж и отслеживания динамики процесса, сформируем для примера какой-нибудь отчет с помощью сводной таблицы. Установите активную ячейку в таблицу Продажи и выберите на ленте вкладку Вставка — Сводная таблица (Insert — Pivot Table). В открывшемся окне Excel спросит нас про источник данных (т.е. таблицу Продажи) и место для выгрузки отчета (лучше на новый лист):

Создание сводной таблицы

Жизненно важный момент состоит в том, что нужно обязательно включить флажок Добавить эти данные в модель данных (Add data to Data Model) в нижней части окна, чтобы Excel понял, что мы хотим строить отчет не только по текущей таблице, но и задействовать все связи.

После нажатия на ОК в правой половине окна появится панель Поля сводной таблицы, где нужно щелкнуть по ссылке Все, чтобы увидеть не только текущую, а сразу все «умные таблицы», которые есть в книге.А затем можно, как и в классической сводной таблице, просто перетащить мышью нужные нам поля из любых связанных таблиц в области Фильтра, Строк, Столбцов или Значений — и Excel моментально построит любой нужный нам отчет на листе:

Отчет сводной таблицы

Не забудьте, что сводную таблицу нужно периодически (при изменении исходных данных) обновлять, щелкнув по ней правой кнопкой мыши и выбрав команду Обновить (Refresh), т.к. автоматически она этого делать не умеет.

Также, выделив любую ячейку в сводной и нажав кнопку Сводная диаграмма (Pivot Chart) на вкладке Анализ (Analysis) или Параметры (Options) можно быстро визуализировать посчитанные в ней результаты.

Шаг 6. Заполняем печатные формы

Еще одной типовой задачей любой БД является автоматическое заполнение различных печатных бланков и форм (накладные, счета, акты и т.п.). Про один из способов это сделать, я уже как-то писал. Здесь же реализуем, для примера, заполнение формы по номеру счета:

Печатная форма счета

Предполагается, что в ячейку C2 пользователь будет вводить число (номер строки в таблице Продажи, по сути), а затем нужные нам данные подтягиваются с помощью уже знакомой функции ВПР (VLOOKUP) и функции ИНДЕКС (INDEX).

Ссылки по теме

  • Как использовать функцию ВПР (VLOOKUP) для поиска и подстановки значений
  • Как заменить ВПР функциями ИНДЕКС и ПОИСКПОЗ
  • Автоматическое заполнение форм и бланков данными из таблицы
  • Создание отчетов с помощью сводных таблиц

Понравилась статья? Поделить с друзьями:
  • Заполнение таблицы excel макросом
  • Заполнение таблиц с помощью excel
  • Заполненное штатное расписание образец скачать в word
  • Заполненная торг 12 в excel
  • Заполненная таблица excel для примера