在excel中,我需要根据各个列中的值以及一组多列的总和来计算行数。
例如,对于附加的数据图像,我希望能够计算“有效”的行数(=当列A = 1时)超过17年(= B列=> 17),当列C到G的总和等于零时。
我目前正在使用countifs
函数,列C到G的各个条件为零。但是,根据我的实际数据,有比C到G更多的列,因此公式变得太大,它们需要花费很长时间来编写并且非常容易出错。
我尝试使用sumproduct
,但这与长公式有同样的问题。
我试过的公式;
=COUNTIFS($A:$A, 1, $B:$B, ">17", $C:$C, 0, $D:$D,0, $E:$E,0, $F:$F,0, $G:$G,0)
=SUMPRODUCT(($A:$A=1)*($B:$B>17)*($C:$C=0)*($D:$D=0)*($E:$E=0)*($F:$F=0)*($G:$G=0))
我知道我可以使用If
函数创建一个新列,用于CG列(=IF(SUM(C2:G2)=0, 1, 0))
列的总和,然后在{{1}中将其作为条件(新列= 1)包含在内但是我想避免使用这些数据创建新列。
我想countifs
,但=COUNTIFS($A:$A, 1, $B:$B, ">17", C:G, SUM(C:G)=0)
内的总和是不可能的。
非常感谢任何想法?
数据图片:
示例数据:
countifs
答案 0 :(得分:0)
使用VBA custom function
可以轻松完成此操作。 custom function
是一个自编程函数,可以用作Excel单元格中的普通函数。该函数名为countCorrectEntries
,并将Range作为参数。因此,如果您的表格(包括标题)位于A1:G5
目标单元格中的函数=countCorrectEntries(A1:G5)
它的基本功能是什么,它会初始化变量countCorrect=0
,它将计算所有满足所有条件的行。
循环:
For i = 2 To UBound(table, 1)
...
Next i
遍历行并检查如下所示的条件:
If table(i, columnNumber) <> condition Then
conditionsMet = False
End If
它检查行i(迭代器)是否在列中,例如1表示首先不满足某个条件。 E.g值不等于1.如果是这样,则布尔条件问题设置为False
并且不计算为正确。
对于你的总和问题,我提出以下条件:
'Check sum
tempSum = 0
For j = startColumn To EndColumn
tempSum = tempSum + table(i, j)
Next j
If tempSum > 0 Then
conditionsMet = False
End If
循环中的循环遍历startColumn
和endColumn
之间的列,例如3 and 7 for column C to G
,并对tempSum中的值求和。然后检查总和是否大于0,如果是,则再次检查conditionsMet is set to False
。
如果在检查完所有条件后conditionsMet is still True
,则CountCorrect is incremented by 1
。
以下代码适用于您的问题。只需更改正确列的内部循环值,即可完成设置。
干杯!
Function countCorrectEntries(Rng As Range)
Dim table As Variant
table = Rng
countCorrect = 0
For i = 2 To UBound(table, 1)
conditionsMet = True
If table(i, 1) <> 1 Then
conditionsMet = False
End If
If table(i, 2) < 18 Then
conditionsMet = False
End If
'Check sum
tempSum = 0
For j = 3 To 7
tempSum = tempSum + table(i, j)
Next j
If tempSum > 0 Then
conditionsMet = False
End If
If conditionsMet = True Then
countCorrect = countCorrect + 1
End If
Next i
countCorrectEntries = countCorrect
End Function
答案 1 :(得分:0)
您说您对COUNTIFS
公式不满意,但这是一种有效的方式仍然使用COUNTIFS
(比VBA更短/更容易)并维护精度强>
您的示例中的公式为: 的
=COUNTIFS(A:A,1,B:B,">=18",C:C,,D:D,,E:E,,F:F,,G:G,)
强>这可能与您使用的相似,但请注意:
- 如果条件为
"=0"
,则无需在逗号之间指定任何条件。- 如果该功能适用于整个列,则无需指定行号 事实上,即使有其他价值观 在您的数据上方/下方(如标题),它们将被忽略 (除非他们 符合公式中的所有标准,这是不太可能的。)
如果您在根据实际数据调整公式时担心出错,请让Excel通过三个步骤为您完成工作。 (首先保存您的工作簿。)
选择要包含在公式中的每列(或每列中的单元格)。 (要选择多个区域,请单击第一个区域,然后按住 Ctrl ,同时单击其余区域。)
通过突出显示 Ctrl + C 复制下面的行:
?"=COUNTIFS(A:A,1,B:B,"">=18""";:For Each c In Selection.Columns:?","&Columns(c.Column).Address&",";:Next c:?")"
点击 Alt + F11 然后 Ctrl + G < kbd> V 然后输入 (这会立即运行步骤2中的VBA代码。)
公式将显示在下一行。只需复制/粘贴到您想要的位置即可!
示例输出:
=COUNTIFS(A:A,1,B:B,">=18",$C:$C,,$F:$F,,$G:$G,,$P:$P,,$T:$T,,$AJ:$AJ,,$AC:$AC,)
我不确定您为什么要/需要使用INDIRECT
,但只要您保持相同的语法就可以了。一个简化的例子:
我在列A和B中有值。我想计算A = 1和B = 1的行。我的COUNTIFS
公式(D2
)将为:=COUNTIFS(A:A,1,B:B,1)
使用INDIRECT
的原因可能是,例如,我并不总是希望这使用B列 - 我希望能够在不同的单元格中指定要使用的列,也许是D5
。
在D5
我输入文字:B:B
。然后我将公式更改为D2
,将B:B
替换为INDIRECT(D5)
。
由于E2
包含文字B:B
,公式仍然间接引用B:B
,并且公式的结果不会更改。如果我在E2
中指定了不同的列范围,则公式将查看新范围。
重要提示:
使用
SUMIFS
,COUNTIFS
和AVERAGEIFS
,指定的所有范围必须具有相同的行数和列数作为criteria_range1
参数。在此公式中,这意味着它们必须整列。
如果您只是尝试引用其他工作表上的列,只要您使用正确的语法,例如:=COUNTIFS(A:A,1,Sheet1!D:D,1)
来引用{D}上的列D,那就没问题了。 {1}}。
如果工作表的名称包含在单元格中的文本(Sheet1
),但您希望列(D5
)仍然是硬编码的,那么您的D:D
部分公式为:INDIRECT
如果指定的工作表名称中包含 SPACE ,那么您需要在正确的位置用INDIRECT(D5&"!D:D")
个撇号包围该名称:
'
...这是在命名&#34;任何东西&#34;时应该避免空格和其他非字母数字字符的众多原因之一。