excel随机抽取n个数据不重复 轻松实现随机抽取的方法
在Excel中抽取n个数据不重复,是一件十分常见的事情。
Excel中提供的算法并不能满足我们的需求,仅仅只能实现抽取从0到N的数字中的一个。
为了让我们的抽取更加合理,更快捷实现,尝试使用Excel中内置的VBA函数,这样可以大大提高我们的工作效率。
首先我们来看一下对于Excel随机抽取n个数据不重复的实现的原理:
1. 将数据集(源数据)中的数据的行号(1到源数据的最大行号)保存在一个数组中,这里称为数组A。
2. 通过使用Random函数随机生成n个范围在1到数组A的最大行号之间的数字,这里称为数组B。
3. 将数组B与数组A中的每个数字进行对比,如果数组B中的某一项与数组A中的某一项相同,那么将数组B中的该项数字与数组A中的最大行号交换,并再次重新进行对比直到对比结果为false。
4. 将数组B中的数字(数据行号)作为实际抽取数据的行号,从而获得n个不重复的数据行。
实现一般有两种方法,一种是通过Excel的函数来实现,另一种则是通过VBA实现。
下面接下来我们就用VBA来实现这样的抽取方法。
我们需要在VBA的编辑器中新建一个模块。
把下面的代码复制粘贴到模块中:
Sub Sample
'声明变量
Dim OriginDataRange As Range
Dim ResultDataRange As Range
Dim GetNum As Long
Dim OriginIndex As Long,ResultIndex As Long
Dim length As Long
Dim RandomTemp As Long
Dim i As Long
'获取源数据范围
Set OriginDataRange = Worksheets.Range
'获取最终结果范围
Set ResultDataRange = Worksheets.Range
'获取抽取的数量
GetNum = InputBox
'定义OriginIndex数组
length = OriginDataRange.Rows.Count
ReDim OriginIndex
For i = 1 To length
OriginIndex = i
Next
'定义ResultIndex数组
ReDim ResultIndex
'reandomly select resultIndex
For i = 1 To GetNum
'随机生成一个数,比OriginIndex最大值小
RandomTemp = Int Rnd + i)
'将该数加入到ResultIndex中
ResultIndex = OriginIndex
'将OriginIndex最大值与随即生成的数交换
OriginIndex = OriginIndex
Next
'将结果输出到指定的range
For i = 1 To GetNum
ResultDataRange.Cells = originDataRange.Cells, 1)
Next
End Sub
这段代码的具体功能需要对照上述算法进行解释,对于不同的情况可以进行简单的调整,比如要从源数据中抽取500条,只需要把GetNum设置为500即可;如果源数据的行数改变了,则需要把length的值改为源数据的最大行号;如果抽取到的结果要输出到其他的工作表,也可以修改ResultDataRange的赋值部分,赋值为指定的工作表和单元格的范围。
我们就可以来运行这段代码,把源数据的范围和输出结果的范围指定完成后,输入抽取数量n,即可实现Excel随机抽取n个数据不重复的功能,让我们轻松实现抽取数据,提高工作效率。