我正在尝试在VBA中编写以下代码:
=SUMIFS(N2:N29,D2:D29,IF(COUNTIF(D2:D29,A36)=0,"*","="&A36),C2:C29,IF(COUNTIF(C2:C29,B36)=0,"*","="&B36),E2:E29,IF(COUNTIF(E2:E29,C36)=0,"*","="&C36),F2:F29,IF(COUNTIF(F2:F29,D36)=0,"*","="&D36))
有嵌套的If和Countif,因此Sumif会忽略用户不需要的任何条件(用户输入A:B36),但仍会求和满足所有其余条件的单元格。
我已经在VBA中编写了以下内容(以相同的方式确定了条件1-3):
If Application.WorksheetFunction.CountIf(Worksheets("Benchmark").Range("V" & i), Box4.Value) = 0 Then
criteria4 = "*"
Else
criteria4 = "=" & Box4.Value
End If
If criteria1 = "*" And criteria2 = "*" And criteria3 = "*" And criteria4 = "*" Then
dummy = 0
Else
dummy = Application.WorksheetFunction.SumIfs(Worksheets("Benchmark").Range("H" & i), Worksheets("Benchmark").Range("S" & i), criteria1, Worksheets("Benchmark") _
.Range("R" & i), criteria2, Worksheets("Benchmark").Range("C" & i), criteria3, Worksheets("Benchmark").Range("V" & i), criteria4)
sumifs
对所有满足至少一个提供的条件的单元格求和,而不是全部。
要添加上下文,此代码的目的是在范围内循环,并找到符合用户提供条件的单元格。但是,如果用户选择提供某些条件而不提供其他条件,那么将忽略未提供的那些条件。我使用了sumifs,因为我的理解是该函数将对满足所提供条件集的所有单元格求和。然后我可以说,如果sumifs> 0,则单元格满足用户提供的条件。
答案 0 :(得分:0)
以下是根据评论收集到的其他信息合并在一起的版本,完全免除了myColl := 1 to: 20.
[ :job |
myColl
do: [ :e |
job
progress: e / myColl size;
title: 'waiting ' , e asString.
(Delay forSeconds: 0.5) wait ] ] asJob run
:
SumIfs
对于Dim dummy AS Long, IsValid AS Boolean
For i = 2 to LastRow
If Box1.Value & Box2.Value & Box2.Value & Box4.Value = "****" Then
dummy = 0
Else
IsValid = (Worksheets("Benchmark").Cells(i, "S").Value LIKE Box1.Value)
IsValid = IsValid And (Worksheets("Benchmark").Cells(i, "R").Value LIKE Box2.Value)
IsValid = IsValid And (Worksheets("Benchmark").Cells(i, "C").Value LIKE Box3.Value)
IsValid = IsValid And (Worksheets("Benchmark").Cells(i, "V").Value LIKE Box4.Value)
If IsValid Then
dummy = Worksheets("Benchmark").Cells(i, "H").Value
Else
dummy = 0
End If
End If
'Code to do stuff with dummy goes here
Next i
循环的每次迭代,我们使用布尔变量来跟踪行是否有效,并使用For
语句检查每个条件。从第二次开始,使用LIKE
来确保您记得条件是否已经失败。
AND
语句类似于LIKE
语句,但是允许使用通配符-因此,例如=
和"SomeText" = "SomeOtherText"
都将是"SomeText" LIKE "SomeOtherText"
,而False
将是"Some*Text" = "SomeOtherText"
,而False
将是"Some*Text" LIKE "SomeOtherText"
-因为True
的意思是“任何文本都可以在这里”。
({"*"
使用SumIfs
比较而不是LIKE
比较,除非您在条件开头特别指定=
。)