我需要一些帮助来为我的以下问题创建一个循环。
我在 K 列中有一个项目列表,它们的值在 L 列中。
我想要做的是:
对于 K 列中包含“Item1”的每个单元格,获取其值并将找到的所有值相加。
我试图实现这一点,而不必粘贴第 N 列中找到的每个值,然后将它们相加。
下面是我的代码。
Sub Test()
Dim rng As Range, cell As Range
Set rng = Range("K1:K10")
For Each cell In rng
cell.Activate
Val1 = cell.Value
If Val1 = "Item1" Then
Val2 = ActiveCell.Offset(rowOffset:=0, columnOffset:=1).Value
If Sheets("Sheet1").Range("N1") = "" Then
Sheets("Sheet1").Range("N1") = Val2
Else
Sheets("Sheet1").Range("N33").End(xlUp).Offset(1) = Val2
End If
Else
End If
Next cell
Range("N11").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
End sub
答案1
编辑:
我误解了这个问题。以下是修改后的代码,用于纯粹在 VBA 中计算总和,而无需将各个值写入工作表:
Sub Test()
Dim rng As Range, cell As Range
Dim Val1 As Variant
Dim Sum As Double: Sum = 0
Set rng = Range("K1:K10")
For Each cell In rng
Val1 = cell.Value
If Val1 = "Item1" Then
Sum = Sum + cell.Offset(rowOffset:=0, columnOffset:=1).Value
End If
Next cell
Range("N11").Value2 = Sum
End Sub
来自原始答案:
关于 VBA 编程,你需要学习的一个非常重要的黄金法则是切勿使用 Activate 和 ActiveCell。
我已经重构了你的代码来展示如何做到这一点(并演示了更多技巧):
Sub Test()
Dim cell As Range
For Each cell In Range("K1:K10")
Dim Val1 As Variant
Val1 = cell.Value2
If Val1 = "Item1" Then
Dim Val2 As Variant
Val2 = cell.Offset(rowOffset:=0, columnOffset:=1).Value2
If Sheets("Sheet1").Range("N1") = "" Then
Sheets("Sheet1").Range("N1") = Val2
Else
Sheets("Sheet1").Range("N33").End(xlUp).Offset(1) = Val2
End If
End If
Next cell
Range("N11").FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
End Sub
所以这一行:
Val2 = ActiveCell.Offset(rowOffset:=0, ColumnOffset:=1).Value
更改至:
Val2 = cell.Offset(rowOffset:=0, ColumnOffset:=1).Value
或者更好的是:
Val2 = cell.Offset(ColumnOffset:=1).Value2