我承认我不是Excel大师,所以也许这里有人可以帮助我。
在我的工作表上,我有几个数据块。
我计算该块D列中所有项目的总和。 在每个块中,我检查C列中单元格的值,如果它包含字母“y”,并且该行D列中的值等于零,则必须排除列D的总和。
目前我这样做是将sum值乘以1或0,这是通过对单元格内容运行测试而产生的。
下面是我用来测试第23行到第25行包含D列数据的示例。我也在E列和G列上执行相同操作,但“y”字符始终在C列中,因此绝对列参考。
=IF(AND($C23="y",D23=0),0,1)*IF(AND($C24="y",D24=0),0,1)*IF(AND($C25="y",D25=0),0,1)
必须有一种更有效的方法来实现这一目标。
理想情况下,我想编写一个可以粘贴到单元格中的函数,然后选择运行测试的行或单元格。
有人能指出我正确的方向吗?
答案 0 :(得分:2)
我不确定我是否100%理解这个问题,但无论如何这里都是答案:
{=NOT(SUM((C23:C25="y")*(D23:D25=0)))*SUM(D23:D25)}
不要输入花括号,而是使用Control + Shift + Enter输入公式,使其成为数组公式。这是它的作用:
首先,它计算C为'y'且D为零的所有行。这将返回(在此示例中)0,1,2或3.NOR将零更改为1并将其他任何内容更改为零。然后将一个或零乘以列D的总和。
因此,如果零行同时具有'y'和0,则将SUM乘以1.如果多于零的行同时具有'y'和0,则将SUM乘以0.
答案 1 :(得分:1)
此功能应该有效:
Option Explicit
Public Function getMySum(src As Range, sumColumn As Integer)
Dim iRow As Range
Dim yColumn As Integer
yColumn = 1
getMySum = 0
For Each iRow In src.Rows
If (Strings.StrConv(iRow.Cells(1, yColumn), vbLowerCase) <> "y") Or (iRow.Cells(1, sumColumn) <> 0) Then
getMySum = getMySum + iRow.Cells(1, sumColumn)
Else
getMySum = 0
Exit For
End If
Next iRow
End Function
您需要将此代码添加到VBA 模块
您的示例的函数调用将是:=getMySum("C:23:D25", 2)
我看到的唯一其他选项是将c和d中的值组合为=C23&";"&D23
和sumif VLOOKUP,搜索“y; 0”会返回错误。