如何在Excel中按EventNum自动统计雌雄动物各行为的出现次数?
三种自动化统计方案(针对5万+行相机陷阱数据)
已经帮你整理了三种无需手动统计的方法,按需选就行:
方案1:Excel动态数组公式(零代码,适合Excel 365/2021+)
- 提取唯一EventNum:在Sheet2的A2单元格输入
=UNIQUE(Sheet1!B:B),自动生成所有不重复的事件编号。 - 统计行为次数:
- 若行为是
TRUE/FALSE标记(TRUE表示出现),比如统计雄性行为1的次数,在Sheet2的B2输入:=COUNTIFS(Sheet1!B:B,A2,Sheet1!C:C,TRUE) - 若行为是文本(比如“觅食”),则把条件改成对应的文本:
=COUNTIFS(Sheet1!B:B,A2,Sheet1!C:C,"觅食")
- 若行为是
- 横向/下拉拖动公式,覆盖所有11种雌雄行为列,自动完成全量统计。
方案2:Power Query(高效处理大数据,一键刷新)
适合5万+行的大数据集,速度比公式快,数据更新后右键就能刷新结果:
- 选中Sheet1的原始数据区域,点击「数据」→「从表格/区域」(确认数据有表头)。
- 在Power Query编辑器中,点击「转换」→「分组依据」:
- 分组列选
EventNum - 点击「添加分组」,给每个雄性/雌性行为单独设置统计项:
操作选「计数行」,自定义列名(比如“雄性行为1次数”),然后设置条件为[雄性行为1列名] = TRUE(文本行为就等于对应文本)
- 分组列选
- 所有统计项添加完后,点击「关闭并上载」,选择上载到Sheet2即可。
方案3:VBA宏(一键批量生成,适合重复执行)
- 按
Alt+F11打开VBA编辑器,插入新模块,粘贴以下代码:
Sub 统计动物行为次数() Dim 源表 As Worksheet, 目标表 As Worksheet Dim 最后行 As Long, i As Long, j As Long Dim 事件字典 As Object, 事件编号 As Variant Dim 雄性行为列 As Variant, 雌性行为列 As Variant Dim 列名 As String ' 指定工作表(按实际修改表名) Set 源表 = ThisWorkbook.Sheets("Sheet1") Set 目标表 = ThisWorkbook.Sheets("Sheet2") Set 事件字典 = CreateObject("Scripting.Dictionary") ' 替换成你实际的11种雌雄行为列名 雄性行为列 = Array("雄性行为1", "雄性行为2", "雄性行为3") 雌性行为列 = Array("雌性行为1", "雌性行为2", "雌性行为3") ' 清空目标表旧数据(保留表头) 目标表.Range("A2:Z" & 目标表.Cells(目标表.Rows.Count, "A").End(xlUp).Row).ClearContents ' 遍历源数据统计次数 最后行 = 源表.Cells(源表.Rows.Count, "B").End(xlUp).Row For i = 2 To 最后行 事件编号 = 源表.Cells(i, "B").Value If Not 事件字典.Exists(事件编号) Then ReDim 统计数组(0 To UBound(雄性行为列) + UBound(雌性行为列) + 1) 统计数组(0) = 事件编号 事件字典(事件编号) = 统计数组 End If ' 统计雄性行为 For j = 0 To UBound(雄性行为列) 列名 = 雄性行为列(j) If 源表.Cells(i, 列名).Value = True Then ' 文本行为改成 = "行为名称" 事件字典(事件编号)(j + 1) = 事件字典(事件编号)(j + 1) + 1 End If Next j ' 统计雌性行为 For j = 0 To UBound(雌性行为列) 列名 = 雌性行为列(j) If 源表.Cells(i, 列名).Value = True Then 事件字典(事件编号)(j + UBound(雄性行为列) + 2) = 事件字典(事件编号)(j + UBound(雄性行为列) + 2) + 1 End If Next j Next i ' 写入目标表表头 目标表.Cells(1, "A").Value = "EventNum" For j = 0 To UBound(雄性行为列) 目标表.Cells(1, j + 2).Value = 雄性行为列(j) Next j For j = 0 To UBound(雌性行为列) 目标表.Cells(1, j + UBound(雄性行为列) + 3).Value = 雌性行为列(j) Next j ' 写入统计结果 i = 2 For Each 事件编号 In 事件字典.Keys 目标表.Cells(i, "A").Resize(1, UBound(事件字典(事件编号)) + 1).Value = 事件字典(事件编号) i = i + 1 Next 事件编号 MsgBox "统计完成!" End Sub
- 修改代码里的
雄性行为列和雌性行为列数组,换成你实际的11种行为列名。 - 按
F5运行代码,Sheet2会自动生成所有EventNum的行为统计结果。
内容的提问来源于stack exchange,提问作者Ellka
相关产品推荐
相关产品推荐

