Microsoft Lab
全部软件
Excel循环(Loop)约 5 分钟

Randomly Sort Data 随机排序数据

重点内容


适用版本

桌面版通用(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(交换随机数用的临时变量)、i、j(循环计数器)
  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 列会留下这次用来排序的随机数。


学完你会

常见错误

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

Sources

Blog / Website:

  1. Randomly Sort Data
只记在你的浏览器里,换设备不会同步。