总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
1 实现功能
继续上一期功能需求【Excel VBA编程】按区间统计数据:区间也能“自定义”,你的区间范围你来定
本次我们将优化列指定方式:不再于代码中硬编码B列与D列,而是改为在程序运行时通过界面动态选择,且允许这两列位于不同的工作表
即程序运行时,通过界面引导选择“待统计列”,如选择Sheet6中的B列

接着选择“区间汇总列”,如Sheet7中的C列

最终输出统计结果到Sheet7中的D列,与上述选择的“区间汇总列”并排显示,代码自动识别输出位置

2 代码及说明
2.1 操作步骤
打开Excel工作簿,另存为.xlsm
按下 Alt + F11 快捷键,打开VBA编辑器
将文中代码粘贴到新打开的模块代码窗口中
回到Excel工作表界面,顺次选择【开发工具】【宏】,选择宏名“CountDataByInterval”执行
2.2 代码实现
在上一期代码的基础上完成重构,将原有的静态数据处理流程,改造为一个动态、灵活且友好的自动化工具,具体分为三个步骤:
第一步:将B列和D列数据输入改为通过Application.InputBox自由选择
第二步,检查数据处理逻辑,确保关联影响同步更新。当源数据发生变动时,确保“字典创建”与“数据计算”这两个关键功能的输入源保持同步
第三步,最终统计结果的呈现也需要是动态的,能够随着区间列所在位置信息自动刷新
本次更新基于上一期代码进行。为方便大家对比查看,旧代码以注释形式保留,新增代码则与其并行展示,代码参考如下:
Sub CountDataByInterval()Dim ws As Worksheet'Dim lastRowB As Long, lastRowD As Long'Dim 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'---------------------------------------Dim rngData As Range, rngInterval As RangeDim cell As Range'----------------------------------------' 设置要操作的工作表,这里使用活动工作表'Set ws = ActiveSheet'-----------------------------------------------' 通过界面选择待统计的数据列On Error Resume Next ' 防止用户取消选择Set rngData = Application.InputBox( _Prompt:="请选择包含待统计数据的列", _Title:="选择数据列", _Type:=8) ' Type:=8 表示选择单元格区域On Error GoTo 0If rngData Is Nothing ThenMsgBox "未选择数据区域,操作已取消。", vbExclamationExit SubEnd If' 通过界面选择区间定义的列 ---On Error Resume NextSet rngInterval = Application.InputBox( _Prompt:="请选择包含区间定义的列", _Title:="选择区间定义列", _Type:=8)On Error GoTo 0If rngInterval Is Nothing ThenMsgBox "未选择区间定义区域,操作已取消。", vbExclamationExit SubEnd If'----------------------------------------------------------' 创建字典对象用于存储每个区间及其对应的计数Set intervalDict = CreateObject("Scripting.Dictionary")' 获取B列和D列的最后一行数据行号'lastRowB = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row'lastRowD = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row'初始化区间字典。遍历D列,将每个区间字符串作为键,计数值初始化为0'For i = 2 To lastRowDFor Each cell In rngInterval.Cells'去掉表头If cell.Row > rngInterval.Row Then'intervalStr = Trim(ws.Cells(i, "D").Value)intervalStr = Trim(cell.Value)If intervalStr <> "" Then' 确保每个唯一的区间只在字典中出现一次If Not intervalDict.exists(intervalStr) ThenintervalDict.Add intervalStr, 0End IfEnd IfEnd If'Next iNext cell' 遍历B列数据,进行区间判断和计数'For i = 2 To lastRowBFor Each cell In rngData.Cells'If IsNumeric(ws.Cells(i, "B").Value) And ws.Cells(i, "B").Value <> "" ThenIf IsNumeric(cell.Value) And cell.Value <> "" Then'dataValue = ws.Cells(i, "B").ValuedataValue = cell.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 If'Next iNext cell' 将统计结果输出' 先清空可能存在的旧结果(从第1行开始)'ws.Columns("E").ClearContentsrngInterval.Cells(1, 1).Offset(0, 1).ClearContentsoutputRow = 1 ' 从E列的第1行开始输出' 写入表头'ws.Cells(outputRow, "E").Value = "数量"rngInterval.Cells(1, 1).Offset(0, 1).Value = "数量"outputRow = outputRow + 1' 遍历字典,将每个区间对应计数写入工作表For Each key In intervalDict.Keys'ws.Cells(outputRow, "E").Value = intervalDict(key) ' 数量写入E列rngInterval.Cells(outputRow, 1).Offset(0, 1) = intervalDict(key)outputRow = outputRow + 1Next keyMsgBox "区间统计已完成!", vbInformation, "完成"' 清理对象Set intervalDict = NothingSet ws = NothingEnd Sub
3 结尾
好了,今天的编程知识到此结束了。最后分享一个冷知识:没有一种屏幕技术是绝对护眼的
OLED屏幕能过滤有害短波蓝光,但会高频闪烁,虽然肉眼难以察觉,也会对眼睛造成疲劳和伤害
LCD屏幕没有频闪问题,但会发出较多的有害蓝光
因此,建议大家不要长时间盯着显示器,持续1小时后,应休息5-10分钟
本公众号一直在不间断地分享免费的编程案例和实用技巧。无论您是用来提升自动化办公效率还是想提升自我,请关注我的公众号,解锁更多的编程知识