VBA SUMIF на основе переменных - PullRequest
0 голосов
/ 25 января 2020

Я новичок в VBA и пытаюсь понять это, я еще не работал с функциями. Я пытаюсь автоматизировать формулу SUMIF на моем листе VBA. Лист Re c будет содержать динамические формулы c SUMIF, основанные на переменной / диапазоне в столбце D на основе значений столбца B. диапазон SUM будет исходить из листа CB, соответствующего столбца K и столбца суммирования L. Следующий код не возвращает никаких значений для функций SUMIF, нет ошибок для отчета.

Образец данных на рисунке ниже:

https://i.stack.imgur.com/VvDfw.png

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim ws As Worksheet
    Dim NoCol As Integer, NoRow As Integer
    Dim CritRng As Range, SumRng As Range

    Application.ScreenUpdating = False

    Set ws = Worksheets("Rec")

    With ws
        NoRow = .Cells(.Cells.Rows.Count, 3).End(xlUp).Row
        NoCol = .Cells(3, .Cells.Columns.Count).End(xlToLeft).Column
        Set CritRng = Sheets("CB").Range("k:k")
        Set SumRng = Sheets("CB").Range("L:L")
    End With

    For r = 3 To NoRow
        Cells(r, NoCol) = WorksheetFunction.SumIf(CritRng, Cells(r, 1), SumRng)
    Next r

    Application.ScreenUpdating = True

End Sub
```


1 Ответ

0 голосов
/ 31 января 2020

1. Как использовать функцию SUMIF

Я предлагаю всегда использовать функцию SUMIFS, она более гибкая, так как позволяет иметь несколько условий


Согласно документация синтаксис функции SUMIFS:

expression.SumIfs (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15, Arg16, Arg17, Arg18, Arg19, Arg20, Arg21, Arg22, Arg23, Arg24, Arg25, Arg26, Arg27, Arg28, Arg29, Arg30)

Где:

Arg1 - это тип Range и соответствует Sum_range - the range to sum

Arg2 является типом Range и соответствует Criteria_range1, criteria_range2... - One or more ranges in which to evaluate the associated criteria

Arg3 - Arg30 является типом Variant и соответствует Criteria1, criteria2... - One or more criteria in the form of a number, expression, cell reference, or text that define which cells will be added

2 , О вашем коде

Вы хотите использовать событие Change, отличное от SelectionChange

Первое срабатывает при изменении cell или range и второй, когда вы изменяете свой выбор с помощью мыши, клавиатуры или другого кода VBA.

Использование события Change

  1. У вас есть аргумент Target, который относится к ячейке или диапазону, который изменилось на листе
  2. Необходимо ограничить отслеживаемые измененные ячейки определенным диапазоном
  3. Требуется что-то с измененным диапазоном или другими ячейками на листе

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim monitoredRange As Range
    Dim cell As Range

    Dim sumRange As Range
    Dim criteriaRange As Range

    Dim sumOffsetColumn As Long
    Dim sumFirstRow As Long
    Dim sumLastRow As Long

    ' Initialize variables
    sumOffsetColumn = 2 ' How many columns offset from the Target (changed) cell
    sumFirstRow = 4
    sumLastRow = 1000

    Set monitoredRange = Me.Range("B:B") ' Here you can restrict this to a certain row

    ' Check if changed cell/range is not in the monitored range exit the procedure
    If Intersect(Target, monitoredRange) Is Nothing Then Exit Sub

    ' Set the sumifs parameters
    Set sumRange = Sheet1.Range("L" & sumFirstRow & ":L" & sumLastRow) ' Use sheet's codename (Sheet1)
    Set citeriaRange = Sheet1.Range("K" & sumFirstRow & ":K" & sumLastRow) ' Use sheet's codename (Sheet1)

    ' Apply to each cell in target range
    For Each cell In Target.Cells

        ' Check that the cell is not null
        If cell.Value <> vbNullString Then


            ' Set the value to the conditional sum
            cell.Offset(0, sumOffsetColumn).Value = Application.WorksheetFunction.SumIfs(sumRange, citeriaRange, cell.Value)

        End If

    Next cell

End Sub

3. Подход к Excel (структурированным) таблицам

Я часто вижу, что люди пытаются заново изобрести колесо, используя VBA. В большинстве случаев вам не нужно кодировать свои решения, потому что команда Excel включила функциональность в саму программу.

В этом случае вы можете использовать Таблицы Excel

  1. Добавление заголовков к столбцам (в вашем случае в последнем столбце отсутствует заголовок)

Add headers

Выберите диапазон для сбора информации

Select range

Нажмите на главную | Форматировать как таблицу | | ОК (убедитесь, что в таблице есть заголовок, проверенный)

Format as table

Переименование таблицы (с выбранной таблицей Лента | Дизайн таблицы | Имя таблицы

Rename table

К

enter image description here

Удалите значения в столбце суммы

Clear range

6. Добавьте следующую формулу к первой ячейке в столбце SUM

=SUMIFS(CB!L:L;CB!K:K;[@[Account '#]])

Add formula

Нажмите клавишу ввода и увидите, что формула скопирована на весь столбец

Whole column

Теперь попробуйте добавить новую учетную запись # и убедитесь, что формула заполнена новыми ячейками

Дайте мне знать, если она работает

...