MICROSOFT

EP07. “Randomly Sort Data 随机排序数据”

首页 Microsoft 工具 Excel · VBA · Loop · EP07
约 5 分钟· #EP07#Excel#Loop
🔒 登录后可标记已读
  • 这篇借用 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

代码说明

  1. 声明 tempString(交换姓名用的临时变量)、tempInteger(交换随机数用的临时变量)、ij(循环计数器)
  2. 第一个循环:用 WorksheetFunction.RandBetween(0, 1000) 给第 1 到第 5 行的 B 列各生成一个 0 到 1000 之间的随机整数,当作这一行的"排序权重"
  3. 第二个双层循环:跟 EP06 的冒泡排序逻辑一模一样,只是比较的对象换成 B 列的随机数(Cells(j, 2).Value < Cells(i, 2).Value
  4. 一旦发现后面的随机数比前面小,就同时交换 A 列(姓名,用 tempString 中转)和 B 列(随机数,用 tempInteger 中转)——两列要"配对交换",姓名跟着它的随机数一起移动,顺序才不会错乱
  5. 排序结果:B 列的随机数变成从小到大排列,A 列的姓名也跟着被打乱到新的顺序,达到"随机排序"的效果

怎么运行

在 A1:A5 输入 5 个姓名,Alt + F11 打开 VBA 编辑器执行代码(或点命令按钮),A 列的姓名顺序会被随机打乱,B 列会留下这次用来排序的随机数。


学完你会

  • ✅ 会用 WorksheetFunction.RandBetween 生成随机数当排序权重
  • ✅ 会在排序时"配对交换"多个相关列,保持数据对应关系不错乱
  • ✅ 理解随机数范围太小可能生成重复值,导致排序结果没有完全打乱

常见错误

  • 只交换了姓名列却忘记同步交换随机数列(或反过来),会导致后续比较逻辑错乱,排序结果不可靠
  • RandBetween(0, 1000) 范围如果太小、行数又多,可能会生成重复的随机数,多笔数据权重相同时排序结果会有部分固定不变,不是每次都完全打乱
  • 每次重新运行这段代码都会重新生成随机数、重新排序一次,如果想保留某一次的随机结果,要记得先把数据复制成数值,避免下次运行又被打乱

Sources

Blog / Website:

  1. Randomly Sort Data