VBA 基于变量的 SUMIF

VBA SUMIF based on Variables

我是 VBA 的新手,正在尝试解决这个问题,但我还没有使用过函数。 我正在尝试在 VBA sheet 上自动执行 SUMIF 公式。 Rec sheet 将包含基于 D 列中基于 B 列值的 variable/range 的动态 SUMIF 公式。 SUM 范围将来自 CB sheet,匹配列 K 和求和列 L。 以下代码没有 return 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.如何使用 SUMIF 函数

我建议你总是使用 SUMIFS 函数,它更灵活,因为它允许你有多个条件


根据 documentation 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)

其中:

Arg1Range的类型,对应Sum_range - the range to sum

Arg2Range的类型,对应Criteria_range1, criteria_range2... - One or more ranges in which to evaluate the associated criteria

Arg3 - Arg30Variant的类型,对应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。关于您的代码

您想使用不同于 SelectionChange

Change 事件

第一个在 cellrange 更改时触发,第二个在您使用鼠标、键盘或其他 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(结构化)table 方法

我经常看到人们试图通过使用VBA来重新发明轮子。在很多情况下,您不需要编写解决方案代码,因为 Excel 团队已将功能合并到程序本身。

在这种情况下你可以使用Excel Tables

  1. 将 header 添加到列中(在您的情况下,最后一列缺少 header)

  1. Select收集信息的范围

  1. 点击主页 |格式为 table | |确定(确保 table 已选中 header)

  1. 重命名 table(选择 table 功能区 | Table 设计 | Table 名称

  1. 删除总和列中的值

6。将以下公式添加到 SUM 列的第一个单元格

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

  1. 回车,看到公式复制到整列

  1. 现在尝试添加一个新帐户 # 并看到公式已填充到新单元格中

如果有效请告诉我