EP06. “Find Second Highest Value 找出第二高值”
🔒 登录后可标记已读- 这篇教怎么用 VBA 在选定范围里找出第二高的数值
- 前置知识:
For Each循环和Range对象的基本用法 - 学完能掌握「先找最大值、再排除最大值找次大值」这个常见思路
- 也会认识可以直接调用 Excel 工作表函数的
WorksheetFunction
重点内容
适用版本
桌面版通用(Excel 365 / 2021 / 2019 等)。
完整 VBA 代码
Dim rng As Range, cell As Range
Dim highestValue As Double, secondHighestValue As Double
Set rng = Selection
highestValue = 0
secondHighestValue = 0
'Find Highest Value
For Each cell In rng
If cell.Value > highestValue Then highestValue = cell.Value
Next cell
'Find Second Highest Value
For Each cell In rng
If cell.Value > secondHighestValue And cell.Value < highestValue Then secondHighestValue = cell.Value
Next cell
MsgBox "Second Highest Value is " & secondHighestValue
代码说明
- 声明
rng(要处理的范围)、cell(循环用的单元格)两个Range对象,以及highestValue、secondHighestValue两个Double变量并初始化为 0 Set rng = Selection把使用者目前选中的范围赋给rng(对象变量赋值要用Set,这是跟一般变量赋值不同的地方)- 第一个
For Each循环遍历范围里每个单元格,只要比目前记录的highestValue大就更新它,跑完整个循环后highestValue就是范围里的最大值 - 第二个
For Each循环再遍历一次,这次找「比secondHighestValue大、但比highestValue小」的值——用「小于最大值」这个条件把最大值本身排除掉,找到的就是第二高值 - 用
MsgBox弹窗显示结果
怎么运行
先在工作表上选取要检查的数字范围,再 Alt + F11 打开 VBA 编辑器执行代码(或点绑定好的命令按钮),会弹窗显示第二高值。
替代写法:WorksheetFunction.Large
不自己写循环,也可以直接调用 Excel 内建的 LARGE 工作表函数:
MsgBox "Second Highest Value is " & WorksheetFunction.Large(Range("A1:A11"), 2)
Large 的第二个参数表示要第几大的值,2 是第二高,3 是第三高,以此类推,比自己写循环省事很多。
方法怎么选
| 写法 | 适合场景 | 备注 |
|---|---|---|
双层 For Each 循环 | 想理解找最大/次大值背后的逻辑,或需要在过程中插入其他判断 | 代码较长,但灵活可扩展 |
WorksheetFunction.Large | 只是想快速拿到第几大的值 | 一行搞定,第几大只要改第二个参数 |
学完你会
- ✅ 会用「先找最大值、再排除最大值找次大值」的思路写循环
- ✅ 知道对象变量赋值要用
Set - ✅ 会用
WorksheetFunction.Large一行拿到第几大的值
常见错误
- 忘记用
Set给对象变量(Range)赋值,直接写rng = Selection会报错——对象赋值必须用Set - 如果选中的范围里有重复的最大值(比如两个单元格都是全场最高分),这段代码找出来的"第二高值"其实还是等于最高值,因为逻辑上没有排除"值相同但是不同单元格"的情况,这是这个写法的局限,不是 bug
- 范围里如果有空白单元格,空白会被当成 0 参与比较,如果数据本身有负数,空白单元格可能会误判成"最高"或"次高"
Sources
Blog / Website: