如何重复多行功能

时间:2010-04-01 10:17:38

标签: excel excel-vba vba

我承认我不是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)

必须有一种更有效的方法来实现这一目标。

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

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

2 个答案:

答案 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”会返回错误。