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