【Excel VBA编程】按区间统计数据:区间也能“自定义”,你的区间范围你来定
- 2026-11-10 13:03:45
总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
1 实现功能
如下图所示表格中,A列记录了各个部门的名称,B列则记录了每个部门对应的实际员工人数

现需要根据预设的“区间”(如下图D列所示),统计出每个“区间”分别包含了多少个部门,并将最终的统计数量填写到E列

另外,关于D列“区间”,可以根据需要自由设置区间范围,只要遵循“数字下限 + 分隔符 + 数字上限”的格式(例如“0~39”),代码就能自动识别这些区间,并完成相应的计算。如下图所示,

2 代码及说明
2.1 操作步骤
打开Excel工作簿,另存为.xlsm
按下 Alt + F11 快捷键,打开VBA编辑器
在VBA编辑器左侧的“工程资源管理器”窗口中,右键点击你的工作簿名称,选择“插入” -> “模块” 将文中代码粘贴到新打开的模块代码窗口中
回到Excel工作表界面,顺次选择【开发工具】【插入】【表单控件】,添加1个按钮并指定宏名“CountDataByIntervalToColumnE”,方便代码执行
2.2 代码实现
整体思路:读取D列的区间定义,统计B列数据落在各区间内的数量,并将统计结果(包括区间名称和对应数量)输出到E列
核心技术:使用Dictionary对象来管理区间和计数,无论D列中有多少个不同的区间(例如0~39, 40~59, 60~79等),都能自动识别并为其创建计数器,无需预先知道区间的数量和具体内容
参考代码如下:
Sub CountDataByIntervalToColumnE()Dim ws As WorksheetDim lastRowB As Long, lastRowD As LongDim i As Long, j As LongDim dataValue As DoubleDim intervalStr As StringDim lowerBound As Double, upperBound As DoubleDim intervalDict As ObjectDim outputRow As LongDim key As Variant' 设置要操作的工作表,这里使用活动工作表Set ws = ActiveSheet' 创建字典对象用于存储每个区间及其对应的计数Set intervalDict = CreateObject("Scripting.Dictionary")' 获取B列和D列的最后一行数据行号lastRowB = ws.Cells(ws.Rows.Count, "B").End(xlUp).RowlastRowD = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row'初始化区间字典。遍历D列,将每个区间字符串作为键,计数值初始化为0For i = 2 To lastRowDintervalStr = Trim(ws.Cells(i, "D").Value)If intervalStr <> "" Then' 确保每个唯一的区间只在字典中出现一次If Not intervalDict.exists(intervalStr) ThenintervalDict.Add intervalStr, 0End IfEnd IfNext i' 遍历B列数据,进行区间判断和计数For i = 2 To lastRowBIf IsNumeric(ws.Cells(i, "B").Value) And ws.Cells(i, "B").Value <> "" ThendataValue = ws.Cells(i, "B").Value' 遍历字典中的所有区间键,判断数据值属于哪个区间For Each key In intervalDict.KeysintervalStr = CStr(key)' 解析区间字符串,例如将 "0~39" 分解为下限和上限,分隔符波浪号"~"Dim splitArr() As StringsplitArr = Split(intervalStr, "~")If UBound(splitArr) >= 1 ThenlowerBound = Val(Trim(splitArr(0)))upperBound = Val(Trim(splitArr(1)))' 判断数据是否在区间内(包含边界)If dataValue >= lowerBound And dataValue <= upperBound ThenintervalDict(key) = intervalDict(key) + 1Exit For ' 找到一个匹配区间后立刻跳出内层循环End IfEnd IfNext keyEnd IfNext i' 将统计结果输出到E列' 先清空E列可能存在的旧结果(从第1行开始)ws.Columns("E").ClearContentsoutputRow = 1 ' 从E列的第1行开始输出' 写入表头ws.Cells(outputRow, "E").Value = "数量"outputRow = outputRow + 1' 遍历字典,将每个区间对应计数写入工作表For Each key In intervalDict.Keysws.Cells(outputRow, "E").Value = intervalDict(key) ' 数量写入E列outputRow = outputRow + 1Next keyMsgBox "区间统计已完成!", vbInformation, "完成"' 清理对象Set intervalDict = NothingSet ws = NothingEnd Sub
3 结尾
好了,今天的编程知识到此结束了。最后分享一个冷知识:磁盘碎片
磁盘碎片,更准确地应称为文件碎片,它是指一个文件被分散存储在整个硬盘的不同物理位置上。这主要是由于长期对硬盘进行文件的写入、删除和修改操作造成的。另外,下载大文件或系统频繁使用虚拟内存时,也会产生大量碎片
本公众号一直在不间断地分享免费的编程案例和实用技巧。无论您是用来提升自动化办公效率还是想提升自我,请关注我的公众号,解锁更多的编程知识