ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

请求各位老师协助,如何实现不重复的随机排班。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-1-26 16:33 | 显示全部楼层 |阅读模式
各位老师好,

我已经做了想下图一样的,按照每个科室要求人数不同把每个人进行了随机的排班,但是不知道怎样能够让每次排班都不重复。

具体情况如下:

现有198名实习生(实习生可能增加人数不定),需要随机排班到41个科室(后续科室可能增加),且每个科室接受的人数不相同,每个周期排一次班,但又要保证每个人本周期排班与上一个周期的排班不重复,为不同的科室

如下图所示,A列是实习生名单,F列是科室,G列是每个科室要求的人数,现在已经实现了按人数随机排序,但没想出怎样可以实现相连的两次不重复。还请各位老师帮忙,思路或者vba,非常感谢。

image.png

排班.zip

41.65 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2021-1-26 17:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
但没想出怎样可以实现相连的两次不重复,这句话没理解楼主说的是啥

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-26 17:47 | 显示全部楼层
牛掰 发表于 2021-1-26 17:20
但没想出怎样可以实现相连的两次不重复,这句话没理解楼主说的是啥

不好意思,说的有点绕,意思就是:
每个周期都要排班,但每个人本周期的排班与上一个周期的排班不重复,比如图片显示的张2,上个周期是“内分泌科”的,那么本次排班就不能同样是“内分泌科”

TA的精华主题

TA的得分主题

发表于 2021-1-26 20:35 | 显示全部楼层
与以前各期排班科室都不会重

排班.zip

39.08 KB, 下载次数: 40

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-1-26 21:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub 按钮1_Click()
    Set d = CreateObject("scripting.dictionary")
    Set dd = CreateObject("scripting.dictionary")
    Application.ScreenUpdating = False
    [a1].CurrentRegion.Offset(1, 2).ClearContents
    arr = [a1].CurrentRegion
    brr = [p1].CurrentRegion
    For i = 3 To UBound(arr, 2)
        d.RemoveAll
        For j = 2 To UBound(brr)
            d(brr(j, 1)) = brr(j, 2)
        Next j
        For j = 2 To UBound(arr)
            dd(j) = j
        Next j
        For Each k In d.keys
            sm = d(k)
l1:
            If sm > 0 Then
                x = WorksheetFunction.RandBetween(0, dd.Count - 1)
                r = dd.keys()(x)
                If k <> arr(r, i - 1) Then
                    arr(r, i) = k
                    dd.Remove r
                    sm = sm - 1
                End If
                GoTo l1
            End If
        Next k
    Next i
    [a1].CurrentRegion = arr
    Application.ScreenUpdating = True
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-1-26 21:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
看看是否能满足需求。。。

排班.zip

52.68 KB, 下载次数: 22

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-27 10:26 | 显示全部楼层
宝贝晶晶 发表于 2021-1-26 20:35
与以前各期排班科室都不会重

老师,可以用的,还增加了一列状态的判断,真贴心。
但是目前遇到一个问题,就是我想在C列之前插入两列填写人员的一列基本信息,然后代码里,做了以下的修改:
If brr(i, 5) = "正常" Then
      For j = 6 To UBound(brr, 2)

运行以后卡死了...

TA的精华主题

TA的得分主题

发表于 2021-1-27 11:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
si蠢 发表于 2021-1-27 10:26
老师,可以用的,还增加了一列状态的判断,真贴心。
但是目前遇到一个问题,就是我想在C列之前插入两列 ...

Sub pb()
  Application.ScreenUpdating = 0
  brr = Sheet1.Range("A1").CurrentRegion
  Set dic1 = CreateObject("scripting.dictionary")
  For i = 2 To UBound(brr)
    If brr(i, 5) = "正常" Then
      For j = 6 To UBound(brr, 2)
        If brr(i, j) <> "" Then
          dic1(brr(i, 2)) = dic1(brr(i, 2)) & "@" & brr(i, j)
        Else
          Exit For
        End If
      Next
    End If
  Next
  c = Sheet1.Range("ZZ2").End(1).Column + 1
100:
  arr = Sheet2.Range("A1").CurrentRegion
  Set dic = CreateObject("scripting.dictionary")
  For i = 2 To UBound(arr)
    dic(arr(i, 1)) = arr(i, 2)
  Next
  k = dic.keys
  For i = 2 To UBound(brr)
    If brr(i, 5) = "正常" Then
      For j = 0 To UBound(k)
        If dic(k(j)) > 0 And Not InStr(dic1(brr(i, 2)), k(j)) > 0 Then
          brr(i, c) = k(j)
          dic(k(j)) = dic(k(j)) - 1
          Exit For
        End If
      Next
      If brr(i, c) = "" Then
        Application.Calculate
        排序
        GoTo 100:
      End If
    End If
  Next
  Sheet1.Range("A1").Resize(UBound(brr), UBound(brr, 2)) = brr
  Application.ScreenUpdating = 1
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-27 13:51 | 显示全部楼层
本帖最后由 si蠢 于 2021-1-27 14:25 编辑
宝贝晶晶 发表于 2021-1-27 11:52
Sub pb()
  Application.ScreenUpdating = 0
  brr = Sheet1.Range("A1").CurrentRegion

老师,感谢您。但刚刚领导给了新的要求,就是总共排班8-10次,每一次都不能重复,之前已经排了6次班了,只需要再随机排2次班,这两次的班不能是之前已经排到过的科室。
哎,实在非常抱歉,我这边之前没有仔细跟领导沟通,导致又一次修改需求,抱歉抱歉。

我已经将之前的排班情况附上了,要麻烦老师再帮忙修改一下,辛苦了。

排班表0127.zip

37.82 KB, 下载次数: 19

TA的精华主题

TA的得分主题

发表于 2021-1-28 15:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
si蠢 发表于 2021-1-27 13:51
老师,感谢您。但刚刚领导给了新的要求,就是总共排班8-10次,每一次都不能重复,之前已经排了6次班了, ...

标题行加上周期7、周期8……,代码不用修改

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-7-1 15:49 , Processed in 0.038680 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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