在Excel中,如何确保从命名范围中随机选择的N个列在每行中具有唯一的值? 背景

在Excel中,如何确保从命名范围中随机选择的N个列在每行中具有唯一的值? 背景,excel,vba,random,Excel,Vba,Random,我可以从一张纸(“Sheet2”)中的命名字符串范围中随机选择值,并使用=INDEX(aNamedRange,randbween(1,行(aNamedRange)))在单独的纸(“Sheet1”)中填充名为:MyColumn的列 看起来是这样的: | MyColumn | |-------------------------------| | RandomlySelectedValue_1, Col1 | | RandomlySelectedValue_

我可以从一张纸(“Sheet2”)中的命名字符串范围中随机选择值,并使用
=INDEX(aNamedRange,randbween(1,行(aNamedRange)))在单独的纸(“Sheet1”)中填充名为:
MyColumn
的列 看起来是这样的:

|            MyColumn           |
|-------------------------------|
| RandomlySelectedValue_1, Col1 |
| RandomlySelectedValue_2, Col1 |
|              ...              |
| RandomlySelectedValue_N, Col1 |
我还制作了另外两个专栏:
MyColumn2
MyColumn3

问题: 当刷新时执行
RandBetween
时,是否有办法确保
RandomlySelectedValue_1,Col1
不等于
RandomlySelectedValue_1,Col2?

换言之:

  • 这是唯一的,因为列中所有随机选择的字符串在同一行中都是不同的
  • 也就是说,没有任何检查可以防止在同一行中随机选择任何重复项
我试过的 我制作了以下VBA脚本:

Sub UniqueRandoms()
Do
    Worksheets("Sheet1").Range("AB7").Value = WorksheetFunction.Index(Range("FileName.xls!aNamedRange"), WorksheetFunction.RandBetween(1, Sheets("Sheet2").Rows(Range("FileName.xls!aNamedRange"))))
    Worksheets("Sheet1").Range("AC7").Value = WorksheetFunction.Index(Range("FileName.xls!aNamedRange"), WorksheetFunction.RandBetween(1, Sheets("Sheet2").Rows(Range("FileName.xls!aNamedRange"))))
    Worksheets("Sheet1").Range("AD7").Value = WorksheetFunction.Index(Range("FileName.xls!aNamedRange"), WorksheetFunction.RandBetween(1, Sheets("Sheet2").Rows(Range("FileName.xls!aNamedRange"))))
Exit Do

Loop Until Worksheets("Sheet1").Range("AB7").Value <> Worksheets("Sheet1").Range("AC7").Value And Worksheets("Sheet1").Range("AD7").Value <> Worksheets("Sheet1").Range("AC7").Value And Worksheets("Sheet1").Range("AB7").Value <> Worksheets("Sheet1").Range("AD7").Value

End Sub
Sub UniqueRandoms()
做
工作表(“Sheet1”).Range(“AB7”).Value=WorksheetFunction.Index(Range(“FileName.xls!aNamedRange”)、WorksheetFunction.randbween(1,工作表(“Sheet2”).Rows(Range(“FileName.xls!aNamedRange”))
工作表(“Sheet1”).Range(“AC7”).Value=工作表函数.Index(Range(“FileName.xls!aNamedRange”)、工作表函数.randbween(1,工作表(“Sheet2”).行(Range(“FileName.xls!aNamedRange”))
工作表(“Sheet1”).Range(“AD7”).Value=工作表函数.Index(Range(“FileName.xls!aNamedRange”)、工作表函数.randbween(1,工作表(“Sheet2”).行(Range(“FileName.xls!aNamedRange”))
退出Do
循环直到工作表(“Sheet1”)。范围(“AB7”)。值工作表(“Sheet1”)。范围(“AC7”)。值和工作表(“Sheet1”)。范围(“AD7”)。值工作表(“Sheet1”)。范围(“AC7”)。值和工作表(“Sheet1”)。范围(“AB7”)。值工作表(“Sheet1”)。范围(“AD7”)。值
端接头
但我收到一个运行时错误“1004”:应用程序定义的或对象定义的错误


上面的脚本是解决问题的最佳方法还是有更简单的解决方案(可以推广到任意数量的列)

我开始创造类似的东西。我的文件设置如下:

我能够在
A1:A7
中获取值,然后随机将它们放在顶部的列中,但具体来说没有重复

我使用了一个
集合
,因为添加/删除项目的功能使我更容易确保我没有重复。将值输出到工作表后,我将其从集合中删除

Sub RandomPlay()
    Dim inputRange As Range
    Set inputRange = Sheet1.Range("A1:A7")

    Dim inputCollection As Collection
    Set inputCollection = New Collection

    'populate collection with values from the input range
    Dim rng As Range
    For Each rng In inputRange
        inputCollection.Add rng.Value
    Next rng

    Dim randomPick As Integer
    Dim i As Integer

    Dim result As Variant
    ReDim result(1 To inputCollection.Count)

    'pick randomly from collection > add to result array > remove from collection > repeat
    For i = 1 To inputCollection.Count
        randomPick = Int(Rnd() * inputCollection.Count) + 1
        result(i) = inputCollection(randomPick)
        inputCollection.Remove randomPick
    Next i

    Sheet1.Range("C2:I2").Value = result

    Set inputCollection = Nothing
End Sub

我不确定此数据设置是否与您的数据设置完全相同,但此处显示的方法应该对您有所帮助。

欢迎使用StackOverflow。如果范围为1-6,请说出您在模具表面上看到的情况,是否会出现(例如)三个4?当您运行此VBA代码时,哪个工作表处于活动状态?如果活页1处于活动状态,1004可能会升起,但如果活页2处于活动状态,则可能会升起。命名范围是工作表还是工作簿的局部范围?同样值得一提的是:Excel中的随机函数充其量是伪随机函数。此外,没有,在随机函数中没有任何东西可以防止重复,尽管如果给定足够大的范围(例如,
randtween(1100000)
randtween(1,5)更不可能有重复
,如果您需要严格防止重复,则需要使用VBASo实现一些自定义方法。命名范围是一张图纸(“Sheet2”)的本地范围,但我要填充的列位于单独的图纸(“Sheet1”)中。因此,创建一个集合,并创建一个变量来保存随机数。检查该数字是否在集合中,如果未将其添加到工作表和集合中,则生成下一个数字,如果在集合中,则再次生成,如果未添加到工作表并生成下一个数字,则冲洗并重复。可能需要一个重复的计数器checker因此,如果您遇到相同的x次数,您可以退出例程。非常感谢。我将尝试使代码适应我的值!没问题-如果这回答了您的问题,请通过单击左侧的复选标记来接受它。这很有效!我刚刚添加了一个for循环,其中包含一个名为
Row
的变量,并将其连接到输出范围如下:
“C”和Row&“:”和“I”和Row
,因为我希望尽可能扩大此范围。