按行匹配COUNTIF列

时间:2015-10-16 22:10:43

标签: excel vba excel-vba foreach

我正在尝试创建自定义函数来评估某些数据。数据包括从生物体中取出的一些样品(列中)和细菌+它们的大小(成行)。我知道哪些细菌是独特的(仅出现在1个样本中),但我想知道每个样本中有多少独特的细菌。

要知道哪些细菌是唯一的,我在每一行使用=COUNTIF(A:A,">"&0),如果返回1,则它是唯一的。

理想情况下,我正在考虑以下方面:

Function Custom(sampleRange, occurringBacteria) As Integer

Dim bacteriaUniqueToSample as Integer: bacteriaUniqueToSample = 0

For Each sampleRange And occurringBacteria
 If sampleRange > 0 And occurringBacteria = 1
    Then bacteriaUniqueToSample = bacteriaUniqueToSample + 1
Next
Custom = bacteriaUniqueToSample
End Function

当然,这是不可能的。

示例:

enter image description here

2 个答案:

答案 0 :(得分:1)

在单元格B7中输入此内容,然后复制到D7

=COUNTIFS(B$2:B$5,">"&0,$E$2:$E$5,"Unique")

答案 1 :(得分:1)

可以为此编写用户定义函数(又名 UDF )。虽然样本布局在具有函数的单元格与包含 Sample1,Sample2 等标签的单元格之间具有相关性,但为了更加通用,您需要提供更广泛的工作表关系。

Function uniq_bacts_by_sampl(rSample As Range, rOccurringBacteria As Range)
    Dim cnt As Long, rw As Long, rng As Range

    For rw = 1 To rOccurringBacteria.Rows.Count
        Set rng = Application.Index(rOccurringBacteria, rw, 0)
        If Application.CountIf(rng, ">" & 0) = 1 And _
          CBool(Cells(rng.Row, rSample.Column).Value2) Then
            cnt = cnt + 1
        End If
        Set rng = Nothing
    Next rw

    uniq_bacts_by_sampl = cnt
End Function

UDF可以像任何其他本机工作表函数一样使用。

  

语法:
= uniq_bacts_by_sampl(<带有标签条件>的单元格,<数据范围>

Count for columns unique

上述样本图像B7中的公式为

=uniq_bacts_by_sampl(B$1, $B2:$D5)

根据需要填写。