满足所有条件的VBA中的汇总

时间:2018-11-19 12:38:11

标签: excel vba sumifs

我正在尝试在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,则单元格满足用户提供的条件。

1 个答案:

答案 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比较,除非您在条件开头特别指定=。)