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)
其中:
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。关于您的代码
您想使用不同于 SelectionChange
的 Change
事件
第一个在 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(结构化)table 方法
我经常看到人们试图通过使用VBA
来重新发明轮子。在很多情况下,您不需要编写解决方案代码,因为 Excel 团队已将功能合并到程序本身。
在这种情况下你可以使用Excel Tables
- 将 header 添加到列中(在您的情况下,最后一列缺少 header)
- Select收集信息的范围
- 点击主页 |格式为 table | |确定(确保 table 已选中 header)
- 重命名 table(选择 table 功能区 | Table 设计 | Table 名称
至
- 删除总和列中的值
6。将以下公式添加到 SUM 列的第一个单元格
=SUMIFS(CB!L:L;CB!K:K;[@[Account '#]])
- 回车,看到公式复制到整列
- 现在尝试添加一个新帐户 # 并看到公式已填充到新单元格中
如果有效请告诉我
我是 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)
其中:
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。关于您的代码
您想使用不同于 SelectionChange
Change
事件
第一个在 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(结构化)table 方法
我经常看到人们试图通过使用VBA
来重新发明轮子。在很多情况下,您不需要编写解决方案代码,因为 Excel 团队已将功能合并到程序本身。
在这种情况下你可以使用Excel Tables
- 将 header 添加到列中(在您的情况下,最后一列缺少 header)
- Select收集信息的范围
- 点击主页 |格式为 table | |确定(确保 table 已选中 header)
- 重命名 table(选择 table 功能区 | Table 设计 | Table 名称
至
- 删除总和列中的值
6。将以下公式添加到 SUM 列的第一个单元格
=SUMIFS(CB!L:L;CB!K:K;[@[Account '#]])
- 回车,看到公式复制到整列
- 现在尝试添加一个新帐户 # 并看到公式已填充到新单元格中
如果有效请告诉我