|
还调用ruby有点麻烦了啊原生的就挺好 另外我看根据合并单元格判定好一点 也免得去打颜色了
代码如下- Sub 按钮1_Click()
- Dim r As Range, rF As Range
- Set r = [G1].MergeArea
- Do
- Set rF = r.Offset(0, -1)
- Set rF = Range("F" & r.Row & ":F" & r.End(xlDown).Row - 1) '定位F列有效区域
- rF.Offset(0, 2) = RndFromArr(rF.Value, rF.Count) '获取随机数并写入H列
- Set r = r.End(xlDown) '下一个合并单元格
- If r.Row = 65536 Then Exit Do
- Debug.Print r.MergeArea.Address
- Loop
- End Sub
- '---------通用函数-RndFromArr----原作:洗牌算法--整理:百度不到去谷歌--2014-3-27
- '功能: 从单列二维数组或单元格区域中不重复随机抽取N个数 , 返回抽取的的二维数组(单列)
- '变量 : arr 单列单元格区域/单列二维数组
- ' N 要抽取的个数
- '---------------------------------------------------------------------------------------------------------
- Function RndFromArr(arr, N&)
- Dim M&, rng As Range, r&, i&, t
- ReDim brr(1 To N, 1 To 1) '定义结果数组
- M = UBound(arr) '
- If N > M Then RndFromArr = "Err": Exit Function
- Randomize '随机种子初始化 以保证每次得到不同的随机序列
- For i = 1 To N '遍历提取n个数据
- r = Int(Rnd * (M - i + 1)) + i '从剩余数据中得到随机位置r (注意里面剩余数计算用m 不是n)
- t = arr(r, 1): arr(r, 1) = arr(i, 1): brr(i, 1) = t
- '用临时变量t进行随机位置和当前位置的交换 保证得到随机不重复乱序结果
- Next
- RndFromArr = brr
- End Function
复制代码 |
|