前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA自定义函数:在单元格区域中创建不重复的随机数

VBA自定义函数:在单元格区域中创建不重复的随机数

作者头像
fanjy
发布2024-03-11 11:10:39
2500
发布2024-03-11 11:10:39
举报
文章被收录于专栏:完美Excel

标签:VBA,自定义函数

有时候,我们需要创建一组不重复的随机组,例如在指定单元格区域中创建一组不重复的随机数用于模拟数据分析。

下面的一个VBA自定义函数,可用于创建指定数值范围的不重复随机数。代码如下:

代码语言:javascript
复制
Function   RandomSeq(MinValue, MaxValue)
 Dim Seed As Double              '随机生成的种子数
 Dim NumberOfRandoms As Long     '要选择的随机值数目 (默认为全部)
 Dim TempArray_Source()          '保存最小值到最大值的源列表
 Dim TempArray_Result()          '保存随机选择的结果 (随机排序)
 Dim SrcULimit As Long           '源数组的上限. 用于消除重复
 Dim UsedSourceNo As Long        '从源数组中随机选择. 用于消除重复
 Dim Result_Index As Integer
 Dim i As Integer
 Dim TempValue As Integer
 
 Application.ScreenUpdating = False
 
 Randomize
 Seed = Int(Rnd * 1000000)
 NumberOfRandoms = (MaxValue - MinValue + 1)
 
 If MinValue > MaxValue Then
   MsgBox "范围的下限超过了上限!"
   Exit Function
 End If
 
 If NumberOfRandoms = 0 Then
   MsgBox "没有要求返回任何数值!"
   Exit Function
 End If
 
 If NumberOfRandoms > (MaxValue - MinValue + 1) Then
   MsgBox "要求返回的数字超过给定范围内的可能数量!"
   Exit Function
 End If
 
 ReDim TempArray_Source(MinValue To MaxValue, 1 To 1)
 ReDim TempArray_Result(1 To NumberOfRandoms, 1 To 1)
 
 For i = MinValue To MaxValue
   TempArray_Source(i, 1) = i
 Next i
 
 SrcULimit = UBound(TempArray_Source)
 
 Rnd -Seed '用种子数启动随机数生成器
 
 For Result_Index = LBound(TempArray_Result) To UBound(TempArray_Result)
   TempValue = Int((SrcULimit - MinValue + 1) * Rnd + MinValue)
   TempArray_Result(Result_Index, 1) = TempArray_Source(TempValue, 1)
   UsedSourceNo = TempArray_Source(TempValue, 1)
   TempArray_Source(TempValue, 1) = TempArray_Source(SrcULimit, 1)
   TempArray_Source(SrcULimit, 1) = UsedSourceNo
   SrcULimit = SrcULimit - 1
 Next Result_Index
 
 Application.ScreenUpdating = True
 RandomSeq = TempArray_Result
End Function

要在单元格区域A1:A10000中创建从1至10000之间的不重复随机数,调用RandomSeq函数并实现目标的代码如下:

代码语言:javascript
复制
Sub RandomSeq_Example_Usage()
 Dim TestArray()
 Dim DestRange As Range
 Dim min As Long
 Dim max As Long
 min = 1
 max = 10000
 TestArray = RandomSeq(min, max)
 Set DestRange = Range("A1:A" & (max - min + 1))
 DestRange.Value = TestArray
End Sub

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档