Страницы: 1
RSS
Сокращение формулы суммы
 
Добрый день, есть файл расчета, в который на ежедневной основе вносятся данные по проектам и происходит суммирование каждого показателя.
Проекты могут начинаться в любой день, поэтому суммировать просто по столбцам не получится.
У меня есть формула, которой работает, но она слишком громозкая, работает если мало проектов, однако если проектов много, то внесение отдельно каждого в формулу будет сильно нагружать систему.
Можно ли как-то сократить формулу, приведя её в общий вид, чтобы не нужно было вносить в неё каждый новый проект при добавлении?

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

#2
06.03.2023 11:59:52

Как вариант проекты объединить в одну общую живую таблицу, а на другой лист вывести отчет и фильтровать по дням, проектам и направлениям без формул вообще все будет работать.
К сожалению, объеденить в одну нельзя, так как все проекты разные с разными датами начала и конца и для каждого проекта идет своя таблица.  
 
Андрей Сошин,
можно упростить ввод формулы с помощью макроса вроде этого:
Код
Sub aaa()
x = InputBox("введите кол-во проектов")
For n = 5 To x * 5 Step 5
    A = A & "+" & "СУММ(A" & n & ":A" & n + 2 & ")"
Next
Range("A1").Formula2Local = "=" & Right(A, Len(A) - 1)
End Sub
Изменено: evgeniygeo - 06.03.2023 12:42:17
 
Вариант макросом.
Код
Option Explicit

Sub mySum()
    Dim sh As Worksheet
    Set sh = ActiveSheet
    Dim arr As Variant
    arr = sh.UsedRange.FormulaR1C1
    ClearArray arr
    
    Dim dicY As Object
    Dim dicX As Object
    GetDic arr, dicY, dicX
    
    If dicY.Count = 0 Then Exit Sub
    If dicX.Count = 0 Then Exit Sub
    
    Dim yy As Long
    Dim yd As Long
    Dim yo As Long
    Dim xx As Long
    Dim xo As Long
    For yy = dicY.Items()(dicY.Count - 1) + 1 To UBound(arr, 1)
        If arr(yy, 3) = "Итог" Then
            yd = yy
        Else
            If yd > 0 Then
                If dicY.Exists(arr(yy, 2)) Then
                    yo = dicY.Item(arr(yy, 2))
                    
                    For xx = 4 To UBound(arr, 2)
                        If dicX.Exists(arr(yd, xx)) Then
                            xo = dicX.Item(arr(yd, xx))
                            If IsEmpty(arr(yo, xo)) Then
                                arr(yo, xo) = "=R" & yy & "C" & xx
                            Else
                                arr(yo, xo) = arr(yo, xo) & "+R" & yy & "C" & xx
                            End If
                        End If
                    Next
                End If
            End If
        End If
    Next
    
    sh.UsedRange.FormulaR1C1 = arr
End Sub

Private Sub GetDic(arr As Variant, dicY As Object, dicX As Object)
    Set dicY = CreateObject("Scripting.Dictionary")
    Set dicX = CreateObject("Scripting.Dictionary")
            
    Dim yy As Long
    For yy = 1 To UBound(arr, 1)
        If arr(yy, 3) = "Итог" Then Exit For
    Next
    If yy < UBound(arr, 1) Then
        Dim uu As Long
        For uu = yy + 1 To UBound(arr, 1)
            If arr(uu, 3) = "Итог" Then Exit For
        Next
        If uu < UBound(arr, 1) Then
            Dim ii As Long
            Dim xx As Long
            For ii = yy + 1 To uu - 1
                If arr(ii, 2) <> "" Then
                    dicY.Item(arr(ii, 2)) = ii
                    
                    For xx = 4 To UBound(arr, 2)
                        arr(ii, xx) = Empty
                    Next
                End If
            Next
        
            For ii = 4 To UBound(arr, 2)
                If arr(yy, ii) <> "" Then
                    dicX.Item(arr(yy, ii)) = ii
                End If
            Next
        End If
    End If
End Sub

Private Sub ClearArray(arr As Variant)
    Dim xx As Long
    Dim yy As Long
    For yy = 1 To UBound(arr, 1)
        For xx = 1 To UBound(arr, 2)
            If IsError(arr(yy, xx)) Then arr(yy, xx) = Empty
        Next
    Next
End Sub
 
При таких исходных формула не будет компактной, а если будет компактной, то будет летучей
=SUM(SUMIF(OFFSET($D$1:$BV$1;SMALL(IF($B$15:$B$160="Расшифровка";ROW($B$15:B$160)-1);ROW($A$1:INDEX($A:$A;COUNTIF($B:$B;"расшифровка")))););D$1;OFFSET($D1:$BV1;SMALL(IF($B$15:$B$160="Расшифровка";ROW($B$15:B$160));ROW($A$1:INDEX($A:$A;COUNTIF($B:$B;"расшифровка"))));)))
Изменено: БМВ - 06.03.2023 17:13:27
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх