Создание отчетов в vba excel

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

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

Создание документа или отчета из шаблона

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

Шаблон создаем вручную на отдельном рабочем листе или с помощью кода VBA при заполнении документа. Способы создания шаблона определяют место его хранения:

  • В коде VBA. Такой способ возможен для несложных печатных форм.
  • В рабочей книге Excel с реестром или базой данных на скрытом листе.
  • В отдельном файле, который не обязательно сохранять как шаблон Excel (*.xlt*).

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

Из редких исключений можно назвать печать ценников на основании товарной накладной, сохраненной в Excel. Шаблон ценника и программный код VBA приходится хранить в отдельном файле, по команде из которого открывается и обрабатывается товарная накладная.

Назовем лист с шаблоном документа или отчета — «Shablon». Для создания новой печатной формы скрытый лист с шаблоном необходимо скопировать:

With Worksheets(«Shablon»)

  .Visible = True

  .Copy After:=Worksheets(Worksheets.Count)

  .Visible = False

End With

Данный код вставит новый лист с шаблоном в ту же книгу после всех имеющихся листов. Чтобы шаблон скопировать в новую книгу, заменяем строку .Copy After:=Worksheets(Worksheets.Count) на .Copy. Печатная форма откроется в новом файле.

Сразу после создания, обращаться к новому листу можно как к активному (ActiveSheet), даже в том случае, если он скопирован в новую книгу. Чтобы воспользоваться этой возможностью, порядок действий в программе должен быть следующим:

  1. Копирование информации в переменную массива из реестра или базы данных.
  2. Создание нового документа или отчета из шаблона.
  3. Заполнение документа или отчета, обращаясь к нему как к ActiveSheet.

Копирование информации и заполнение формы

Копирование информации

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

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

Допустим, что лист называется «Reestr», а необходимая информация расположена в десяти первых ячейках каждой строки:

Dim nomer As Long, massiv() As Variant

nomer = ActiveCell.Row

massiv = Range(Cells(nomer, 1), Cells(nomer, 10))

Если для отчета требуется информация из нескольких строк, можно выделить их вертикально по любому столбцу и использовать следующий код:

Dim nomer1 As Long, nomer2 As Long, massiv() As Variant

nomer1 = Selection.Cells(1).Row

nomer2 = Selection.Cells(Selection.Cells.Count).Row

massiv = Range(Cells(nomer1, 1), Cells(nomer2, 10))

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

Если требуется обработка данных для отчета, проводим ее в массиве. Для результатов обработки можно объявить еще одну переменную массива.

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

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

Заполняем ячейки печатной формы информацией из массива, обращаясь к листу с формой как к ActiveSheet. Если новый документ или отчет создан в той же книге, ее можно автоматически сохранить:

Чтобы не наблюдать за мерцаниями экрана во время выполнения процедуры VBA Excel, можно временно отключить его обновления:

Sub GeneratsiyaDokumenta()

Application.ScreenUpdating = False

операторы

Application.ScreenUpdating = True

End Sub

Удаление печатной формы

Если лист документа или отчета временно сохраняется в книгу с реестром или базой данных, можно предусмотреть его простое удаление без выведения дополнительного диалогового окна.

Для этого необходимо на лист шаблона правее печатной формы вставить кнопку из коллекции «Элементы управления ActiveX». Дважды кликнуть по ней и в открывшемся модуле листа внутрь автоматически сгенерированного объявления процедуры вставить строку Call UdaleniyeLista:

Sub CommandButton1_Click()

  Call UdaleniyeLista

End Sub

Затем в модуль текущей книги добавляем процедуру:

Sub UdaleniyeLista()

  Application.DisplayAlerts = False

    ActiveSheet.Delete

  Application.DisplayAlerts = True

End Sub

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

В общем необходимо создать что то типа отчета в Excel с помощью VBA.
Имеется книга Excel. В ней 50 страниц. На каждой страничке располагаетя таблица. Структура таблиц на каждой странице идентична. На каждом листе есть столбец «H» в который заносятся числовые данные. Алгоритм следующий. Рассмотрим таблицу в листе «1». Необходима сделать проверку столбца «H» (допустим проверка столбца «H» с 10-20 строку ). Если например в столбце «H» в строке «14»(клетка H14) найдены числовые данные то эти бы данные копировались на лист «отчет» в клетку A1(причем пустые клетки должны пропускатся). А так же чтобы из листа «1» из строки 14 копировлась клетки A14 и B14 в лист «отчет» соответственно в клетки B1 и C1. Далее например найдены числовые данные (Лист 1) в клетке H17 соответственно данные должны копироватся в Лист «отчет» H17>> A2, A17>> B2, B17>>C2. и т.д. И все это нужно проделать со всеми 50 листами.

Задача не самая трудная. Дело в том что я сам не очень знаком с синтаксисом и функциями VBA поэтому у меня это вызывает затруднения.
Хотя бы объясните на примере 1 листа все остальное сам сделаю.

И еще вопрос можно ли сделать цикл сразу для всей книги. Или надо будет описывать каждую страницу отдельно?

Заранее всем спасибо за ответы.

13 ответов

405

04 февраля 2005 года

Dmitrii

554 / / 16.12.2004

Цитата:

Originally posted by Maks555
В общем необходимо создать что то типа отчета в Excel с помощью VBA.
Имеется книга Excel. В ней 50 страниц. На каждой страничке располагаетя таблица. Структура таблиц на каждой странице идентична. На каждом листе есть столбец «H» в который заносятся числовые данные. Алгоритм следующий. Рассмотрим таблицу в листе «1». Необходима сделать проверку столбца «H» (допустим проверка столбца «H» с 10-20 строку ). Если например в столбце «H» в строке «14»(клетка H14) найдены числовые данные то эти бы данные копировались на лист «отчет» в клетку A1(причем пустые клетки должны пропускатся). А так же чтобы из листа «1» из строки 14 копировлась клетки A14 и B14 в лист «отчет» соответственно в клетки B1 и C1. Далее например найдены числовые данные (Лист 1) в клетке H17 соответственно данные должны копироватся в Лист «отчет» H17>> A2, A17>> B2, B17>>C2. и т.д. И все это нужно проделать со всеми 50 листами.

Задача не самая трудная. Дело в том что я сам не очень знаком с синтаксисом и функциями VBA поэтому у меня это вызывает затруднения.
Хотя бы объясните на примере 1 листа все остальное сам сделаю.

И еще вопрос можно ли сделать цикл сразу для всей книги. Или надо будет описывать каждую страницу отдельно?

Заранее всем спасибо за ответы.

Например, так:

Sub Report()
Dim curSheet As Worksheet
Dim curRow, targetRow As Integer
targetRow = 1
‘Цикл по всем листам книги
For Each curSheet In Workbooks(«Книга1»).Worksheets
If curSheet.Name <> «Отчет» Then
curSheet.Activate
For curRow = 1 To 10
If IsNumeric(Cells(curRow, 8 ).Value) And Cells(curRow, 8 ).Value <> Empty Then
Worksheets(«Отчет»).Cells(targetRow, 1 ).Value = Cells(curRow, 8 ).Value
Worksheets(«Отчет»).Cells(targetRow, 2 ).Value = Cells(curRow, 1 ).Value
Worksheets(«Отчет»).Cells(targetRow, 3 ).Value = Cells(curRow, 2 ).Value
targetRow = targetRow + 1
End If
Next curRow
End If
Next curSheet
Worksheets(«Отчет»).Activate
End Sub

5.9K

04 февраля 2005 года

Maks555

24 / / 04.02.2005

Цитата:

Originally posted by Dmitrii

Например, так:

Sub Report()
Dim curSheet As Worksheet
Dim curRow, targetRow As Integer
targetRow = 1
For Each curSheet In Workbooks(«Книга1»).Worksheets
If curSheet.Name <> «Отчет» Then
curSheet.Activate
For curRow = 1 To 10
If IsNumeric(Cells(curRow, 8 ).Value) And Cells(curRow, 8 ).Value <> Empty Then
Worksheets(«Отчет»).Cells(targetRow, 1 ).Value = Cells(curRow, 8 ).Value
Worksheets(«Отчет»).Cells(targetRow, 2 ).Value = Cells(curRow, 1 ).Value
Worksheets(«Отчет»).Cells(targetRow, 3 ).Value = Cells(curRow, 2 ).Value
targetRow = targetRow + 1
End If
Next curRow
End If
Next curSheet
Worksheets(«Отчет»).Activate
End Sub

большое спасибо! сейчас буду пытаться что-нибудь сделать!

5.9K

07 февраля 2005 года

Maks555

24 / / 04.02.2005

выдает ошибку несоответствия типов в строке
for each cursheet in workbooks(«книга1»).worksheets

что не так?

и еще вопрос как организовать цикл например чтобы проверка была только с 1 по 10 лист.

275

07 февраля 2005 года

pashulka

985 / / 19.09.2004

— Может быть Ваша рабочая книга имеет имя отличное от «Книга1»
— В некоторых случаях необходимо указывать «Книга1.xls»

—————

For wsIndex = 1 To 10
wsName = Worksheets(wsIndex).Name
Next

For Each iList In Worksheets
If iList.Index > 10 Then Exit For
Next

5.9K

07 февраля 2005 года

Maks555

24 / / 04.02.2005

большое спасибо все работает! теперь буду делат различные прибамбасы

5.9K

10 февраля 2005 года

Maks555

24 / / 04.02.2005

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

1.2K

10 февраля 2005 года

Штурман

147 / / 01.08.2003

по первому вопросу
Формат -> Условное форматирование
И работает без всяких кодов

5.9K

10 февраля 2005 года

Maks555

24 / / 04.02.2005

Цитата:

Originally posted by Штурман
по первому вопросу
Формат -> Условное форматирование
И работает без всяких кодов

А по подробнее можно? а то я не очень знаком с синтаксисом и функциями.

1.2K

10 февраля 2005 года

Штурман

147 / / 01.08.2003

Цитата:

Originally posted by Maks555

А по подробнее можно? а то я не очень знаком с синтаксисом и функциями.

Да что там объяснять то?
Блин,мужик, ты обленился в дупель.

Хорошо,ликбез:
1)Выделяем форматируемый столбец(к примеру,если это столбец А,то и щелкаем на букву А,вверху столбца)
2)Открываем меню Форматирование
3)В открывшемся меню выбираем Условное форматирование
4)В первом окошке оставляем слово Значение
5)Во втором окошке выбираем слово больше
6)В третьем окошке ставим цифру 100
7)Нажимаем кнопку Формат
8 )выбираем вкладку Вид
9)выбираем нужный цвет
10)Нажимает две кнопки ОК
11)В отфарматированом столбце в любой ячейке вводим для тестирования цифру 101

Теперь доступно?:x

5.9K

10 февраля 2005 года

Maks555

24 / / 04.02.2005

Цитата:

Originally posted by Штурман

Да что там объяснять то?
Блин,мужик, ты обленился в дупель.

Хорошо,ликбез:
1)Выделяем форматируемый столбец(к примеру,если это столбец А,то и щелкаем на букву А,вверху столбца)
2)Открываем меню Форматирование
3)В открывшемся меню выбираем Условное форматирование
4)В первом окошке оставляем слово Значение
5)Во втором окошке выбираем слово больше
6)В третьем окошке ставим цифру 100
7)Нажимаем кнопку Формат
8 )выбираем вкладку Вид
9)выбираем нужный цвет
10)Нажимает две кнопки ОК
11)В отфарматированом столбце в любой ячейке вводим для тестирования цифру 101

Теперь доступно?:x

хе:)спасибо конечно! только я хотел узнать как это можно реализовать на VB.

кстати условное форматирование у меня оказалось почему то недоступным

405

10 февраля 2005 года

Dmitrii

554 / / 16.12.2004

Цитата:

Originally posted by Maks555

хе:)спасибо конечно! только я хотел узнать как это можно реализовать на VB.

кстати условное форматирование у меня оказалось почему то недоступным

Вот примеры:

‘Изменение цвета в ячейке на красный
If Range(«a1»).Value > 100 Then
Range(«a1»).Interior.ColorIndex = 3
End If

‘Очистка диапазона ячеек
Range(«a1:c10»).Clear ‘так
Range(Cells(1, 1), Cells(3, 10)).Clear ‘или так

Вообще вариантов очистки несколько: всё (в примере выше), содержимое, оформление и т.д. Для выбора нужного смотрите описание соответствующих методов объекта Range.

Кстати, действительно, желательно сначала пытаться разобраться самостоятельно. Самый простой способ — запись макроса с помощью макрорекодера и последующий анализ полученного кода.

5.9K

10 февраля 2005 года

Maks555

24 / / 04.02.2005

Цитата:

Originally posted by Dmitrii

Вот примеры:

‘Изменение цвета в ячейке на красный
If Range(«a1»).Value > 100 Then
Range(«a1»).Interior.ColorIndex = 3
End If

‘Очистка диапазона ячеек
Range(«a1:c10»).Clear ‘так
Range(Cells(1, 1), Cells(3, 10)).Clear ‘или так

Вообще вариантов очистки несколько: всё (в примере выше), содержимое, оформление и т.д. Для выбора нужного смотрите описание соответствующих методов объекта Range.

Кстати, действительно, желательно сначала пытаться разобраться самостоятельно. Самый простой способ — запись макроса с помощью макрорекодера и последующий анализ полученного кода.

Большое спасибо за ответ. Буду старатся разобратся самостоятельно.

20K

02 февраля 2007 года

Mimino

18 / / 02.02.2007

Да что там объяснять то?
Блин,мужик, ты обленился в дупель.

Хорошо,ликбез:
1)Выделяем форматируемый столбец(к примеру,если это столбец А,то и щелкаем на букву А,вверху столбца)
2)Открываем меню Форматирование
3)В открывшемся меню выбираем Условное форматирование
4)В первом окошке оставляем слово Значение
5)Во втором окошке выбираем слово больше
6)В третьем окошке ставим цифру 100
7)Нажимаем кнопку Формат
8 )выбираем вкладку Вид
9)выбираем нужный цвет
10)Нажимает две кнопки ОК
11)В отфарматированом столбце в любой ячейке вводим для тестирования цифру 101

Теперь доступно?:x

Всё гениальное — просто. Столько книг по Excel перелопатил, а для таких случаев всегда макросы писал. Оч.полезный совет, спасибо и от меня.

140 / 123 / 50

Регистрация: 10.11.2011

Сообщений: 620

1

Сформировать отчет за выбранный период

28.12.2012, 10:22. Показов 4739. Ответов 14


Студворк — интернет-сервис помощи студентам

Добрый день . Разработал програмку автоматизации отчетов
По нажатию на кнопку «Новая запись» открывается форма
заполняем исходные данные и по нажатию на кнопку ОК результаты заносятся на лист «Итого отчетов»

По нажатию на кнопку «Отчет за период» например : выбираем даты с 14.12 по 27.12 выбираем получателя
«Изумруд» добавляем в правый листбокс и по нажатию на кнопку » Сформировать отчет»
в КОНЕЧНОМ РЕЗУЛЬТАТЕ, ХОТЕЛОСЬ бы получить на листе «Отчет» таблицу автоматически
Это я сделал в ручную ,а как прописать код незнаю . Может кто-то поможет под корректировать.
Спасибо.
Юра.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

28.12.2012, 10:22

14

Скрипт

5468 / 1148 / 50

Регистрация: 15.09.2012

Сообщений: 3,514

28.12.2012, 10:48

2

По такому принципу можно сделать:

Кликните здесь для просмотра всего текста

Visual Basic
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
Sub Procedure_1()
    
    Dim shSheet_1 As Excel.Worksheet
    Dim shSheet_2 As Excel.Worksheet
    Dim sCompany As String
    Dim lLastRow As Long
    Dim i As Long
    
    'Указываем, по какой организации делать отчёт.
    sCompany = "ЧП Изумруд"
    
    'Даём листам имена "shSheet_1" и "shSheet_2".
    'Через эти имена будем обращаться
    'к листам, чтобы удобнее писать код.
    Set shSheet_1 = Worksheets(1)
    Set shSheet_2 = Worksheets(2)
    
    'Задаём, с какой строки на втором листе начинаются данные.
    lLastRow = 5
    
    'Двигаемся по первому листу и смотрим, что в столбце "E".
    For i = 6 To 9 Step 1
        'Если в ячейке искомая организация.
        If shSheet_1.Cells(i, "E").Value = sCompany Then
            
            'Переносим данные с одного листа на другой.
            shSheet_2.Cells(lLastRow, "B").Value = _
                shSheet_1.Cells(i, "D").Value
            shSheet_2.Cells(lLastRow, "C").Value = sCompany
            shSheet_2.Cells(lLastRow, "D").Value = _
                shSheet_1.Cells(i, "F").Value
            
            'Чтобы вставить данные в следующую строку.
            lLastRow = lLastRow + 1
            
        End If
    Next i
 
End Sub

Примечания

  1. Код будет быстрее работать, если вместо просмотра каждой ячейки использовать команду Find.
  2. Также для ускорения работы кода можно отключить на время работы кода обновление монитора, можно отключить обработку событий и пересчёт формул.



0



140 / 123 / 50

Регистрация: 10.11.2011

Сообщений: 620

28.12.2012, 11:09

 [ТС]

3

Скрипт спасибо Вам ,но я неселен в таких кодах я подкоректировал название листв ,но дальше глухо. Прикрепил новый файл можно доработать если не сложно?



0



140 / 123 / 50

Регистрация: 10.11.2011

Сообщений: 620

28.12.2012, 14:45

 [ТС]

4

Скрипт, это Юра по вопросу отчета за период непоможите в решении ?



0



Igor_Tr

4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

29.12.2012, 20:39

5

Вам осталось следующее. 1. Кнопке «сформировать» назначить эту процедуру. 2. Оформить додавание листов с названиями клиентов автоматом, если их нет, в этой же процедуре. 3. Раскрасить, отформатировать, добавить бантики, цветочки. По вкусу, короче. 4. По листам, тоже можно в этой процедуре, выполнить арифметические действия. И все. Если понравится, то спасибо не мне , а Hugo121. Вот это серьйозно.

Visual Basic
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
Sub ReportForming()
 
Dim dict As Object
Dim i As Integer
Dim targetRow As Integer
Dim name As String
Dim ourDate As Date
Dim finance As Double
Dim goAhead As Boolean
 
Set dict = CreateObject("scripting.dictionary")
 
goAhead = True
i = 6
' Предварительно создайте листы. Пока вручную
Worksheets("ЧП Изумруд").UsedRange.Clear '
Worksheets("ООО Азот").UsedRange.Clear ' _
 
While goAhead
 
    name = Worksheets("Итого отчетов").Cells(i, 5).Value ' получатель
    ourDate = Worksheets("Итого отчетов").Cells(i, 4).Value ' дата
    finance = Worksheets("Итого отчетов").Cells(i, 6).Value  ' стоимость
 
    If dict.Exists(name) Then 'Dictionary:  .Exists(Key);
        targetRow = dict.Item(name) 'Dictionary:   .Item(Key)
    Else
        targetRow = 1
    End If
 
    Worksheets(name).Cells(targetRow, 1) = name
    Worksheets(name).Cells(targetRow, 2) = ourDate
    Worksheets(name).Cells(targetRow, 3) = finance
    dict.Item(name) = targetRow + 1
 
    i = i + 1
 
    If Len(Worksheets("Итого отчетов").Cells(i, 1)) = 0 Then goAhead = False
 
Wend
End Sub

Добавлено через 6 минут
Еще. У Вас какая-то проблема с наименованием «ООО Азот». Проверьте.



1



140 / 123 / 50

Регистрация: 10.11.2011

Сообщений: 620

29.12.2012, 21:58

 [ТС]

6

Спасибо за помощь Igor_Tr и Hugo121.
У меня вопрос ,а как с календарем быть ?Сейчас результаты выдает за весь период(за те даты когда проводились операции,а если например взять дату с 1.12 по 15.12 (ЧП Изумруд) должна быть одна запись,а выдает все даты ? Если дата отсутствует можно прописать «МsgBox» Такой даты нет!»
Возможно ли под корректировать код ? .Спасибо. Можно ответить на электронку :uzd-d@yandex.ua
Просто тогда календарь нужно убирать ,а хотелось с календарем



0



Igor_Tr

4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

29.12.2012, 23:27

7

Корректировать не только можно но и нужно. Но сначала разберите до нитки то, что уже у Вас есть, чтоб знать что корректируете. Кидаю еще функцию проверки наличия листа (Уокенбах, или Харрис — не помню).

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Function fun_SheetExists(sname) As Boolean
'   Якщо аркуш існує в активній робочій книзі, _
    функція повертає значення TRUE.
    
    Dim Обєкт As Object
            
    On Error Resume Next
    Set Обєкт = ActiveWorkbook.Sheets(sname)
    If Err = 0 Then fun_SheetExists = True _
        Else fun_SheetExists = False
End Function

Добавите в код что-то типа

Добавлено через 9 минут

Visual Basic
1
2
3
4
If fun_SheetExists("ООО Азот") = False then ' тоесть, такой лист не найден
Sheets.Add
ActiveSheet.Name="ООО Азот"
End if

Но основная Ваша проблема будет «вытяжка» (создание) имени листа. Я бы создавал или сразу, как только вношу в форму, или заганял в массив имеющиеся, и проверяд по наличию в массиве.

Добавлено через 5 минут
По поводу дат. Просмотрите функции даты и времени. Это очень важная вещь. Календарь убирать не надо, но я лично не люблю пристегивать лишнее. В т. ч. кнопочки, формочки и т.д. Только в крайней необходимости — раздувает код. И заканчиваю. С Новым годом! Еще посижу — жена выгонит. К вам приеду коды разбирать.



0



140 / 123 / 50

Регистрация: 10.11.2011

Сообщений: 620

29.12.2012, 23:42

 [ТС]

8

Создавать имя листа буду сразу в ручную, через масив тяжело , я неочень компетентен в vba. А какова судьба календарика- выбросить …
Спасибо Igor Tr



0



Igor_Tr

4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

30.12.2012, 02:36

9

Вырвался. На пару минут. Женщины. Сделаешь больше — жизни не будет. Сделаешь меньше — ты покойник. Ничего не выбрасывайте. Сделайте что-то рабочее, что не получается — спросите, кто-нибудь поможет. Вы задали себе задачу, требующую как минимум, знания (знакомства с…) половины учебника Уокенбах. Успехов.

Добавлено через 1 минуту
Святая Мария! Зачем в ручную?!!! Експерементируйте, а там и помощь будет!

Добавлено через 9 минут
Если вручную, тогда вам в коде поста №5 надо будет добавлять наименование листов тоже ВРУЧНУЮ после строки 16. А если кодом — тогда Вам эти строки будут ненужны!!!

Добавлено через 1 час 39 минут
Накидал применительно к Вашему случаю ВОЗМОЖНЫЕ варианты работы с массивами. Дальше сам, а то что-то вспоминается о каких-то намерениях, дороге и аде!

Visual Basic
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
Option Base 1
Sub ЗагонкаКлиентов_в_Массив()
    Dim Recipients()
    Dim strArr() As String
    Dim aCell As Object
    Dim mCol As Integer, mRow As Long, LastRow As Long
    Dim a As Integer, b As Integer, i As Integer, j As Integer
    
    With ActiveSheet
        For Each aCell In .UsedRange.Cells
            If aCell.Value Like "*Получатель*" Then
                mCol = aCell.Column
                mRow = aCell.Row
                Exit For
            End If
        Next
    End With
        LastRow = Cells(mRow, mCol).End(xlDown).Row ' получили _
                                номер ряда последней заполненой ячейки.
        Set mRng = Range(Cells(mRow + 1, mCol), _
                        Cells(LastRow, mCol))
        Recipients = mRng.Value ' в массив загнали всех клиентов
 
        Recipients = Application.Transpose(Recipients)
'------------------------------------------------------------------------
' просмотр массива в окне Immediate (Ctrl + G)
        For i = 1 To UBound(Recipients)
            Debug.Print Recipients(i)
        Next
'========================================
'Stop
        For i = 1 To UBound(Recipients)
            mstr = "Филимонов"
            If mstr Like Recipients(i) Then ' раз уже мы где-то _
                                                            выше зацепили Like
                b = b + 1
            End If
        Next  ' новогодний подарок от "Казанский".Спасибо! _
                                                                (в смысле, не "Next i")
        If b = 0 Then MsgBox mstr & Space(2) & "отсутствует. Надо добавлять... Оправдал бы надежды... "
'---или через фильтр-------
        strArr = Filter(Recipients, "Филимонов")
        a = UBound(strArr)
        If a < 0 Then MsgBox "Отсутствует. Надо добавлять... Оправдал бы надежды... "
   Stop
                
End Sub

А еще можно всякого и немерянно. Как в сочинении: «Мама. Она ведь у меня одна.»



0



140 / 123 / 50

Регистрация: 10.11.2011

Сообщений: 620

30.12.2012, 13:36

 [ТС]

10

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



0



Igor_Tr

4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

30.12.2012, 15:39

11

Для полноты картины. Тут два способа выгрузки массива на лист (есть еще перебор For…next). Пригодится. Посмотрите внимательно. Хочу сэкономить Вам время:

Visual Basic
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
        Recipients = mRng.Value ' в массив загнали всех клиентов
  '--------------------------------------------------------------------------------
    ' !!! Демо !!!! Обратите внимание, разберитесь при желании.
    ' Пусть активный лист "Итого отчетов"
  ' Выгрузка массива "Recipients" на лист "Отчет" ДО ВЫРАЖЕНИЯ _
                        "Recipients = Application.Transpose(Recipients)"
                        
        Sheets("Отчет").Cells(1, 10).Resize(UBound(Recipients), 1). _
                                        Value = Recipients ' одна возможность. _
                                     Не нужно активировать Sheets("Отчет").             
        
        Sheets("Отчет").Select ' !!!!!  Внимание !!!!
            Range(Cells(1, 12), _
                    Cells(UBound(Recipients), 12)) = Recipients ' _
                                   вторая возможность. Активировали Sheets("Отчет").
'=================================================
 
        Recipients = Application.Transpose(Recipients)
'--------------------------------------------------------------------------------
  ' Выгрузка массива "Recipients" на лист "Отчет" ПОСЛЕ ВЫРАЖЕНИЯ _
                        "Recipients = Application.Transpose(Recipients)"
' Пусть активный лист "Итого отчетов"
        Sheets("Отчет").Cells(1, 10).Resize(UBound(Recipients), 1). _
                                        Value = Application.Transpose(Recipients) ' _
                                                         без активации Sheets("Отчет").
        
        Sheets("Отчет").Select ' !!!!!  Внимание !!!! ' активация Sheets("Отчет").
 
            Range(Cells(1, 12), _
                    Cells(UBound(Recipients), 12)) = Application.Transpose(Recipients)
 
'=============================================



0



4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

02.01.2013, 21:15

12

Please check your inbox «uzd-d@yandex.ua»



0



4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

25.01.2013, 14:27

13

Изучал словари и для этого использовал, в том числе, Ваш пример. Кидаю результат. Там и создание кнопки, и массивы, и словари — в общем, Армагедон. Отчеты — по периодах, по фирмах, по сотрудниках. Перед использованием рекомендую прочитать в прилагаемой книге инф-ю на листе «Explanation». Удачи.



0



3217 / 966 / 223

Регистрация: 29.05.2010

Сообщений: 2,085

25.01.2013, 20:28

14

Вот пример со сводной таблицей, срабатывает при внесении конечной даты.



0



Igor_Tr

4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

25.01.2013, 21:06

15

Нормально. Кстати, была, в начале, идея посоветовать Св.Таблицы и Пром.Итоги. А потом занялся словарями — ну не пропадать трудам ведь. А еще вижу — словари все — таки более универсальны. Не зря время ушло.

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

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub CommandButton2_Click()
 
 Отчет.ListBox1.RowSource = ""
'   Добавление элементов в список
    With Отчет.ListBox1
        .RowSource = ""
        .AddItem "ЧП Изумруд"
        .AddItem "ООО Азот"
        .AddItem "Химрезерв"
        
    End With
    Отчет.Show
End Sub

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



0



  • Что такое приложения Visual Basic (макросы VBA)
  • Использование макросов VBA в Excel для создания отчетов
  • Понимание переменных, условий и циклов в VBA
  • Создание переменных в макросах VBA
  • Использование условий в макросах VBA
  • Использование циклов в макросах VBA
  • Ярлыки
  • Пакет инструментов анализа
  • Описательная статистика
  • Создание гистограммы
  • Скользящие средние
  • Расширенная генерация случайных чисел
  • Создание случайного образца
  • Вывод

Что такое приложения Visual Basic (макросы VBA)

VBA — это язык программирования, разработанный Microsoft для использования с офисным пакетом Microsoft, таким как Word, Access, Excel и другие. Он используется для настройки приложений в соответствии с потребностями бизнеса. Это мощный и удобный инструмент для многократного выполнения операции, а также помогает в анализе данных. VBA используется для доступа к функциям приложений и управления ими в некоторых других приложениях. Финансовая отчетность и анализ выполняются эффективным и действенным образом с использованием макросов VBA.

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

Использование макросов VBA в Excel для создания отчетов

Чтобы использовать VBA в Excel, убедитесь, что вкладка «Разработчик» присутствует на вкладке «Меню».

Если параметр разработчика недоступен на вкладке «Меню», нажмите кнопку «Office» à «Параметры Excel» à установите флажок «Показать вкладку разработчика» и нажмите кнопку «ОК».

Сделав эту опцию доступной, вы можете начать использовать Visual Basic. На вкладке Разработчик выберите параметр Visual Basic

Нажмите Вставить меню à Параметр формы пользователя

Выберите опцию Label из панели инструментов

Щелкните правой кнопкой мыши на ярлыке, и вы получите диалоговое окно «Свойства», в котором вы можете ввести подпись для ярлыка.

Теперь выберите значок «Текстовое поле» на панели инструментов и оставьте его рядом с полем «Метка». Затем щелкните правой кнопкой мыши на текстовом поле и во всплывающем меню «Свойства» введите имя для текстового поля в свойстве «Имя».

Повторите шаги, чтобы добавить столько меток и текстового поля, которое вы хотите ввести в область формы пользователя.

Теперь выберите опцию Command Button на панели инструментов и поместите ее в форму. Щелкните правой кнопкой мыши и во всплывающем окне свойств введите нужную команду из свойства «Заголовки».

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

Перед вставкой кода необходимо установить ссылку, которая поможет вам получить доступ к базе данных VB. Для выбора ссылок Меню Инструменты à Ссылки

В диалоговом окне выберите тип библиотеки, которую вы хотите использовать. На этом рисунке установлен флажок Microsoft ActiveX Data Objects 2.6 Library.

В окне кода введите код, который используется для запуска команды. Код находится между «Private Sub CommandButton1_Click ()» и End Sub.

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

После ввода кода вам необходимо создать макросы для данных. Перейдите на вкладку «Разработчик» à «Макросы», чтобы использовать меню «Макросы».

Введите имя макроса для отчета и нажмите кнопку «Создать».

Введите код для формы между опцией Sub и End Sub

После того, как все эти шаги сделаны, теперь у вас все готово для запуска отчета.

Для запуска отчета выполните следующие действия:

Нажмите на меню макросов на вкладке разработчика

Выберите имя макроса из списка и нажмите кнопку «Выполнить»

Введите необходимые данные для генерации отчета.

Наконец, отчет генерируется в соответствии с вашими потребностями.

Понимание переменных, условий и циклов в VBA

Сначала давайте посмотрим, что означают все три термина в VBA

Переменная — это небольшая часть системной памяти, которая используется для хранения данных

Условие — это логическая проверка, которую компьютер выполняет для проверки чего-либо

Цикл — это набор инструкций, которым необходимо следовать определенное количество раз

Теперь посмотрим, как использовать все эти три в VBA.

Создание переменных в макросах VBA

Если вы хотите использовать переменную в макросах VBA, сначала вам нужно их создать. DIM — это оператор, который используется для создания любой переменной.

Ниже приведены несколько примеров созданных переменных.

  • Dim someNumber As Integer — Это говорит о том, что вы собираетесь использовать некоторую переменную Number для хранения только целочисленных значений. Это используется в VBA как someNumber = 7, что означает, что он хранит 7 в переменной someNumber
  • Dim myList (1-10) As String — эта строка означает, что вы хотите использовать список значений в виде String (Text). И размер списка ограничен 10. Это используется как myList (5) = 792, означает, что оно устанавливает значение 5-го элемента в массиве myList равным 792.
  • Dim otherNumber As Double
  • Dim anotherList () в качестве варианта
  • Dim someText As String
  • Dim myCells As Range
  • Dim myChart As Chart
  • Dim aCondition As Boolean

Использование условий в макросах VBA

Все в компьютере включает в себя принятие решений и условия тестирования. Есть много утверждений для проверки условий. Мало что объясняется ниже для вашего понимания

Если тогда заявление

Использование оператора If действительно легко в макросах VBA. Вот пример, чтобы проверить условия покупки

Если наша покупка 6000, то

специальные инструкции для обработки слишком много или слишком мало покупок

конец, если

Остальное заявление

Оператор Else используется, когда условие If не выполнено.

Если наша покупка 6000, то

специальные инструкции для обработки слишком много или слишком мало покупок

еще

Запишите покупки и двигайтесь дальше

конец, если

Использование циклов в макросах VBA

Существует несколько способов написания циклов в VBA. Здесь мы упомянули самый простой тип петли для вашего легкого понимания

Для петли

For Loop используется для повторения набора инструкций для определенного количества раз

Для storeNumber = от 20 до 50

позвонить в магазин

спросите цифры продаж

сделай что-нибудь, если нужно

‘вешать трубку

Следующий магазинNumber

Для каждой петли

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

Для каждой ячейки в диапазоне («B1: B10»)

cell.value = cell.value + 2

Следующая клетка

Ярлыки

Есть несколько важных ярлыков, которые вы должны знать при использовании VBA в Excel

  • ALT + F11 — для просмотра VBA Editor, также известного как VBE
  • ALT + F8 — для отображения всех макросов
  • ALT + Q: закрыть редактор VBA и вернуться в Excel
  • F5: запустить макрос
  • F2: Показать объект браузера
  • F7: Показать редактор кода
  • CTRL + G: открыть немедленное окно
  • F1: Показать справку

Пакет инструментов анализа

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

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

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

Перейдите на вкладку «Зеленый файл» и нажмите «Параметры».

В раскрывающемся списке «Управление» выберите «Надстройки Excel» и нажмите «Перейти».

В диалоговом окне «Надстройки» установите флажок «Analysis ToolPak» и нажмите «ОК».

Если опция Analysis ToolPak недоступна, нажмите «Обзор». Если он доступен, установите флажок напротив параметра «Пакет инструментов анализа» и нажмите «ОК».

Теперь на вкладке «Данные» вы можете нажать «Анализ данных».

Наконец, вы можете выбрать вариант, который вам нужно сделать в Excel. На рисунке ниже гистограмма выбрана для создания гистограммы в Excel для заданных данных.

В пакете Analysis ToolPak доступно всего 19 вариантов анализа данных. Они перечислены ниже

  • Anova: однофакторный
  • Anova: двухфакторный с репликацией
  • Anova: двухфакторный без репликации
  • корреляция
  • ковариации
  • Описательная статистика
  • Экспоненциальное сглаживание
  • F-тест два образца для дисперсии
  • Анализ Фурье
  • Гистограмма
  • Скользящая средняя
  • Генерация случайных чисел
  • Ранг и проценты
  • регрессия
  • отбор проб
  • t-тест: два парных образца для средних
  • t-тест: две выборки, предполагающие равные отклонения
  • t-тест: две выборки, предполагающие неравные отклонения
  • Z-тест: два образца для среднего

Немногие из этих методов анализа данных подробно объясняются ниже со скриншотами того же

Описательная статистика

После того как Analysis ToolPak установлен, вы получите диалоговое окно Data Analysis, где у вас есть список вариантов. Выберите Описательную статистику. После выбора этой опции вы получите диалоговое окно, как показано на рисунке ниже

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

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

Создание гистограммы

Гистограмма — это набор значений в определенных диапазонах. Диапазоны известны как бункеры в гистограмме. В том же диалоговом окне «Анализ данных» выберите параметр «Гистограмма». Вы получите диалоговое окно, как показано на рисунке ниже

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

Диалоговое окно гистограммы также дает вам возможность создать диаграмму вместе с выводом. Это даст вам легкое понимание.

Скользящие средние

Эта опция поможет вам определить тенденции в последовательных данных. Исходные данные здесь основаны на периодах, и среднее значение всегда рассчитывается для ряда периодов. Ниже приведено диалоговое окно скользящих средних

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

На этом рисунке вы можете ясно видеть, что 6 ячеек, начиная с D4, не возвращают никакого значения, поскольку мы ввели шаг Интервал как 7.

Расширенная генерация случайных чисел

Это один из параметров в диалоговом окне «Анализ данных». Как только он будет выбран, вы увидите диалоговое окно «Генерация случайных чисел» ниже.

Даже в Excel есть эта опция, но опция генерирования случайных чисел в Analysis ToolPak гораздо более продвинутая, чем в Excel. Здесь вы можете больше контролировать

  • Количество переменных
  • Количество случайных чисел
  • Случайная скорость

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

Создание случайного образца

Одним из параметров в диалоговом окне «Анализ данных» является «Выборка». Нажав на эту опцию, вы увидите другое диалоговое окно, как показано на рисунке ниже.

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

Этот метод очень прост и может помочь вам мгновенно создать образец.

Вывод

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

Связанные курсы: —

  1. Базовый курс VBA и макросов
  2. Продвинутый курс VBA и макросы
  3. Комплексное обучение VBA и макросам
  4. Как использовать для каждого цикла в VBA

Отчет Access имеет известные достоинства, такие как простота формирования его структуры и
мощный аппарат компоновки исходных данных. Но есть и неудобства: пользователь для
изменения этого отчета должен вносить изменения в исходные данные базы, или, того хуже, обращаться к Разработчику для внесения поправок (напр. нужен раздел «Кому, от кого»).
Есть еще недостатки, описывать их, думаю, не стоит: понятно.

Предлагается решение:

  1. Создание локальной исходной таблицы — источника (t3_Sborka).
  2. Копирование исходных данных отчета в t3_Sborka с мин. преобразованием типов данных
    (здесь в t3_Sborka данные сохраняются в поле формата STRING).
    … и далее по F1:
  3. Формирование на основе t3_Sborka перекрестного запроса NewQueryDef.
  4. Вывод в формат Excel NewQueryDef.
  5. Уничтожение — NewQueryDef и t3_Sborka.

    Я по этой теме уже публиковался на

    http://www.cyberforum.ru/ms-access/thread2158558.html

но речь там идет об обратном процессе — о сохранении уже готовых таблиц Excel в БД.

Подробнее на примере БД со схемой БД учета трудоемкости изготовления изделия по заданному технологическому маршруту, где значение записи поля Итог в таблице Маршруты есть трудоемкость изготовления конкретной детали в одном из цехов предприятия. Здесь предлагается рассматривать изделие как простую совокупность входящих деталей и на практике дело намного сложнее, но это уже другая тема.

где такой код Basic :

Dim qdfNew As QueryDef
Dim D, N
    Otvet = MsgBox("Обработать данные", vbOKOnly, "Отчеты Excel")
    Call Заполнитьt3_Sborka
    ' Создайте временный QueryDef.
    Set qdfNew = CurrentDb.CreateQueryDef("ДеталиОперации", "TRANSFORM Max(t3_Sborka.NCH) AS [Max-NCH] SELECT " _
         & "t3_Sborka.NumStroka FROM t3_Sborka GROUP BY t3_Sborka.NumStroka ORDER BY " _
         & "t3_Sborka.NumStroka, t3_Sborka.NumStolbec PIVOT t3_Sborka.NumStolbec;")
     Call closeProject("Excel")  'закрыть процесс Excel
    ' Откройте набор записей и распечатайте отчет.
    DoCmd.OutputTo acOutputQuery, "ДеталиОперации", "ExcelWorkbook(*.xlsx)", "Таблица.xlsx", True, "", , acExportQualityScreen
    ' Удалите новый QueryDef, потому что это демонстрация.
    CurrentDb.QueryDefs.Delete "ДеталиОперации"
    ' Удалите источник, потому что это демонстрация.
    CurrentDb.TableDefs.Delete "t3_Sborka"
Exit_Кн_Отчеты_Click:
    Exit Sub
End Sub

Sub Заполнитьt3_Sborka()
Dim rs1 As DAO.Recordset, rs2 As DAO.Recordset, rs3 As DAO.Recordset
Dim NStroka As Long, NStolb As Long

    'создать t3_Sborka
    CurrentDb.Execute ("CREATE TABLE t3_Sborka (t3Cod COUNTER CONSTRAINT MyFieldConstraint PRIMARY KEY, NumStroka LONG, " _
        & "NumStolbec LONG, NCH STRING);")

    'три выборки:
    Set rs1 = CurrentDb.OpenRecordset("SELECT Детали.КодДетали, Детали.ДецимДетали, Сборки.КолДеталей FROM Детали INNER JOIN Сборки ON " _
        & "Детали.КодДетали = Сборки.КодДетали WHERE Сборки.КодИзделия=" & Me.КодИзделия & " ORDER BY Сборки.КодСборки;")
    Set rs2 = CurrentDb.OpenRecordset("Цеха")
    Set rs3 = CurrentDb.OpenRecordset("t3_Sborka")
    <cut/>
     'заполнить сетку с данными
    NStroka = 0
    With rs3
    Do Until rs1.EOF
        NStroka = NStroka + 1
        NStolb = 2
        Do Until rs2.EOF
            NStolb = NStolb + 1
            .AddNew
            !NumStroka = NStroka
            !NumStolbec = NStolb
            !NCH = DLookup("Итог", "Маршруты", "КодДетали=" & rs1!КодДетали & " And КодЦеха=" & rs2!КодЦеха)
            .Update
            rs2.MoveNext
        Loop
        rs2.MoveFirst
        rs1.MoveNext
    Loop
    End With
    rs2.Close

    'заголовки строк
    rs1.MoveFirst
    NStroka = 0
    With rs3
    Do Until rs1.EOF
    NStroka = NStroka + 1
    .AddNew
    !NumStroka = NStroka
    !NumStolbec = 1
    !NCH = rs1!ДецимДетали
    .Update
    .AddNew
    !NumStroka = NStroka
    !NumStolbec = 2
    !NCH = rs1!КолДеталей
    .Update
    rs1.MoveNext
    Loop
    .Close
    End With
    rs1.Close
Exit_Заполнитьt3_Sborka:
    Exit Sub
End Sub

Sub closeProject(proc As String) 'закрыть процесс Excel
    Dim Process As Object, i
    For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
        i = i + 1
        If Process.Caption Like "*" & proc & "*" Then
           Process.Terminate
        End If
    Next
End Sub

Выдает итоговый отчет

Конечно, в коде заполнения источника t3_Sborka можно предусмотреть и заголовки, и поля итогов. Простор широкий, а получаемый результат, думаю, окупит затраченные усилия.

Понравилась статья? Поделить с друзьями:
  • Создание отчета сводной таблицы excel
  • Создание отчета access в word
  • Создание объекта в microsoft excel
  • Создание общего документа word
  • Создание нумерации в excel