EP07. “Randomly Sort Data 随机排序数据”
🔒 登录后可标记已读- 这篇借用 EP06 冒泡排序的思路,改成给每一行数据配一个随机数,再按随机数排序,达到「打乱顺序」的效果
- 场景是把一份姓名清单随机排序
- 前置知识:EP06 的双层循环排序逻辑和
WorksheetFunction的用法 - 学完能理解「加一列随机数当排序依据」这个实用技巧,也能用在抽签、随机分组这类需求上
重点内容
适用版本
桌面版通用(Excel 365 / 2021 / 2019 等)。
完整 VBA 代码
Dim tempString As String, tempInteger As Integer, i As Integer, j As Integer
For i = 1 To 5
Cells(i, 2).Value = WorksheetFunction.RandBetween(0, 1000)
Next i
For i = 1 To 5
For j = i + 1 To 5
If Cells(j, 2).Value < Cells(i, 2).Value Then
tempString = Cells(i, 1).Value
Cells(i, 1).Value = Cells(j, 1).Value
Cells(j, 1).Value = tempString
tempInteger = Cells(i, 2).Value
Cells(i, 2).Value = Cells(j, 2).Value
Cells(j, 2).Value = tempInteger
End If
Next j
Next i
代码说明
- 声明
tempString(交换姓名用的临时变量)、tempInteger(交换随机数用的临时变量)、i、j(循环计数器) - 第一个循环:用
WorksheetFunction.RandBetween(0, 1000)给第 1 到第 5 行的 B 列各生成一个 0 到 1000 之间的随机整数,当作这一行的"排序权重" - 第二个双层循环:跟 EP06 的冒泡排序逻辑一模一样,只是比较的对象换成 B 列的随机数(
Cells(j, 2).Value < Cells(i, 2).Value) - 一旦发现后面的随机数比前面小,就同时交换 A 列(姓名,用
tempString中转)和 B 列(随机数,用tempInteger中转)——两列要"配对交换",姓名跟着它的随机数一起移动,顺序才不会错乱 - 排序结果:B 列的随机数变成从小到大排列,A 列的姓名也跟着被打乱到新的顺序,达到"随机排序"的效果
怎么运行
在 A1:A5 输入 5 个姓名,Alt + F11 打开 VBA 编辑器执行代码(或点命令按钮),A 列的姓名顺序会被随机打乱,B 列会留下这次用来排序的随机数。
学完你会
- ✅ 会用
WorksheetFunction.RandBetween生成随机数当排序权重 - ✅ 会在排序时"配对交换"多个相关列,保持数据对应关系不错乱
- ✅ 理解随机数范围太小可能生成重复值,导致排序结果没有完全打乱
常见错误
- 只交换了姓名列却忘记同步交换随机数列(或反过来),会导致后续比较逻辑错乱,排序结果不可靠
RandBetween(0, 1000)范围如果太小、行数又多,可能会生成重复的随机数,多笔数据权重相同时排序结果会有部分固定不变,不是每次都完全打乱- 每次重新运行这段代码都会重新生成随机数、重新排序一次,如果想保留某一次的随机结果,要记得先把数据复制成数值,避免下次运行又被打乱
Sources
Blog / Website: