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
- У вас есть аргумент Target, который относится к ячейке или диапазону, который изменилось на листе
- Необходимо ограничить отслеживаемые измененные ячейки определенным диапазоном
- Требуется что-то с измененным диапазоном или другими ячейками на листе
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
- Добавление заголовков к столбцам (в вашем случае в последнем столбце отсутствует заголовок)
Выберите диапазон для сбора информации
Нажмите на главную | Форматировать как таблицу | | ОК (убедитесь, что в таблице есть заголовок, проверенный)
Переименование таблицы (с выбранной таблицей Лента | Дизайн таблицы | Имя таблицы
К
Удалите значения в столбце суммы
6. Добавьте следующую формулу к первой ячейке в столбце SUM
=SUMIFS(CB!L:L;CB!K:K;[@[Account '#]])
Нажмите клавишу ввода и увидите, что формула скопирована на весь столбец
Теперь попробуйте добавить новую учетную запись # и убедитесь, что формула заполнена новыми ячейками
Дайте мне знать, если она работает