ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: wcymiss

[Excel 函数与公式] [第79期]按部门随机选取啦啦队队员(已总结)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-7-31 23:43 | 显示全部楼层
  1. =INDEX(B$2:B$31,INDEX(SMALL(IF(A$2:A$31=INDEX(A$2:A$31,SMALL(IF(MATCH(A$2:A$31,A$2:A$31,)=ROW($1:$30),ROW($1:$30)),ROW()-1)),ROW($1:$30)),ROW($1:$30)),RANDBETWEEN(1,COUNTIF(A$2:A$31,INDEX(A$2:A$31,SMALL(IF(MATCH(A$2:A$31,A$2:A$31,)=ROW($1:$30),ROW($1:$30)),ROW()-1))))))
复制代码
数组公式。
目前想到的,应该是一种比较普遍的思路,回头接着考虑~~~

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-8-2 11:12 | 显示全部楼层

回复 1楼 wcymiss 的帖子

先不考虑加载项函数
=INDEX(B:B,SMALL(IF(MMULT(N(A$2:A$31=TRANSPOSE(IF(COUNTIF(D$1:D1,B$2:B$31),A$2:A$31))),ROW(2:31)^0)=0,ROW($2:$31)),ROUNDUP(RAND()*(ROWS(A$2:A$31)-SUM(COUNTIF(A$2:A$31,A$2:A$31)*COUNTIF(D$1:D1,B$2:B$31))),)))
如果怕RAND返回0,公式出错,改为
=INDEX(B:B,SMALL(IF(MMULT(N(A$2:A$31=TRANSPOSE(IF(COUNTIF(D$1:D1,B$2:B$31),A$2:A$31))),ROW(2:31)^0)=0,ROW($2:$31)),INT(RAND()*(ROWS(A$2:A$31)-SUM(COUNTIF(A$2:A$31,A$2:A$31)*COUNTIF(D$1:D1,B$2:B$31)))+1)))
如果总个数30可以直接用,不用公式ROWS求出,再略简点
=INDEX(B:B,SMALL(IF(MMULT(N(A$2:A$31=TRANSPOSE(IF(COUNTIF(D$1:D1,B$2:B$31),A$2:A$31))),ROW(2:31)^0)=0,ROW($2:$31)),INT(RAND()*(30-SUM(COUNTIF(A$2:A$31,A$2:A$31)*COUNTIF(D$1:D1,B$2:B$31)))+1)))

[ 本帖最后由 山桑弓 于 2011-8-6 18:51 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-8-2 15:04 | 显示全部楼层
先偷鸡占个位:

165字符,数组公式(20110802)——公式理论上符合概率分布,实则不然:
  1. =INDIRECT("B"&RIGHT(INDEX(SMALL(--(MATCH($A$2:$A$31,$A$2:$A$31,0)&TEXT(ROW($A$2:$A$31),"00")),ROW($1:$30)),INDEX(RAND()*{6,5,2,2,6,3}+{1,8,14,17,20,27},ROW(A1))),2))
复制代码


190字符,数组公式(20110803)——“REPT(RAND()*10^15,2)”这里偷了一个懒,概率分布不符合要求:
  1. =INDIRECT("B"&RIGHT(MAX((A$2:A$31=INDEX(A:A,LARGE((COUNTIF(OFFSET(A$1,,,ROW($1:$30)),A$2:A$31)=0)*ROW($2:$31),ROW(A1))))*(MID(REPT(RAND()*10^15,2),ROW($1:$30),1)&TEXT(ROW($2:$31),"00"))),2))
复制代码


195字符,数组公式(201100805)——概率分布基本符合要求(如附件演示):
  1. =INDIRECT("B"&RIGHT(MAX((A$2:A$31=INDEX(A:A,LARGE((COUNTIF(OFFSET(A$1,,,ROW($1:$30)),A$2:A$31)=0)*ROW($2:$31),ROW(A1))))*(MID(RAND()*10^15&RAND()*10^15,ROW($1:$30),1)&TEXT(ROW($2:$31),"00"))),2))
复制代码


附件中用VBA模拟了10000次运算后的概率分布,结果一目了然。

[ 本帖最后由 sunya_0529 于 2011-8-5 17:44 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-8-2 21:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
公式一:256字符(数组)部门固定、人员随机

=INDEX(B$2:B$31,SMALL(IF(A$2:A$31=INDEX(A:A,SMALL(IF(MATCH(A$2:A$31,A$2:A$31,)=ROW($1:$30),ROW($2:$31),33),ROW(A1))),ROW(A$1:A$30)),INT(RAND()*(COUNTIF(A$2:A$31,INDEX(A:A,SMALL(IF(MATCH(A$2:A$31,A$2:A$31,)=ROW($1:$30),ROW($2:$31),33),ROW(A1))))-1)+1.5)),1)

公式二:217字符(数组)部门、人员均随机

=INDEX(B$2:B$31,SMALL(IF(MMULT((A$2:A$31=TRANSPOSE(IF(COUNTIF(D$1:D1,B$2:B$31),A$2:A$31,0)))*1,1^ROW($A$2:$A$31))=0,ROW(A$1:A$30),33),INT(RAND()*(30-SUM(COUNTIF(A$2:A$31,IF(COUNTIF(D$1:D1,B$2:B$31),A$2:A$31)))))+1),1)

公式三:179字符(数组)部门、人员均随机

=INDEX(B$2:B$31,LARGE(ISNA(MATCH(A$2:A$31,IF(COUNTIF(D$1:D1,B$2:B$31),A$2:A$31),0))*ROW($1:$30),INT(RAND()*(30-SUM(COUNTIF(A$2:A$31,IF(COUNTIF(D$1:D1,B$2:B$31),A$2:A$31))))+1)),1)

公式四:168字符(数组)部门、人员均随机
=OFFSET(B$1,LARGE(ISNA(MATCH(A$2:A$31,IF(COUNTIF(D$1:D1,B$2:B31),A$2:A31),0))*ROW($1:$30),INT(RAND()*(30-COUNT(MATCH(1&A$2:A31,COUNTIF(D$1:D1,B$2:B31)&A$2:A31,)))+1)),)

[ 本帖最后由 wkbu 于 2011-8-11 14:53 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-8-4 19:08 | 显示全部楼层
=INDEX(B:B,LARGE((A$2:A$31=INDEX(A:A,LARGE((MATCH(A$2:A$31,A$2:A$31,)=ROW($1:$30))*ROW($2:$31),ROW(A1))))*ROW($2:$31),INT(RAND()*COUNTIF(A:A,INDEX(A:A,LARGE((MATCH(A$2:A$31,A$2:A$31,)=ROW($1:$30))*ROW($2:$31),ROW(A1))))+1)))

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-8-7 07:53 | 显示全部楼层
改成这样先,到时再想想,能精简不,唉:
  1. =INDEX(B:B,LARGE((A$2:A$31=INDEX(A:A,SMALL(IF(FREQUENCY(MATCH(A$2:A$31,A$2:A$31,),MATCH(A$2:A$31,A$2:A$31,)),ROW(A$2:A$31),4^8),ROW(1:1))))*ROW(A$2:A$31),INT(RAND()*COUNTIF(A$2:A$31,OFFSET(A$1,SMALL(IF(MATCH(A$2:A$31,A$2:A$31,)=ROW(A$2:A$31)-1,ROW(A$1:A$30)),ROW(1:1)),)))+1))
复制代码

[ 本帖最后由 huoxieshen 于 2011-8-7 08:35 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-8-7 19:17 | 显示全部楼层
试一下
=INDEX(B$2:B$31,LARGE(IF(A$2:A$31=INDEX(A$2:A$31,SMALL(IF((MATCH(A$2:A$31,A$2:A$31,)=ROW($1:$30)),ROW($1:$30),9^9),ROW(A1))),ROW($1:$30),-9^9),INT(RAND()*(SUM(--(A$2:A$31=INDEX(A:A,SMALL(IF(MATCH(A$2:A$31,A$2:A$31,)=ROW($1:$30),ROW($2:$31),9^9),ROW(A1))))))+1)))
修改
=INDEX(B$2:B$31,LARGE(IF(A$2:A$31=INDEX(A:A,SMALL(IF((MATCH(A$2:A$31,A$2:A$31,)=ROW($1:$30)),ROW($2:$31),9^9),ROW(A1))),ROW($1:$30),-9^9),INT(RAND()*(SUM(--(A$2:A$31=INDEX(A:A,SMALL(IF(MATCH(A$2:A$31,A$2:A$31,)=ROW($1:$30),ROW($2:$31),9^9),ROW(A1))))))+1)))

[ 本帖最后由 xinzijin2006 于 2011-8-9 09:24 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-8-8 08:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

回复 5楼 bluexuemei 的帖子

看看你的答案

TA的精华主题

TA的得分主题

发表于 2011-8-14 18:01 | 显示全部楼层
本帖最后由 Zaezhong 于 2011-8-15 18:18 编辑

开始思路刚好是170
  1. =INDEX(B:B,LARGE(ISNA(MATCH(A$2:A$31,T(OFFSET(A$1,MATCH(D$1:D1,B:B,)-1,)),))*ROW($2:$31),INT(1+RAND()*(30-COUNT(MATCH(A$2:A$31,T(OFFSET(A$1,MATCH(D$1:D1,B:B,)-1,)),))))))
复制代码
简化一下162字符,但是不知道效率是否有提升
  1. =INDEX(B:B,LARGE(ISNA(MATCH(A$2:A$31,IF(COUNTIF(D$1:D1,B$2:B$31),A$2:A$31),))*ROW($2:$31),INT(RAND()*(30-SUM(COUNTIF(D$1:D1,B$2:B$31)*COUNTIF(A:A,A$2:A$31)))+1)))
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-8-15 00:08 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

.

本帖最后由 wangg913 于 2011-8-15 13:42 编辑

升级导致楼主可见失效,明天看看情况.

题目结束,请参赛者勿再修改;请楼主做出总结、汇总评分。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 19:37 , Processed in 0.036581 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表