Excel VBA - цикл if с динамическим диапазоном фильтров - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующая таблица:

Filter   Notional  Type   Total
A          5000    A      _____
B          1000    A
           2500    B
           3600    C
           7500    C
           8000    B
           4500    C
           700     C

И следующий код для вычисления отфильтрованной суммы условных значений:

    Sub filtersum()

    Dim filterA, filterB as Variant
        filterA = Cells (2, 1)
        filterB = Cells (3, 1)

    Dim i, n as Integer
        k = Cells.Find("Type").Offset(1, 0).Row
        n = Cells.Find("Type").End(xlDown).Row

    Dim sum as Double
        sum = 0

    For i = k To n
    If Cells(i, 3) = filterA Or Cells(i, 3) = filterB Then
        j = Cells(i, 3)
           sum = j + sum 
        End If
    Next i 

    Cells.(2, 4).Value = sum    'Result under "Total"

    End Sub

Итак, что я сейчас делаювычисление суммы всех условных значений, которые являются типом "A" или "B".Но для окончательного применения этого недостаточно, потому что теперь я определяю каждый критерий фильтра в коде (fiterA, filterB).Пользователь должен иметь возможность добавлять критерии фильтрации в таблицу, например:

Filter   Notional  Type   Total
A          5000    A      _____
B          1000    A
C          2500    B
           3600    C
           7500    C
           8000    B
           4500    C
           700     C

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

Надеюсь, у вас есть идеи, чтобы решить мою проблему, спасибо!

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Таким образом, вместо «жесткого кодирования» каждой ячейки фильтра в операторе IF я перебираю столбец фильтра.

Для каждого g (значение фильтра в диапазоне «Filter») будет проверятьсякаждая строка, если критерий находится в столбце «Тип» (столбец C).Если совпадение найдено, оно будет суммироваться.Когда один критерий фильтрации будет выполнен (g), он перейдет к следующей строке в столбце «Фильтр».

Sub filtersum()

Dim filterA As Variant, filterB As Variant
    filterA = Cells(2, 1)
    filterB = Cells(3, 1)

Dim k As Long, n As Long, h As Long
    k = Cells.Find("Type").Offset(1, 0).Row
    n = Cells.Find("Type").End(xlDown).Row
    h = Cells.Find("Filter").End(xlDown).Row 'last row for column A, searching for "Filter"

Dim sum As Double
    sum = 0 'Sum variable


Dim g As Long, i As Long, j As Long
Dim filterCriteria As Variant 'Define your criteria it should look up


For g = k To h 'Look up for Filter column, from the same start cell as "Type" column to the same end cell as "Type". Then loop through all criterias.
    filterCriteria = Cells(g, 1).Value 'Get current criteria value
    For i = k To n 'Loop through column Type
        If Cells(i, 3) = filterCriteria Then 'If Type = filter criteria, then sum.
            j = Cells(i, 2) 'I think you have an typo in your example here, since sum should be done on column B, not column C.
            sum = j + sum 'Sum the values.
        End If
    Next i 'take next value in column C, "Type" column
Next g 'take next value in column A, "Filter" column
Cells(2, 4).Value = sum    'Result under "Total"
End Sub
0 голосов
/ 25 октября 2018

Вы можете использовать метод AutoFilter() с xlFilterValues в качестве значения параметра Operator и функцией WorksheetFunction.Subtotal() для суммирования отфильтрованных ячеек следующим образом

Option Explicit

Sub filtersum()

    Dim filters As Variant
    filters = Application.Transpose(Range("A2", Cells(Rows.Count, 1).End(xlUp)).Value)

    With Range("B1", Cells(Rows.Count, 3).End(xlUp))
        .AutoFilter Field:=2, Criteria1:=filters, Operator:=xlFilterValues
        Range("D2").Value = Application.WorksheetFunction.Subtotal(9, .Columns(1))
    End With
    ActiveSheet.AutoFilterMode = False

End Sub
0 голосов
/ 25 октября 2018

Я бы использовал sumifs.Затем я бы расширил формулу по мере необходимости.Это формула для ячейки D2 enter image description here

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