|
27.04.2018, 09:52 | #1 |
Участник
|
Отчет Excel как c уровнями группировок
Есть у кого-то готовый пример как сделать такой отчет? Нужно сделать такую группировку данных с итогами Данных много, группировка и расстановка итогов работает у меня медленно. 1С вроде как умеет делать это быстро т.к создание таких отчетов для него уже продумана разработчиками. Может кто-то делал такой отчет и поделиться проектом или алгоритмом? Как сейчас считаю итоги: по мере получения данных из базы данных считаю заполняю итоги в контейнеры, потом когда все данные прочтены извлекаю итоги из контейнера и вношу в Excel Группировку делаю через макросы, примерно так: Sub MCGroup() Dim cell As Range Application.ScreenUpdating = False Rows("2:2").Select For Each cell In ActiveSheet.UsedRange.Columns(7).Cells If (cell.Row >= 7 And cell.Font.Bold = False And cell.Value <> "") Then If cell.Value <> "" Then cell.EntireRow.Group End If Next Application.ScreenUpdating = True End Sub UPD: узнал, что в 1С такие отчеты называются уровни группировок. И в 1С это действительно работает быстро Последний раз редактировалось iiipoizone; 27.04.2018 в 10:43. |
|
27.04.2018, 13:08 | #2 |
Участник
|
Не группируйте вручную, указывая диапазоны. Группируйте автоматически основываясь на значениях ячеек. Строки с одинаковыми значениями попадут в одну группу сами.
|
|
27.04.2018, 13:59 | #3 |
Участник
|
Автоматически - это как? Сводная таблица?
Последний раз редактировалось iiipoizone; 27.04.2018 в 14:10. |
|
27.04.2018, 14:17 | #4 |
Участник
|
Держите, метод для ComExcelDocument_RU
X++: #define.xlSum(-4157) public void insertSubtotal(MSOfficeBookMark_RU _bookMark, int _column, int _consolidationFunction, Array _array, boolean _replace = true, boolean _pageBreaks = false, boolean _summaryBelowData = true, int _workSheet = 1 ) { Com range; ComVariant xlArray; ; xlArray = ComVariant::createFromArray(_array); range = this.findRange(_bookMark, _workSheet); range.subtotal(_column, _consolidationFunction, xlArray, _replace, _pageBreaks, _summaryBelowData); }
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет. |
|
27.04.2018, 15:35 | #5 |
Участник
|
Цитата:
Сообщение от Weez
Держите, метод для ComExcelDocument_RU
X++: #define.xlSum(-4157) public void insertSubtotal(MSOfficeBookMark_RU _bookMark, int _column, int _consolidationFunction, Array _array, boolean _replace = true, boolean _pageBreaks = false, boolean _summaryBelowData = true, int _workSheet = 1 ) { Com range; ComVariant xlArray; ; xlArray = ComVariant::createFromArray(_array); range = this.findRange(_bookMark, _workSheet); range.subtotal(_column, _consolidationFunction, xlArray, _replace, _pageBreaks, _summaryBelowData); } |
|
28.04.2018, 10:51 | #6 |
Участник
|
Цитата:
https://msdn.microsoft.com/en-us/lib...code-snippet-1 |
|
27.04.2018, 15:16 | #7 |
Участник
|
Допустим мне надо группировать вот эту таблицу:
У меня сейчас отчет выводиться так: SubTotal позволяет получить итоги только по одному столбцу: Можно выбрать по очереди Level 3 , Level 2, Level 1 но итоги сложатся от предудущей операции и он работает красиво только по одному или двум столбцам. Делаем SubTotal по 3-ем уровням level 3, level 2, level 1 как видим работает ужасно. Теперь представьте что будет с 5ю уровнями Последний раз редактировалось iiipoizone; 27.04.2018 в 15:31. |
|
28.04.2018, 09:40 | #8 |
Злыдни
|
А что мешает сделать все через сводную таблицу в классическом виде?
Картинки исходного диапазона (плоская таблица) и сводная по диапазону в классическом виде во вложении
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|