MICROSOFT

EP06. “Find Second Highest Value 找出第二高值”

首页 Microsoft 工具 Excel · VBA · If Then Statement · EP06
约 6 分钟· #EP06#Excel#If Then Statement
🔒 登录后可标记已读
  • 这篇教怎么用 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

代码说明

  1. 声明 rng(要处理的范围)、cell(循环用的单元格)两个 Range 对象,以及 highestValuesecondHighestValue 两个 Double 变量并初始化为 0
  2. Set rng = Selection 把使用者目前选中的范围赋给 rng(对象变量赋值要用 Set,这是跟一般变量赋值不同的地方)
  3. 第一个 For Each 循环遍历范围里每个单元格,只要比目前记录的 highestValue 大就更新它,跑完整个循环后 highestValue 就是范围里的最大值
  4. 第二个 For Each 循环再遍历一次,这次找「比 secondHighestValue 大、但比 highestValue 小」的值——用「小于最大值」这个条件把最大值本身排除掉,找到的就是第二高值
  5. 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:

  1. Find Second Highest Value