1、利用一个辅助列比如C3到C12,在C3输入公式:=rand()向下拉到C12
2、然后在B3利用排序函数得到1~10的不重复数字,B3输入公式:=RANK(C3,$C$3:$C$12)
向下拉到B12。
如果你觉得C列碍眼,可以把C列隐藏,也可以先复制B列,再在B列选择性粘贴/数值/确定,就可以把C列删除了。甚至还有一个更简单的办法:把辅助列建在其他工作表,比如在Sheet2的C3(也可以其他单元格,但后面公式要相应更改)输入公式:=rand()向下拉到C12,然后在你的表格Sheet1的B3输入公式:=RANK(Sheet2!C3,Sheet2!$C$3:$C$12)向下拉到B12
第一个随机数,就直接从1到10中抽,即:
B3=INT(RAND()*10)+1
从第二个随机数开始,使用以下的数组公式(按组合键CTRL+SHIFT+ENTER完成输入):
B4=SMALL(IF(ISNA(MATCH(ROW($1:$10),B$3:B3,0)),ROW($1:$10),""),INT(RAND()*(13-ROW()))+1)
将公式向下拉到B12。
这种类似洗牌的,不能用循环产生随机数,然后判断重复再重新取的方法,那样有可能死循环。
下面代码的基本思路就是,将产生的随机数剔除,然后在剩下的数里面取。
Private Function MyFunction13() '无重复随机数
Dim I As Long, Arr() As Long, S As Long
Randomize
ReDim Arr(1 To 10)
For I = 1 To 10 '初始化
Arr(I) = I
Next
For I = 3 To 12 '行范围
S = Int(Rnd() * UBound(Arr) + 1) '产生随机数
Range("B" & I).Value = Arr(S)
Arr(S) = Arr(UBound(Arr)) '将产生的随机数和数组最后一个元素交换
If UBound(Arr) = 1 Then Exit For '如果只有一个元素 退出
ReDim Preserve Arr(1 To UBound(Arr) - 1) '将数组最后一个元素剔除
Next
MsgBox "完成!"
End Function
用VBA做一个随机抽取程序就可以,前几天我帮别人做过一个公司抽奖程序,应该跟你这个差不多