|
楼主 |
发表于 2015-3-16 14:30
|
显示全部楼层
本帖最后由 张雄友 于 2015-3-16 15:19 编辑
香川群子 发表于 2015-3-15 20:27
1. 选择单列范围执行宏,即可得到单列的随机乱序结果。
2. 如果需要同时对多列,或多行内容进行各自分 ...
2. 如果需要同时对多列,或多行内容进行各自......
Sub 按列测试() '忽略空值未有反应过来!!有点难度!
arr = [A1:G12] '读取A1:G12数据为二维数组arr
brr = getRndarr(arr, 1, UBound(arr, 2), UBound(arr, 2), -1) '将此二维数组arr按列进行随机乱序得到数组brr
[J1:P12] = brr '输出随机乱序后的数组brr 其中每一列中的行还保持原来的顺序不变
End Sub
Function getRndarr(trr, a, b, n, Optional k = 0)
'参数1: trr为待随机乱序数组
'参数2-3: a、b为待随机乱序数组的起始、结束位置
'参数4: 需要随机抽取的元素个数n
'参数5: 描述数组状态k: k=0为一维数组、k=1为二维数组按行乱序、k=-1为二维数组按列乱序
Randomize '随机种子初始化
If k < 0 Then l = LBound(trr, 2) Else l = LBound(trr) '获取数组最小下标l
For i = l To n + l - 1 '多行多列数组正序洗牌
r = Int(Rnd * (b - a + 1 - (i - l))) + a + (i - l) '获得不重复随机位置r
If k = 0 Then
t = trr(r): trr(r) = trr(i + a - l): trr(i) = t '一维数組正序洗牌
ElseIf k = 1 Then
For j = LBound(trr, 2) To UBound(trr, 2)
t = trr(r, j): trr(r, j) = trr(i + a - l, j): trr(i, j) = t '二维数组按行洗牌 各列移动但列顺序不变
Next
ElseIf k = -1 Then
For j = LBound(trr) To UBound(trr)
t = trr(j, r): trr(j, r) = trr(j, i + a - l): trr(j, i) = t '二维数组按列洗牌 各行移动但行顺序不变
Next
End If
Next
getRndarr = trr '随机乱序结果输出为和原数组一样大小的数组
End Function
|
|