代码之家  ›  专栏  ›  技术社区  ›  ChrisBD

如何在几行中重复函数

  •  1
  • ChrisBD  · 技术社区  · 16 年前

    我承认我不是一个优秀的大师,所以也许这里有人可以帮助我。

    我的工作表上有几个数据块。

    我计算该块D列中所有项目的总和。 在每个块中,我检查C列中单元格的值,如果它包含字母“Y”,并且该行D列中的值等于零,则必须排除D列的总和。

    目前,我是通过将和值乘以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)
    

    必须有更有效的方法来做到这一点。

    理想情况下,我希望编写一个可以粘贴到单元格中的函数,然后选择运行测试的行或单元格。

    有人能指点我正确的方向吗?

    2 回复  |  直到 10 年前
        1
  •  2
  •   Dick Kusleika    16 年前

    我不确定我是否能百分之百地理解这个问题,但这里有一个答案:

    {=NOT(SUM((C23:C25="y")*(D23:D25=0)))*SUM(D23:D25)}
    

    不要输入大括号,而是使用control+shift+enter输入公式,使其成为数组公式。它的作用如下:

    首先,它计算C为“Y”且D为零的所有行。它将返回(在本例中)0、1、2或3。not将把0更改为1,并将其他任何内容更改为0。然后1或0乘以D列的和。

    因此,如果零行同时具有“y”和0,则将总和乘以1。如果超过零行同时具有“y”和0,则将总和乘以0。

        2
  •  1
  •   marg    16 年前

    此功能应工作:

    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 搜索“y;0”的sumif vlookup返回一个错误。

    推荐文章