MICROSOFT

EP06. “Sort Numbers 冒泡排序数字”

首页 Microsoft 工具 Excel · VBA · Loop · EP06
约 6 分钟· #EP06#Excel#Loop
🔒 登录后可标记已读
  • 这篇用 VBA 手写一个「冒泡排序」(Bubble Sort)算法,把一列数字从小到大排好
  • 前置知识:双层 For 循环和 If Then 判断
  • 学完能理解排序算法最基础的思路——两两比较、不符合顺序就交换
  • 也会看到 Excel 内建的 Sort 方法,实务上更常用

重点内容


适用版本

桌面版通用(Excel 365 / 2021 / 2019 等)。


完整 VBA 代码(冒泡排序)

Dim i As Integer, j As Integer, temp As Integer, rng As Range

Set rng = Range("A1").CurrentRegion

For i = 1 To rng.Count
    For j = i + 1 To rng.Count

        If rng.Cells(j) < rng.Cells(i) Then

            'swap numbers
            temp = rng.Cells(i)
            rng.Cells(i) = rng.Cells(j)
            rng.Cells(j) = temp

        End If

    Next j
Next i

代码说明

  1. 声明 ij(双层循环计数器)、temp(交换用的临时变量)、rng(要排序的范围)
  2. Range("A1").CurrentRegion 自动抓取 A1 所在的连续数据区域,不用手动写死范围地址,数据有多少行都能自动适应
  3. 外层循环 i 从 1 到 rng.Count(范围内单元格总数),内层循环 ji + 1 开始,让每一对数字只比较一次
  4. If rng.Cells(j) < rng.Cells(i) Then 判断后面的数字是否比前面小,如果是就要交换位置
  5. temp 当中转站完成交换:先把 rng.Cells(i) 存进 temp,再把 rng.Cells(j) 的值写进 rng.Cells(i),最后把 temp(原本 i 的值)写进 rng.Cells(j)——三步缺一不可,直接互相赋值会导致其中一个值被覆盖丢失
  6. 双层循环跑完,整个范围就会是从小到大排好的结果

怎么运行

在 A1 开始的连续区域填入一组数字(比如 9 个数字),Alt + F11 打开 VBA 编辑器执行代码(或点命令按钮),这组数字会被排序成从小到大。

[截图:运行冒泡排序前后 A 列数字的对比,原本乱序的数字变成从小到大排列]


更简单的替代写法:内建 Sort 方法

不用自己写循环,也可以直接调用 Range.Sort

Range("A1:A9").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo

Key1 指定排序依据的列,Order1:=xlAscending 表示升序,Header:=xlNo 表示数据不含标题行。实务上排序数字优先用这个内建方法,自己写冒泡排序主要是用来练习循环逻辑。


方法怎么选

写法适合场景备注
手写冒泡排序想练习循环逻辑,或有自定义的排序规则双层循环,数据量大时效率低(O(n²))
内建 Range.Sort只是想把数据排序一行搞定,实务上优先用这个

学完你会

  • ✅ 会用双层循环 + 临时变量交换,写出冒泡排序
  • ✅ 会用 CurrentRegion 自动抓取连续数据区域
  • ✅ 会用内建 Range.Sort 快速排序,不用自己写循环

常见错误

  • 交换两个值时漏了 temp 这个中转变量,直接写 rng.Cells(i) = rng.Cells(j)rng.Cells(j) = rng.Cells(i),第二步执行时 rng.Cells(i) 已经被第一步覆盖,交换会失败
  • 内层循环写成 For j = 1 To rng.Count 而不是 For j = i + 1 To rng.Count,会让每一对数字被重复比较、多做很多不必要的运算
  • 冒泡排序在数据量很大时效率低(是 O(n²) 算法),如果只是要排序数据,实务上应该优先用内建 Sort 方法,手写循环只适合练习或有特殊排序逻辑需求的场景

Sources

Blog / Website:

  1. Sort Numbers