根据各列计算行数,以及多列的总和

时间:2018-03-30 07:09:39

标签: excel

在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)内的总和是不可能的。

非常感谢任何想法?

数据图片:

Data

示例数据:

countifs

2 个答案:

答案 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

循环中的循环遍历startColumnendColumn之间的列,例如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为您编写公式!

如果您在根据实际数据调整公式时担心出错,请让Excel通过三个步骤为您完成工作。 (首先保存您的工作簿。)

  1. 选择要包含在公式中的每列(或每列中的单元格)。 (要选择多个区域,请单击第一个区域,然后按住 Ctrl ,同时单击其余区域。)

  2. 通过突出显示 Ctrl + C 复制下面的行

    ?"=COUNTIFS(A:A,1,B:B,"">=18""";:For Each c In Selection.Columns:?","&Columns(c.Column).Address&",";:Next c:?")"
    
  3. 点击 Alt + F11 然后 Ctrl + G < kbd> V 然后输入 (这会立即运行步骤2中的VBA代码。)

  4. 公式将显示在下一行。只需复制/粘贴到您想要的位置即可!

    示例输出:
    =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)

    img

    使用INDIRECT的原因可能是,例如,我并不总是希望这使用B列 - 我希望能够在不同的单元格中指定要使用的列,也许是D5

    D5我输入文字:B:B。然后我将公式更改为D2,将B:B替换为INDIRECT(D5)

    img

    由于E2包含文字B:B,公式仍然间接引用B:B,并且公式的结果不会更改。如果我在E2中指定了不同的列范围,则公式将查看新范围。

      

    重要提示:

         

    使用SUMIFSCOUNTIFSAVERAGEIFS,指定所有范围必须具有相同的行数和列数作为 criteria_range1 参数。

         

    在此公式中,这意味着它们必须整列

    如果您只是尝试引用其他工作表上的列,只要您使用正确的语法,例如:=COUNTIFS(A:A,1,Sheet1!D:D,1)来引用{D}上的列D,那就没问题了。 {1}}。

    如果工作表的名称包含在单元格中的文本(Sheet1),但您希望列(D5)仍然是硬编码的,那么您的D:D部分公式为:INDIRECT

    img

    如果指定的工作表名称中包含 SPACE ,那么您需要在正确的位置用INDIRECT(D5&"!D:D")个撇号包围该名称:

    '

    ...这是在命名&#34;任何东西&#34;时应该避免空格和其他非字母数字字符的众多原因之一。