一个不使用字典的抽取不重复值的数据出站思路

文摘   教育   2024-09-21 19:50   广东  
这两天在逛各Excel群聊发现一个经典案例,关于一个不重复值的抽取,话不多说,我们来看看题目吧。科室
如图A列区域,是需要收取的数据,现需要根据D2单元格指定的数量进行抽取,将数据放在B列所在区域。如果是你你会怎么做呢?

其实这个题有一个非常简单的思路,那就是使用字典,将数据都装入字典,然后使用随机数进行抽取,如果抽出来了,把该关键字进行移除,这样可以避免不重复的出现,但今天本文不使用字典,就单纯的使用循环+数组来进行不重复抽取,那么怎么做呢?下面我们来看看代码:
代码展示:

Sub 随机抽取()    Dim ass(), n As Integer, aRes() As String, k As Integer, i%, tmp$    arr = Range("A2:A" & Range("A1048576").End(xlUp).Row).Value    n = Range("D2").Value    ReDim aRes$(1 To n, 1 To 1)    k = UBound(arr)    Randomize    While n > 0        i = Int(k * Rnd + 1)        aRes(n, 1) = arr(i, 1)        tmp = arr(k, 1): arr(k, 1) = arr(i, 1): arr(i, 1) = tmp '位置调换        n = n - 1: k = k - 1    Wend    Range("B2:B100").ClearContents    Range("B2").Resize(UBound(aRes), UBound(aRes, 2)) = aResEnd Sub

第3行:将数据区域装入数组

第4行:提取抽取数量

第5行:定义结果数据的数组大小

第6行:取数据源的数量

第7行:重置随机发生器

第8行:提取数量n>0则进入循环

第9行:在数据源的1-k之间随机取一个随机数据

第10行:将该随机数据所在数据源的行装入结果数组

第11行:将刚刚被抽取的的数据与第k个位置进行的数据进行交换位置,以避免重复

第12行:将随机范围k,与提取结果的位置n都减1,用于修改随机范围与结果数据装入的位置

第14行:清空结果区域所在单元格

第15行:将结果数组导入单元格

下面来看看效果:

本文的核心思路是通过调换位置,逐步缩小随机范围来实现随机数的不重复抽取,你看懂了吗?字典的思路较简单,本文就不提供了,感兴趣的可以自己做做

好了,本期教程就到这里啦,走过路过的点个关注分享一下吧,谢谢啦,如果你是一个VBA小白,想要了解该如何开始学习VBA,建议看看以下文章

Excel VBA学习路线知识框架梳理(小白VBA入门必看-建议收藏)

求关注-求星标-求点赞-求看-求分享
最近创建了一个VBA学习交流群,如有需要进群可以添加微信 jaresfzz

Excel应用教程
主要提供Excel vba,函数,图表,数据透视表,pq,Js等教程
 最新文章