Excel VBA=RANDBETWEEN

Excel VBA=RANDBETWEEN,excel,random,vba,Excel,Random,Vba,我希望你能帮我找出我自己做不到的事情。我是一名拥有大量数据集的审计员,希望为自己和与我一起工作的每个人更容易地采集样本 我正在尝试使用=RANDBETWEEN设置一个随机数生成器 我想做的是指定一个字段,在该字段中我键入范围,即(1,20),然后for=randbween以拾取该值并生成数字,但不重复任何操作 我打赌有一个办法,我只是没有考虑它最有可能,有一个金发的时刻 任何帮助都将不胜感激 谢谢在发现的基础上再接再厉 对于公式答案,您需要两列公式和一个单独的单元格作为起始数字,另一个单元格作为

我希望你能帮我找出我自己做不到的事情。我是一名拥有大量数据集的审计员,希望为自己和与我一起工作的每个人更容易地采集样本

我正在尝试使用=RANDBETWEEN设置一个随机数生成器

我想做的是指定一个字段,在该字段中我键入范围,即(1,20),然后for=randbween以拾取该值并生成数字,但不重复任何操作

我打赌有一个办法,我只是没有考虑它最有可能,有一个金发的时刻

任何帮助都将不胜感激


谢谢

在发现的基础上再接再厉

对于公式答案,您需要两列公式和一个单独的单元格作为起始数字,另一个单元格作为结束数字

我使用E1作为起始编号,F1作为结束编号

然后,在A1中,我提出了以下内容:

=IF(ROW()<=$F$1-$E$1+1,RAND(),"")
然后我将A1和C1复制到足够的行,以覆盖我想要的最大范围

正如你所看到的,我想要5到20之间的随机数。在C列中,我以随机顺序得到了16个从5到20的数字

如果将范围从6更改为15,则会更改:

注意:聚合函数是在Excel 2010中引入的。所以这对早期版本不起作用

如果您使用的是早期版本,请在C1中使用:

=IF(A1<>"",RANK(A1,A:A)+$E$1-1,"")

同样,现存的较低值在E1中,较高值在F1中,这是一个很好的答案-请注意,还有另一个VBA解决方案,它通常涉及“Do While[x无重复项]”之类的内容,它将继续为数组的增量成员分配一个随机数,直到随机数不是重复项为止。这样的方法可能会“更干净”/“更容易理解和编码”,但对于大型数组应该避免。史葛的方法(或类似的东西)将是首选。此外,在理解史葛的方法的过程中,将其分为2个阶段:首先,创建一组X卡,并给每个卡一个唯一值(即第一示例中的20行)。然后,使用Rand()函数将这些卡片的顺序随机化,并从高到低排序。最后,从列表中为您需要的唯一编号选择最前面的y结果。这个两步解决方案看起来可能比“随机化并检查重复项”的一步更复杂,但随着数组的增大,它的效率会越来越高。@Grade'Eh'Bacon,我实际上是从这个解决方案开始的,但第二次运行时,它进入了循环暂停2分钟,试图填充数组中的最后一个数字。我没有CS背景,但我在别处读到过这个问题,因为“这样一个程序的运行时间在理论上是无限的,因为当它迭代时,永远不能保证它落在正确的数字上”。对于大型阵列,这种理论上的无限期很快就变成了实际的“长时间”,至少。@Grade'Eh'Bacon我的背景是建筑管理,拥有商业硕士学位。我只是往墙上扔东西,直到有东西粘在墙上。我的回答对你有用吗?如果是,请标记为正确。这是只有你才能做的事。单击答案旁边的绿色复选标记。
=IF(A1<>"",RANK(A1,A:A)+$E$1-1,"")
Sub RndmUnquArr()
Dim ws As Worksheet
Dim mnm&, mxm&
Dim oArr() As Variant
Dim i&, j&, x&, temp&

Set ws = Sheets("Sheet1")
With ws
    mnm = .Range("E1") 'change as desired
    mxm = .Range("F1") 'change as desired

    ReDim tArr(0 To (mxm - mnm)) As Variant
    ReDim oArr(mnm To mxm) As Variant

    'Load array with integers from mnm to mxm
    For i = mnm To mxm
        oArr(i) = i
    Next i

    'Randomly suffle arr
    x = UBound(oArr)
    For j = LBound(oArr) To UBound(oArr)

        i = Int((x - mnm + 1) * Rnd + mnm)
        temp = oArr(i)
        oArr(i) = oArr(x)
        oArr(x) = temp

        x = x - 1
    Next j

    .Range("A1").Resize(mxm - mnm + 1).Value = Application.Transpose(oArr)
    ws.Calculate
End With

End Sub