You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打乱VBA中Collection对象内的唯一名称项顺序?

打乱VBA Collection中项的顺序

你已经通过代码创建了存储唯一名称的uniqueNames Collection,要实现每次操作前打乱其中项的顺序,可以借助Fisher-Yates洗牌算法来完成——由于VBA的Collection不支持直接调整元素顺序,我们可以先将Collection内容转成数组,洗牌后再重建一个新的Collection。

洗牌函数实现

Function ShuffleCollection(col As Collection) As Collection
    Dim arr() As Variant
    Dim i As Long, j As Long
    Dim temp As Variant
    Dim newCol As New Collection
    
    ' 将Collection内容转换为数组
    ReDim arr(1 To col.Count)
    For i = 1 To col.Count
        arr(i) = col(i)
    Next i
    
    ' 执行Fisher-Yates洗牌
    Randomize ' 初始化随机数生成器,保证每次洗牌结果不同
    For i = UBound(arr) To LBound(arr) + 1 Step -1
        j = Int((i - LBound(arr) + 1) * Rnd + LBound(arr))
        temp = arr(i)
        arr(i) = arr(j)
        arr(j) = temp
    Next i
    
    ' 将洗牌后的数组重新存入Collection(保持唯一键)
    For i = LBound(arr) To UBound(arr)
        newCol.Add arr(i), CStr(arr(i))
    Next i
    
    Set ShuffleCollection = newCol
End Function

使用方法

在需要对uniqueNames进行操作前,调用上述函数重新赋值即可:

' 打乱uniqueNames的顺序
Set uniqueNames = ShuffleCollection(uniqueNames)

' 示例:遍历打乱后的Collection
Dim item As Variant
For Each item In uniqueNames
    Debug.Print item ' 替换为你的实际操作逻辑
Next item

原创建代码的简化优化

你原有的uniqueNames创建代码可以简化——无需判断Count = 0,On Error Resume Next已经能处理首次添加的情况:

Dim ws1 As Worksheet
Dim i As Long
Set ws1 = ThisWorkbook.Worksheets("Sheet1") ' 请替换为你的目标工作表名称
For i = 2 To ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
    If ws1.Cells(i, 3).Value < 20 Then
        On Error Resume Next
        uniqueNames.Add ws1.Cells(i, 2).Value, CStr(ws1.Cells(i, 2).Value)
        On Error GoTo 0
    End If
Next i

内容的提问来源于stack exchange,提问作者Shinaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:30:58