我想在范围“B17:B29”中查找字符串“GAS CYLINDERS”,如果单元格包含给定的字符串,请转到包含字符串的单元格的同一行的“H”列(来自“B”)然后,选择它。我希望它循环到第29行并继续选择合格的单元格并取所有选定单元格的值的总和...最后,将总数粘贴到另一个单元格中(“M22”)
我试过的代码:
ROW_NUMBER = 16
ROW_NUMBER = ROW_NUMBER + 1
PARTICULARS = Sheets("Invoice").Range("B" & ROW_NUMBER)
XXX = InStr(PARTICULARS, "GAS CYLINDER")
For Each XXX In Range("B17: B29")
If MYRNG = Empty And InStr(PARTICULARS, "GAS CYLINDER") > 1 Then
MYRNG = XXX.Address
ElseIf InStr(PARTICULARS, "GAS CYLINDER") > 1 Then
MYRNG = MYRNG & "," & XXX.Address
End If
Next XXX
Range(MYRNG).Select
Selection.Offset(0, 6).Select
图片供参考
PS:我是vba的新手。我尝试在youtube和google上尝试的代码。我修改了一点,因为我最初发现的代码没有得到我预期的结果。
首先,很少需要在VBA中使用Select
。
您想要计算一个数字并将其放入单元格中,因此请简化代码以执行此操作:
Dim XXX As Range
Dim myTotal As Long
For Each XXX In Range("B17: B29")
If InStr(XXX.Value, "GAS CYLINDER") > 0 Then
myTotal = myTotal + XXX.Offset(0, 6).Value
End If
Next XXX
Range("M22").Value = myTotal
或者您可以使用Excel的SumIf
函数:
Range("M22").Value = Application.SumIf(Range("B17:B29", "*GAS CYLINDER*", Range("H17:H29"))
为什么使用代码而不是公式?
在单元格M22中:
=SUMIF(B17:B21, "*Gas Cylinder*", H17:H21)
要比较并显示错误消息,
=IF(SUMIF(B17:B21, "*Gas Cylinder*", H17:H21)<>N22, "ERROR: ...", "")
或者在VBA保存代码中在M22中测试为true:
=SUMIF(B17:B21, "*Gas Cylinder*", H17:H21)<>N22