计算行组内特定观察的数量

时间:2014-05-26 14:16:36

标签: excel vba

可重复的示例

考虑以下数据:

ID  ID_2    Specie          Area    Tree    DBH      H      Cod
2   111     E_citriodora    432     1       19.098   20 
2   111     E_citriodora    432     2                       1
2   111     E_citriodora    432     3                       1
2   111     E_citriodora    432     4       20.530   17.4   6
...
2   111     E_grandis       557     1                       1
2   111     E_grandis       557     2       24.828   15     6
2   111     E_grandis       557     3                       1
2   111     E_grandis       557     4       14.483   16     5
...
2   111     E_paniculata    704     1                       1
2   111     E_paniculata    704     2       14.164   19.5   
2   111     E_paniculata    704     3                       1
2   111     E_paniculata    704     4       17.507   20 

Here是一个包含208行的完整可重复示例。实际数据有更多的行和种类,其中每个种类的行数并不总是相同。

问题

我想做的是以下内容:

检查列#34; Cod"上的代码6的数量对于每个物种,小于3(最小阈值)且大于Area/100(考虑结果四舍五入为整数)。如果满足其中一个条件,我想显示一个消息框。

  

代码6的计数小于3或大于综合(Area / 100,0)

预期结果

E_citriodora在列#34; Cod"上有四个数字6。代码编号6的正确计数应介于3和=ROUNDUP(432/100,0) = 5之间。所以,3< 4< 5不会触发消息框。

E_grandis对代码6有7个观察值,但在这种情况下,最大阈值为6,因为557/100的面积为5.57,其中向上舍入为6。 3< 7< 6.此结果将触发消息框。

第三个例子,E_paniculata对代码6仅有2个观察值。这小于最小阈值3。 2< 8.此结果还会触发消息框。

每次满足条件时都不需要显示消息框,但只有一条消息表明至少存在一个缺陷。

我尝试了什么

我可以使用公式为每个物种手动完成此操作。例如,关于数据帧的第一个物种:

=IF(OR(COUNTIF(H2:H73,6) < 3,COUNTIF(H2:H73,6) > ROUNDUP(D2/100,0)),"Not Ok", "Ok")

然而,我期望用宏实现这一目标,我的主要困难是在每组物种中设置计数,在这种情况下哪种类型的环最适合。 TKS。

1 个答案:

答案 0 :(得分:1)

假设您的数据始终按照示例文件的方式排序,此代码会将代码6大于3的所有物种打印到您的控制台:

Sub test()

    'Assuming A2 in Sheet 1 contains your first ID
    Dim r As Range
    Set r = ThisWorkbook.Sheets(1).Range("A2")
    if r = "" then exit sub

    Dim specie As String
    specie = ""

    Dim cod6 As Integer

    'Stop at first empty row
    Do While Not r = "" 

        'Next Specie
        If specie <> r.Offset(0, 2) Then
            specie = r.Offset(0, 2)
            cod6 = 0
        End If

        'Count cod
        If r.Offset(0, 7) = 6 Then cod6 = cod6 + 1
        'Check cod at end of specie
        If specie <> r.Offset(1, 2) Then

            'Put your real condition here and make a msgbox
            If cod6 > 3 Then Debug.Print specie & " has cod6 greater than"

        End If

        Set r = r.Offset(1, 0)
    Loop

End Sub