|
前几天刚给大家分享了LET函数的基础教程。
今天碰到的问题,正好可以用LET函数来处理。
问:
Excel 如何随机抽取单元格区域中的两个值?
现在我想随机抽取后面5个模块中的其中两个模块,请问如何解决呢?

随机抽取并不算难,之前也分享过几个类似的案例。
这个问题的关键,题目中没有指明:随机抽取不重复的两个模块。
随机加上不重复,问题难度一下就上来了。
不过,之前其实也有分享过类似的解决方案:
<如何从Excel的一列数字里随机抽取规定个数的不重复数字?>
用同样的方法,完全可以解决这个问题。但今天想分享的是一个再度改进的方法。
先看结果。

随机抽取2个或者3个不重复的数据,都可以实现。

=LET(a,RANDARRAY(1,5),TEXTJOIN(&#34;,&#34;,,INDEX(C2:G2,,MATCH(LARGE(a,{1,2}),a,0))))
再看原理。
核心的方法和之前一样:
- 利用RAND函数创建一个随机数序列;(随机)
- 用LARGE函数从中取最大的N个;(不重复)
- 再通过MATCH定位到该N个值的位置;(定位)
- 最后用INDEX借助定位在目标数据中抽取数值。(抽取)
因为需要事先创建出一个随机数序列,之前的案例中采取了辅助列的做法。当时只需要抽取一次随机数据,倒也不算麻烦。
本问题中有10行5列数据需要抽取(真实数据可能更多),意味着要添加10行5列的辅助数据。又麻烦又影响计算效率。于是我就想,能不能不添加辅助列,就在一个单元格内编辑公式搞定这个问题?

一般将辅助列并成一个公式中的做法是直接代入法。即,最终公式中引用了辅助列的部分,直接用辅助列中的公式进行代入。
不过这里的RAND函数没必要代入,可以直接用RANDARRAY函数替换。RANDARRAY函数可以生成一组随机数组,正符合我们的要求。
但是,不管是RAND,还是RANDARRAY,都将面临一个考验:MATCH函数借助LARGE函数定位最大的两个随机数的部分:
- MATCH(LARGE(RANDARRAY(1,5),{1,2}),RANDARRAY(1,5),0)
这里划线处的两个随机数组,将会在公式中分别计算,导致两处不一致,无法完成定位。如下图:

(为方便演示,改成了2个数的随机)
这意味着我们需要在一个公式中,创建出两个相同的随机数组。这是不可能的,我们不可能创建出两个相同的随机数组,但是,我们可以创建出一个后,用两次。
以前我们的做法是用辅助列来创建出随机数组,后续引用此辅助列。
现在我们可以借助LET函数,创建出随机数组后,将其命名,给后续公式使用。这便是此题文首解答的原理与思路来源。
最后,再看一下该公式的计算过程,帮助理解。
 |
|