This can be accomplished with a simple SUBTOTAL across a dynamic range. Locating Total in column B can be looped.
Option Explicit
Sub totalAllClients()
Dim rng As Range, rngsb As Range, addr As String
With Worksheets("sheet11")
With Intersect(.Columns(2), .UsedRange)
Set rng = .Find(What:="total", After:=.Cells(1), MatchCase:=False, _
LookAt:=xlWhole, SearchDirection:=xlPrevious)
If Not rng Is Nothing Then
addr = rng.Address(0, 0)
Do
rng.Offset(0, 1).FormulaR1C1 = _
"=index(c2, match(""zzz"", r1c2:r[-1]c2))"
rng.Offset(0, 3).Resize(, 6).FormulaR1C1 = _
"=subtotal(109, r[-1]c:index(c, match(""zzz"", r1c2:r[-1]c2)))"
Set rng = .FindNext(After:=rng)
Loop Until rng.Address(0, 0) = addr
rng.Offset(2, 3).Resize(1, 6).FormulaR1C1 = _
"=aggregate(9, 3, r2c:r" & rng.Row & "c)"
End If
End With
End With
End Sub
132 / 15 / 2 Регистрация: 27.11.2013 Сообщений: 509 |
|
1 |
|
Подсчет промежуточных итогов в таблице переменного размера04.11.2015, 22:27. Показов 8553. Ответов 10
Есть таблица, кол-во строк в которой меняется. Образец прилагается. В желтых строчках нужно ввести формулы промежут. итогов, например сумма и среднее. Я делаю по-школьному — рассчитываю границы промежуточных рейнджей (это тикеры в 4 столбце), а потом с пом. формул R1C1 циклом обсчитываю всю таблицу. Подозреваю, что это не самый эффективный метод — считает очень долго. Можно как-то оптимизировать процесс через массивы или объектные переменные? Причем в промежут. итогах мне нужны не значения, а именно формулы — они важны в текущей работе для быстрого подсчета.
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
04.11.2015, 22:47 |
2 |
|||
Сообщение было отмечено shavka как решение РешениеОдин из возможных вариантов :
2 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
04.11.2015, 22:56 |
3 |
|||
shavka, есть предложение задействовать штатную команду «Промежуточные итоги». Но для этого придется удалять существующие желтые строки. Все это делает следующий макрос, полученный в основном записью ручных действий.
1 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
05.11.2015, 00:16 |
4 |
|||
Если сумму необходимо считать по столбцу D , а среднее по столбцу E , то небольшое изменение :
1 |
132 / 15 / 2 Регистрация: 27.11.2013 Сообщений: 509 |
|
05.11.2015, 02:12 [ТС] |
5 |
чо то там у вас не дописалось в конце в макросе. Ну ладна, если это записью макроса делается, я допишу. Но че то как-то стремно удалять желтые строчки. Он их точно мне сам вставит, где надо? Добавлено через 5 минут
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
05.11.2015, 10:16 |
6 |
Сообщение было отмечено shavka как решение Решениеshavka, Если посмотрите справку, касательно стандартной функции рабочего листа =ПРОМЕЖУТОЧНЫЕ.ИТОГИ() , то увидите что первый обязательный аргумент — это номер функции, в нашем случае, это 9 — СУММ и 1 — СРЗНАЧ Если же результаты вычислений не должны зависеть от наличия фильтра(скрытых строк), то ПРОМЕЖУТОЧНЫЕ.ИТОГИ можно заменить на SUM и AVERAGE. Разумеется, подобным способом Вы можете вводить и более сложные(нестандартные) формулы, только не забудьте, что для программного ввода формул массива — нужно использовать свойство .FormulaArray
1 |
132 / 15 / 2 Регистрация: 27.11.2013 Сообщений: 509 |
|
05.11.2015, 13:19 [ТС] |
7 |
Блин, точно, саффсем забыл. FormulaArray! А я просто Formula написал свойство. Потому он и не считает. Спасибо!!!
0 |
132 / 15 / 2 Регистрация: 27.11.2013 Сообщений: 509 |
|
26.12.2015, 18:36 [ТС] |
8 |
pashulka, наслаждался вашим изящным макросом и тут вдруг облом: если в каком-либо из списков таблицы всего одна строчка, он дальше не группирует. Ошибка 1004. А если запросить через MsgBox адреса группируемых строк, то в этой единичной строчки он пишет такую билеберду:
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
26.12.2015, 19:09 |
9 |
shavka, Не заметил я в своём макросе группировки, но даже ежели её добавить (см.аттач), то если в столбце B будет дата(число) мы пролучим группу, если нет, макрос эту строку просто проигнорирует, но ошибки не будет.
1 |
shavka 132 / 15 / 2 Регистрация: 27.11.2013 Сообщений: 509 |
||||
26.12.2015, 19:22 [ТС] |
10 |
|||
500 раз спасибо! Точно, я ж сначала хотел просто итоги подсчитать, а потом думаю — нахли мне такая простыня, конца-края не видно, дай-ка загруппирую тем же макросом, но понятым мной несколько извращенно. Но не доперло до меня окончательно, я вот так написал:
на что макрос высказал мне все, что он обо мне думает
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
26.12.2015, 19:46 |
11 |
На всякий случай — цитата из офисной справки, об’ясняющая когда нужно применять SpecialCells (за исключением xlLastCell) к одной единственной ячейке : Выделение ячеек в соответствии с содержащимися в них данными 1 Выделите диапазон, содержащий тип ячеек, которые нужно выделить. Чтобы выделить все ячейки этого типа на текущем листе, наведите указатель на любую ячейку и нажмите кнопку мыши. 2 В меню Правка выберите команду Перейти (мой совет — или используйте клавишу F5)
1 |
MrSlonidze Пользователь Сообщений: 3 |
Приветствую! Нужен макрос, который будет вставлять функцию промежуточные итоги в уже созданную структуру диапазона данных. Искал на форуме ответ и самым похожим был макрос который считал уровни группировки, создавал ссылки на ячейки внутри группировок и суммировал их значения. Вот если бы к нему еще функцию промежуточные итоги добавить… Прикрепленные файлы
Изменено: MrSlonidze — 17.01.2018 11:34:37 |
a.i.mershik Пользователь Сообщений: 8277 |
#2 17.01.2018 10:56:52 MrSlonidze,а формула не подходит и протянуть по столбцам?
Не бойтесь совершенства. Вам его не достичь. |
||
MrSlonidze Пользователь Сообщений: 3 |
Это же формула для таблицы в целом, а нужно вставить в каждую группировку, по видам рыб, еще задать диапазон для каждой формулы, т. к. они разные. |
Z Пользователь Сообщений: 6111 Win 10, MSO 2013 SP1 |
#4 17.01.2018 11:33:23
OFF Правила следует не просто читать, но и чтить… Работа . Там, скорее всего, найдутся специалисты, которые разберутся с вашей проблемой быстро, качественно и за разумную плату.» Изменено: Z — 17.01.2018 11:33:51 «Ctrl+S» — достойное завершение ваших гениальных мыслей!.. |
||
RAN Пользователь Сообщений: 7091 |
#5 17.01.2018 12:02:20
поможет вам как рыбе зонтик
|
||||
MrSlonidze Пользователь Сообщений: 3 |
Код сработал отлично! |
RAN Пользователь Сообщений: 7091 |
Все. Начиная с формулы, и кончая алгоритмом определения нужной строки |
cuprum Пользователь Сообщений: 226 |
#8 17.01.2018 14:57:04 Взял на себя смелость модифицировать код уважаемого RAN, надеюсь он на меня не обидится.
Изменено: cuprum — 17.01.2018 14:59:31 |
||
Промежуточные итоги в таблице |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
На этом шаге мы рассмотрим параметры этого метода и пример использования .
Метод Subtotal добавляет промежуточные итоги в список данных, основываясь на изменениях в определенных полях данных. Промежуточные итоги позволяют обобщить данные. Метод Subtotal автоматически вставляет строки с промежуточными итогами, в которые введены формулы для подсчета итогов. Необходимо, чтобы до активизации этого метода данные были правильно отсортированы. В противном случае этот метод может привести к неверному выводу промежуточных итогов. Вручную метод Subtotal вызывается командой Данные | Итоги (Data | Subtotal) .
Таблица 1. Аргументы метода Subtotal
Основным методом, связанным с Subtotal , является метод RemoveSubtotal , удаляющий промежуточные итоги с рабочего листа. Метод RemoveSubtotal применяется к объекту Range .
Приведем соответствие между аргументами метода Subtotal и подведением промежуточных итогов на рабочем листе вручную при помощи команды Данные | Итоги (Data | Subtotal) на примере подсчета продаж компьютеров по месяцам и нахождения средних объемов продаж (рисунок 1).
Рис.1. Отчет о продажах компьютеров
Рис.2. Диалоговое окно Промежуточные итоги
- Раскрывающийся список При каждом изменении в (Ateach change) устанавливает, по какому столбцу группируются данные. В данном случае выберем Компьютер .
- Раскрывающийся список Операция (Use function) устанавливает операцию, выполняемую над данными. Выберем Сумма (Sum) .
- Список Добавить итоги по (Add subtotal to) устанавливает данные, которые участвуют в расчетах. В данном случае выберем Количество .
- Флажок Заменить текущие итоги (Replace current subtotals) определяет, надо ли заменить старые промежуточные итоги на вновь созданные. Сбросим этот флажок.
- Флажок Конец страницы между группами (Page break between groups) определяет, надо ли вставлять символ конца страницы после каждой группы, для которой подводятся промежуточные итоги. Сбросим этот флажок.
- Флажок Итоги под данными (Summary below data) определяет расположение промежуточных итогов под или над данными, по которым подводятся итоги. Расположим их под данными и поэтому установим флажок Итоги под данными (Summary below data) .
Нажмем кнопку ОК в диалоговом окне Промежуточные итоги (Subtotal) , что приведет к созданию промежуточных итогов на рабочем листе по выделенному диапазону данных (рисунок 3).
Рис.3. Результат выполнения команды Промежуточные итоги
На VBA тот же результат достигается применением следующих инструкций:
Рис.4. Результат добавления показателя средней реализации компьютеров по месяцам
На VBA тот же результат достигается применением следующих инструкций:
Рис.5. Вывод промежуточных итогов без детализации
На VBA тот же результат достигается применением следующих инструкций:
Здесь свойство Outline рабочего листа возвращает объект Outline (Структура) , а свойство ShowLevels объекта Outline устанавливает отображаемый уровень детализации.
Для удаления промежуточных итогов следует выделить данные с этими итогами, выполнив команду Данные | Итоги (Data | Subtotal) и нажать кнопку Убрать все (Remove All) в появившемся диалоговом окне Промежуточные итоги (Subtotal) . На VBA тот же результат достигается применением следующих инструкций:
Со следующего шага мы начнем рассматривать сценарии .
Источник
Метод Range.Subtotal (Excel)
Создает промежуточные итоги для диапазона (или текущего региона, если диапазон является одной ячейкой).
Синтаксис
expression. Промежуточный итог (GroupBy, Function, TotalList, Replace, PageBreaks, SummaryBelowData)
выражение: переменная, представляющая объект Range.
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
GroupBy | Обязательный | Long | Поле для группировки в виде одночисленного смещения. Дополнительные сведения см. в примере. |
Function | Обязательный | XlConsolidationFunction | Функция промежуточных итогов. |
TotalList | Обязательный | Variant | Массив из 1 смещения полей, указывающих поля, к которым добавляются промежуточные итоги. Дополнительные сведения см. в примере. |
Replace | Необязательный | Variant | Значение True для замены существующих промежуточных итогов. Значение по умолчанию — True. |
PageBreaks | Необязательный | Variant | Значение true для добавления разрывов страниц после каждой группы. Значение по умолчанию — False. |
SummaryBelowData | Необязательный | XlSummaryRow | Размещает сводные данные относительно промежуточных итогов. |
Возвращаемое значение
Пример
В этом примере создаются промежуточные итоги для выделения на листе Sheet1. Промежуточные итоги — это суммы, сгруппированные по каждому изменению в поле 1, а промежуточные итоги добавляются к полям 2 и 3.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Свойство PivotField.Subtotals (Excel)
Возвращает или задает промежуточные итоги, отображаемые с указанным полем. Допустимо только для полей без данных. Для чтения и записи, Variant.
Синтаксис
expression. Промежуточные итоги (индекс)
Выражение Переменная, представляющая объект PivotField .
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
Индекс; | Необязательный | Variant | Индекс промежуточных итогов, как показано в следующей таблице. Если этот аргумент опущен, метод Subtotals возвращает массив, содержащий логическое значение для каждой промежуточных итогов. |
Замечания
Если индекс имеет значение True, в поле отображается промежуточный итог. Если индекс 1 (автоматический) имеет значение True, все остальные значения имеют значение False.
Указатель | Описание |
---|---|
1 | Автоматически |
2 | Sum |
3 | Count |
4 | СРЗНАЧ |
5 | Max |
6 | Min |
7 | Продукт |
8 | Количество чисел |
9 | StdDev |
10 | StdDevp |
11 | Var |
12 | Диспр |
Для источников данных OLAP индекс может возвращать только значение 1 (автоматически). Возвращаемый массив всегда содержит значение True или False для первого элемента массива, а для всех остальных элементов — значение False . Массив значений элементов, все из которых имеют значение False , указывает на отсутствие промежуточных итогов.
Пример
В этом примере задается поле, содержащее активную ячейку для отображения итоговых итогов.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Как скрыть все промежуточные итоги в сводной таблице в Excel
Что делает макрос: Создание сводной таблицы Excel включает в себя промежуточные итоги по умолчанию. Это неизбежно приводит к отчету, который пугает множеством цифр, что делает его трудным.
Вы можете вручную скрыть все промежуточные итоги сразу перейдя в ленте и выбрав Работа со Сводными Таблицами➜Дизайн➜Макет➜Промежуточные➜Не Показывать
Промежуточные Итоги. Но опять же, если вы строите автоматизированный процесс, который постоянно манипулирует сводными таблицами без ручного вмешательства, вы можете
предпочесть вариант макроса.
Как макрос работает
Если вы записываете макрос, в то время как скрываете промежуточные итоги в сводной таблице, Excel производит код, похожий на этот:
Excel передает массив с 12 ложными параметрами. Есть 12 экземпляров false, потому что есть двенадцать видов промежуточных итогов — сумма, среднее, количество, минимум и максимум и т.д. Итак, когда вы выключите промежуточные итоги во время записи макроса в Excel наборы всех возможных видов значение false.
Альтернативный способ отключить «итоги» — это первый комплект из 12 промежуточных итогов в True. Это автоматически заставляет других 11 видов в false. Мы после этого устанавливаем так же Итого в ложь, скрывая все промежуточные итоги. В этот кусок кода, мы создаем первый промежуточный итог True, а затем установить его в false. Это удаляет промежуточный итог для области.
В этом макросе мы используем этот трюк, чтобы выключить промежуточные итоги для каждого поля сводной таблицы в активной сводной таблице.
Код макроса
Как этот код работает
- Шаг 1 объявляет две переменные объекта. Этот макрос использует РТ в качестве контейнера памяти для сводной таблицы и использует PF в качестве контейнера памяти для полей. Это позволяет перебрать все сводные поля в сводной таблице. Этот макрос разработан таким образом, что мы выводим активную сводную таблицу на основе активной ячейки. То есть, активная ячейка должна быть внутри сводной таблицы для запуска этого макроса. Когда курсор находится внутри определенной сводной таблицы, мы хотим, выполнить действие макроса на этой оси.
- Шаг 2 устанавливает переменную СТ к имени сводной таблицы на которой найдена активная ячейка. Мы делаем это, используя свойство ActiveCell.PivotTable.Name, чтобы получить имя целевого диапазона.
Если активная ячейка не находится внутри сводной таблицы, выдается ошибка. Именно поэтому макрос использует On Error Resume Next Statement. Это говорит Excel продолжить макро, если есть ошибка. - Шаг 3 проверяет в переменной РТ заполнены ли сводные таблицы объекта. Если переменная PT установлена в настоящее время, активная ячейка была не на сводной таблице, таким образом, сводной таблице не может быть присвоена переменная. Если это так, то мы говорим пользователю в окне сообщения, а затем выходим из процедуры.
- Если макрос достигает Шаг 4, он успешно указал на сводную таблицу. Мы готовы к циклу для всех полей в сводной таблице. Оператор For Each перебирает каждое поле сводной.
Каждый раз, когда выбрано новое поле сводной, мы применяем нашу логику Итого. После того, как все поля были оценены, макрос заканчивается.
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код.
Источник