ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 805|回复: 9

[求助] 如何根据专家库生产专家小组

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-9 08:46 | 显示全部楼层 |阅读模式

需求说明:1.专家库名单可以继续追加;                 2.根据随机生成条件(生成组数和每组人数),生成专家小组;


请各位专家帮助,如何实现以上需求,附表


随机生成.rar

7.75 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2019-10-9 08:50 | 显示全部楼层
用字典记录一下名字,按照分组数,除一下,每个组几个人,然后随机调用字典填到组里即可。这个问题好像之前也有人提出几乎一模一样的需求的

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-9 09:12 | 显示全部楼层
microyip 发表于 2019-10-9 08:50
用字典记录一下名字,按照分组数,除一下,每个组几个人,然后随机调用字典填到组里即可。这个问题好像之前 ...

有限定条件,比如:生产组数和每组人数 都是变量,根据需要可以调整

TA的精华主题

TA的得分主题

发表于 2019-10-9 09:14 | 显示全部楼层
starpeng0719 发表于 2019-10-9 09:12
有限定条件,比如:生产组数和每组人数 都是变量,根据需要可以调整

你这个所谓限定条件不影响从字典随机抽取的结果嘎

TA的精华主题

TA的得分主题

发表于 2019-10-9 09:22 | 显示全部楼层
分组结果在B列
Sub sjs()
  Application.ScreenUpdating = False
  h = [a65536].End(3).Row
  [b1] = "分组"
  Range("b2:b" & h).Formula = "=rand()"
  Range("a1:b" & h).Sort key1:="分组", Header:=xlYes
  Range("b2:b" & h).ClearContents
  Range("b2:b7") = "1组"
  Range("b8:b12") = "2组"
  Range("b13:b17") = "3组"
  Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2019-10-9 09:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
把程序文件也发给你。

随机生成.zip

17.28 KB, 下载次数: 7

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-9 09:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liangmutou01 发表于 2019-10-9 09:22
分组结果在B列
Sub sjs()
  Application.ScreenUpdating = False

1.生成组数和每组人数都是变量; 如:可随意设置  5组   3人   或   3组   5人  等
2.生成的结果可以不改变原名单吗?
如结果显示:    组1:张三  李四  王二麻
                      组2:张四  李三 王二小            

TA的精华主题

TA的得分主题

发表于 2019-10-9 09:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主:是不是要这样的?

Sub test()
        Set sh1 = Sheets("sheet1")
        r = sh1.[A65536].End(3).Row 'a列有数据的最大行号
        Set d = CreateObject("Scripting.Dictionary") '定义字典对象
        arr = sh1.Range("a1:b" & r) '给数组arr赋值
        For i = 2 To UBound(arr) '相当于行循环
            d(arr(i, 1)) = i '写入字典“键”值,“条目”值
        Next i
        r1 = sh1.[A65536].End(3).Row - 1
        Set d1 = CreateObject("Scripting.Dictionary")
        Do Until d1.Count = 15 '设定产生个数
                s = Int(Rnd * r1 + 2)
                d1(s) = ""
        Loop
        sh1.[g2:h16].ClearContents
        brr = sh1.[g2:h16]
        For Each Rng In d1.keys
                n = n + 1
                brr(n, 1) = "第" & Int((n - 1) / 5) + 1 & "组"
                brr(n, 2) = arr(Rng, 1)
        Next Rng
        sh1.[g2].Resize(UBound(brr), 2) = brr
End Sub

随机生成55555.zip

16.69 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2019-10-9 09:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub 分组()
  2.     Dim vData As Variant, nRow As Integer, oDic As Object, sName As String
  3.     Dim nTeams As Integer, nTeam As Integer, nPerson As Integer, nAVG As Integer
  4.    
  5.     With Sheet1
  6.         nTeams = Val(.[D1].Value)
  7.         nPerson = Val(.[H1].Value)
  8.         If nTeams = 0 Or nPerson = 0 Then
  9.             MsgBox "分组参数未设置!"
  10.             Exit Sub
  11.         End If
  12.         vData = .[A1].CurrentRegion.Resize(, 1).Value
  13.         Set oDic = CreateObject("Scripting.Dictionary")
  14.         For nRow = 2 To UBound(vData)
  15.             If Trim(vData(nRow, 1)) <> "" Then oDic(Trim(vData(nRow, 1))) = 0
  16.         Next
  17.         nAVG = Int((oDic.Count - 1) / nTeams) + 1
  18.         If nAVG > nPerson Then nAVG = nPerson
  19.         ReDim vData(1 To nTeams, 1 To nAVG)
  20.         For nTeam = 1 To nTeams
  21.             For nPerson = 1 To nAVG
  22.                 If oDic.Count > 0 Then
  23.                     Randomize
  24.                     nRow = (oDic.Count - 1) * Rnd()
  25.                     sName = oDic.Keys()(nRow)
  26.                     oDic.Remove sName
  27.                     vData(nTeam, nPerson) = sName
  28.                 End If
  29.             Next
  30.         Next
  31.     End With
  32.     With Sheet2
  33.         .UsedRange.ClearContents
  34.         .[A2].Resize(nTeams, nAVG) = vData
  35.     End With
  36. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-10-9 09:57 | 显示全部楼层
附上附件以供参考

随机生成(by.micro).rar

16.57 KB, 下载次数: 23

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 18:45 , Processed in 0.057415 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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