如何统计各工作表行数并在汇总表中自动显示行数统计结果
实现Totals工作表自动统计各State行数的两种方案
方案一:纯公式实现(无需VBA,自动更新)
这种方法无需编写代码,利用Excel内置函数即可同步行数变化:
- 在Totals工作表的A列,按顺序输入所有State的名称(必须和对应独立工作表的名称完全一致,包括空格、大小写)
- 在B列(对应A列的State)输入统计公式:
- 若工作表名称无空格:
=COUNTA(Arizona!A:A)-1 - 若工作表名称含空格:
=COUNTA('New Mexico'!A:A)-1
公式中
-1是扣除表头行,若你的数据没有表头可直接去掉 - 若工作表名称无空格:
- 把公式下拉到所有State对应的行,Excel默认自动计算模式下,只要对应State工作表新增数据,Totals表的数值会自动刷新。
方案二:VBA实现(适配现有流程或自动触发)
如果需要和你现有的数据复制模块联动,或者通过工作表事件自动触发更新,可采用以下代码:
1. 同步现有复制模块的更新代码
在你现有的「将All States数据复制到对应工作表」的模块末尾,添加以下子过程并调用,每次复制完成后自动更新Totals:
Sub UpdateTotals() Dim wsTotals As Worksheet Dim wsState As Worksheet Dim targetRow As Long Dim dataRowCount As Long ' 指向Totals工作表 Set wsTotals = ThisWorkbook.Worksheets("Totals") ' 清空旧统计数据(保留表头) wsTotals.Range("B2:B" & wsTotals.Cells(Rows.Count, 1).End(xlUp).Row).ClearContents ' 遍历所有工作表 For Each wsState In ThisWorkbook.Worksheets ' 跳过All States和Totals本身 If wsState.Name <> "All States" And wsState.Name <> "Totals" Then ' 在Totals表中找到对应State的行 On Error Resume Next targetRow = wsTotals.Range("A:A").Find(wsState.Name, LookIn:=xlValues, LookAt:=xlWhole).Row On Error GoTo 0 If targetRow > 0 Then ' 获取该State工作表的实际数据行数(扣除表头) dataRowCount = wsState.Cells(Rows.Count, 1).End(xlUp).Row - 1 ' 写入统计值 wsTotals.Cells(targetRow, 2).Value = dataRowCount End If End If Next wsState End Sub
调用方式:在你现有复制数据的Sub最后添加一行UpdateTotals即可。
2. 工作表事件自动触发更新
如果希望All States工作表新增行时立即自动更新Totals,可给All States工作表添加事件监听:
- 右键点击「All States」工作表标签 → 选择「查看代码」
- 在弹出的代码窗口中粘贴以下代码:
Private Sub Worksheet_Change(ByVal Target As Range) ' 只要工作表有内容变更(含新增行),就触发统计更新 UpdateTotals End Sub
注意:
UpdateTotals子过程必须放在标准模块中(即通过「插入→模块」创建的模块),不能放在工作表模块里。
关于你之前的问题说明
你之前用Sheet.Rows.Count未成功,是因为Rows.Count返回的是Excel工作表的总行数(比如1048576),而非实际有数据的最后一行。正确获取实际数据行数的写法是wsState.Cells(Rows.Count, 1).End(xlUp).Row,它会从列底向上找到第一个非空单元格的行号。
内容的提问来源于stack exchange,提问作者Curtis Martin
相关产品推荐
相关产品推荐

