Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5518|回复: 28

[已解决]各位哥哥姐姐帮帮忙,怎么样生成不重复的随机数?

[复制链接]
发表于 2013-10-11 16:27 | 显示全部楼层 |阅读模式
我想实现这样的功能:设置一个命令按钮,点击它时产生随机数,然后将此随机数填入单元格中,且保证填入单元格中的数不重复。
最佳答案
2013-10-11 18:21
qihongju 发表于 2013-10-11 18:07
问题我解决了,还是我指定区域的时候出错了

Sub 生成不重复随机数()  '相当于将指定范围的有序整数随机排列
    Dim i As Long, j As Long
    '指定上限,默认为100,默认的下限是1
    i = Application.InputBox("请输入上限:" & Chr(10) & "输入1000即表示产生1到1000的不重复随机数" & " 以此类推!范围在1--60000之间。" & Chr(10) & "结果产生在新工作表。" & Chr(10) & "如果输入的数超过10000,可能要计算3-5秒,请等候结果显示!", "输入上限", 10, , , , , 1)
    If i = False Or i < 1 Then Exit Sub  '如果选择取消或者数字小于0则退出程序
    Dim arr1, A, B, temp
    ReDim arr1(1 To i)
    For j = 1 To i
        arr1(j) = j
    Next
    For j = 1 To i  '在下限与上限之间循环,将数组Arr1中的数据打乱
        A = Int(Rnd() * i) + 1
        B = Int(Rnd() * i) + 1
        temp = arr1(A)
        arr1(A) = arr1(B)    '
        arr1(B) = temp
    Next
    '将数组的值输出到单元格中
    Dim rngs As Range, rng As Range
    Set rngs = Application.InputBox("选择输出的数据区域", , , , , , , 8)
    j = 0
    For Each rng In rngs
    If j = UBound(arr1) Then Exit Sub
        j = j + 1
        Range(rng.Address) = arr1(j)
    Next
End Sub

增加了可以选择输出区域,那你要少点选的区域小点就行了
发表于 2013-10-11 16:47 | 显示全部楼层
回复

使用道具 举报

发表于 2013-10-11 16:47 | 显示全部楼层
本帖最后由 xdragon 于 2013-10-11 17:18 编辑
  1. Sub 生成不重复随机数()  '相当于将指定范围的有序整数随机排列
  2.     Dim i As Long, j As Long
  3.     '指定上限,默认为100,默认的下限是1
  4.     i = Application.InputBox("请输入上限:" & Chr(10) & "输入1000即表示产生1到1000的不重复随机数" & " 以此类推!范围在1--60000之间。" & Chr(10) & "结果产生在新工作表。" & Chr(10) & "如果输入的数超过10000,可能要计算3-5秒,请等候结果显示!", "输入上限", 10, , , , , 1)
  5.     If i = False Or i < 1 Then Exit Sub  '如果选择取消或者数字小于0则退出程序
  6.     Dim arr1, A, B, temp
  7.     ReDim arr1(1 To i)
  8.     For j = 1 To i
  9.         arr1(j) = j
  10.     Next
  11.     For j = 1 To i  '在下限与上限之间循环,将数组Arr1中的数据打乱
  12.         A = Int(Rnd() * i) + 1
  13.         B = Int(Rnd() * i) + 1
  14.         temp = arr1(A)
  15.         arr1(A) = arr1(B)    '
  16.         arr1(B) = temp
  17.     Next
  18.     Range("a1:a" & i) = Application.Transpose(arr1)    '将数组的值输出到单元格中
  19. End Sub
复制代码
看看这样行不?
回复

使用道具 举报

发表于 2013-10-11 16:53 | 显示全部楼层
xdragon 发表于 2013-10-11 16:47
看看这样行不?

学习学习!
回复

使用道具 举报

发表于 2013-10-11 16:54 | 显示全部楼层
回复

使用道具 举报

发表于 2013-10-11 16:59 | 显示全部楼层
上清宫主 发表于 2013-10-11 16:54
这里好多:http://www.excelpx.com/forum.php?mod=viewthread&tid=98423&extra=&highlight=%B2%BB%D6%D8%B8 ...

字典应该是最简单的、最快捷的方法了
回复

使用道具 举报

 楼主| 发表于 2013-10-11 17:05 | 显示全部楼层
xdragon 发表于 2013-10-11 16:47
看看这样行不?

好的  我试试   谢谢!非常感谢!
回复

使用道具 举报

 楼主| 发表于 2013-10-11 17:05 | 显示全部楼层
sliang28 发表于 2013-10-11 16:47
数的范围是什么啊?

随便指定,比如1----100
回复

使用道具 举报

发表于 2013-10-11 17:06 | 显示全部楼层
字典简单但未必最快。
回复

使用道具 举报

发表于 2013-10-11 17:25 | 显示全部楼层
chin15 发表于 2013-10-11 17:06
字典简单但未必最快。

最快未必最好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-27 06:50 , Processed in 1.320949 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表