Данная функция предназначена для суммирования итогов и подитогов в таблице Excel, если в ячейках находятся сразу 2 значения
(к примеру, фактическое, и по плану), разделённые переводом строки (нажатием Alt + Enter)
При суммировании учитывается группировка строк.
Для суммирования несгруппированных строк используется функция СуммаПланФакт,
а для сгруппированных строк - функция СуммаПодитоговПланФакт
Примеры формул на листе Excel
- =СуммаПодитоговПланФакт(D8:D9)
- =СуммаПодитоговПланФакт(F8;H8;J8)
- =СуммаПланФакт(D4:D10)
Код пользовательской функции (UDF):
Function СуммаПланФакт(ParamArray args() As Variant) As String Application.Volatile True Dim cell As Range, v1 As Double, v2 As Double For Index = LBound(args) To UBound(args) ' перебираем все диапазоны ячеек If Not IsMissing(args(Index)) Then ' если очередной аргумент присутствует If TypeName(args(Index)) = "Range" Then ' если аргумент - диапазон ячеек For Each cell In args(Index).Cells ' перебираем все ячейки в диапазоне If cell.EntireRow.OutlineLevel = 1 Then arr = Split(cell.Text, vbLf) If UBound(arr) = 1 Then v1txt = Trim(arr(0)): v2txt = Trim(arr(1)) v2txt = Replace(v2txt, "(", ""): v2txt = Replace(v2txt, ")", "") v1txt = Replace(v1txt, ",", "."): v2txt = Replace(v2txt, ",", ".") v1txt = Val(v1txt): v2txt = Val(Trim(v2txt)) v1 = v1 + v1txt: v2 = v2 + v2txt End If End If Next cell End If End If Next Index СуммаПланФакт = СуммаПланФакт & v1 & vbLf & "(" & v2 & ")" End Function Function СуммаПодитоговПланФакт(ParamArray args() As Variant) As String Application.Volatile True Dim cell As Range, v1 As Double, v2 As Double For Index = LBound(args) To UBound(args) ' перебираем все диапазоны ячеек If Not IsMissing(args(Index)) Then ' если очередной аргумент присутствует If TypeName(args(Index)) = "Range" Then ' если аргумент - диапазон ячеек For Each cell In args(Index).Cells ' перебираем все ячейки в диапазоне If cell.EntireRow.OutlineLevel = 2 Then arr = Split(cell.Text, vbLf) If UBound(arr) = 1 Then v1txt = Trim(arr(0)): v2txt = Trim(arr(1)) v2txt = Replace(v2txt, "(", ""): v2txt = Replace(v2txt, ")", "") v1txt = Replace(v1txt, ",", "."): v2txt = Replace(v2txt, ",", ".") v1txt = Val(v1txt): v2txt = Val(Trim(v2txt)) v1 = v1 + v1txt: v2 = v2 + v2txt End If End If Next cell End If End If Next Index СуммаПодитоговПланФакт = СуммаПодитоговПланФакт & v1 & vbLf & "(" & v2 & ")" End Function
Единственное отличие функций - в значении параметра OutlineLevel (уровня группировки) обрабатываемых строк.
Пример - в прикреплённом файле (обратите внимание на формулы в серых ячейках)
Комментарии
Отправить комментарий