ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 写了这段随机分配餐桌座位的代码,但是报错,急急急,求助

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-7-24 10:50 | 显示全部楼层 |阅读模式
各位老师好!

     我根据以下的要求,让chatgpt帮忙写了一个VBA代码,命令如下:
      “Excel表的sheet1表第1列从第2行开始显示有若干个人名。要求每次对第1列的所有人名中随机的找出9个未标红的人名进行分组,已经被分组的未标红的人名不能重复参与下一轮分组,在多次分组后如果第2列最后剩下的未标红的人名不足9个,那么剩下的这些未标红的人名就分成1个组;要求如果第1列的标红的人名数量小于等于上述已生成的组的数量,那么第1列的标红人名在分入上述已生成的组后必须保证任意一个上述已生成的组不得出现有2个标红的人名;如果第1列的标红人名数量大于上述已生成的组的数量,那么第1列的标红的人名在分入上述组后必须保证任意一个组必须至少包含有1个标红的人名,且不重复。不准对sheet1表中的任何原始数据进行删除或其他变化,将分组的全部结果显示在sheet2表中。根据以上描述写一段VBA代码以实现以上的需求。”

     然后系统给了段代码如下,附件里面也写着,但是手动改了之后还是报错,麻烦哪位老师帮我看看怎么改才能跑起来,感激不尽!
           
Sub RandomGroup()
Dim Rng As Range
Dim arr() As Variant
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer
Dim n As Integer
Dim RedCnt
Dim GroupCnt As Integer
Dim RemainCnt As Integer
Dim Group() As Variant
Dim RedName() As Variant
Dim Temp As Variant
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Set ws1 =ThisWorkbook.Worksheets("Sheet1") '原始数据表
Set ws2 =ThisWorkbook.Worksheets("Sheet2") '输出结果表
'获取第1列未标红人名数据
n =ws1.Range("A1").End(xlDown).row
Set Rng = ws1.Range("A2:A" &n)
arr = Rng.Value
'获取第1列标红人名数量
RedCnt =ws1.Columns(1).SpecialCells(xlCellTypeConstants, xlCellTypeVisible).Count - 1
'分组处理
ReDim Group(1 ToWorksheetFunction.RoundUp(n - 1 - RedCnt, 9)) '根据未标红人名数量计算分组次数
ReDim RedName(1 To RedCnt) '标红人名数组
k = 1
l = 1
For i = 1 To WorksheetFunction.RoundUp(n -1 - RedCnt, 9) '分组次数
   If l <= RedCnt Then '查找标红人名
       ReDim Temp(1 To RedCnt - l + 1) '临时记录未加入分组的标红人名
       For j = l To RedCnt
           If WorksheetFunction.VLookup(ws1.Cells(1, j + 1).Value, arr, 1, False) ="#N/A" Then '判断是否已加入分组
                Temp(j - l + 1) = ws1.Cells(1,j + 1).Value
           End If
       Next j
   End If
   ReDim Group(1 To 9) '记录本次分组结果
   For j = 1 To 9 '选取未标红人名
       Do
           iRow = WorksheetFunction.RandBetween(2, n)
       Loop Until WorksheetFunction.CountIf(Rng.Cells, arr(iRow - 1, 1)) = 0 '判断是否已加入分组
       Group(k)(j) = arr(iRow - 1, 1)
       arr(iRow - 1, 1) = "" '标记为已加入分组
   Next j
   If l <= RedCnt And WorksheetFunction.CountA(Temp) > 0 Then '分配标红人名到本次分组中
       For j = 1 To WorksheetFunction.CountA(Temp)
           r = WorksheetFunction.RandBetween(1, 9)
           Do While Group(k)(r) Like "" OrWorksheetFunction.CountIf(Group(k), Temp(j)) > 0 '判断是否标红或已加入本组
                r = WorksheetFunction.RandBetween(1,9)
           Loop
           Group(k)(r) = Temp(j)
           l = l + 1 '标记为已加入分组
       Next j
   End If
   If l > RedCnt And WorksheetFunction.CountA(Temp) > 0 Then Exit For'标红人名已全部分配完成
    k= k + 1
Next i
GroupCnt = k '记录实际分组次数
'记录最后剩余未标红人名
RemainCnt = WorksheetFunction.CountIf(Rng,"<>""""")
Dim Remain() As Variant
If RemainCnt > 0 Then
   ReDim Remain(1 To RemainCnt)
    j= 1
   For i = 1 To n - 1
       If Not Rng.Cells(i).Value = "" Then
           Remain(j) = Rng.Cells(i).Value
           j = j + 1
       End If
   Next i
End If
'输出至结果表
ws2.Cells.ClearContents
For i = 1 To GroupCnt
   For j = 1 To 9
       ws2.Cells((i - 1) * 9 + j, 1) = Group(i)(j)
   Next j
Next i
If RemainCnt > 0 Then '输出最后剩余未标红人名
   For i = 1 To RemainCnt
       ws2.Cells(GroupCnt * 9 + i, 1) = Remain(i)
   Next i
End If
End Sub

宴会分组小工具3.rar

21.75 KB, 下载次数: 19

TA的精华主题

TA的得分主题

发表于 2023-7-24 13:27 | 显示全部楼层
建议楼主结合附件内容,详细描述具体需求,模拟实现步骤
当前描述,看不大明白

TA的精华主题

TA的得分主题

发表于 2023-7-24 13:36 | 显示全部楼层
就那个描述,别说GPT了,就人看了也头大。

随机分组,简单手工模拟一下,估计好理解多了。这类代码还是很常见的,基本上很适合学习的人练习,模拟个文件,估计很快就有结果了

TA的精华主题

TA的得分主题

发表于 2023-7-24 13:57 | 显示全部楼层
本帖最后由 micch 于 2023-7-24 14:37 编辑

未标红的人随机分组,9人一组。标红的人再分到分好的组里去。           我这么描述是不是太简单了?

image.jpg

image.jpg

TA的精华主题

TA的得分主题

发表于 2023-7-24 16:07 来自手机 | 显示全部楼层
看不太懂,红字的是vip要分散到其他各桌?
建议模拟结果

TA的精华主题

TA的得分主题

发表于 2023-7-24 16:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一句代码就是牛逼,可惜只能你自己玩自己用。 虽然不知道你的结果对不对,但是第一拿来不会用,第二拿来不会改。

这个论坛90%的人是初学着,或者是纯粹的求助者。
需要的是:直接给我能用的结果,我不需要懂,拿去直接用,数据源变了也不需要考虑还能继续用。      
另一种是,要基础的代码,能看懂,尝试去理解,去修改,然后自己根据实际情况去修改代码,达到搞懂轮子如何造的目的。

你牛逼不牛逼,这里90%的人都不知道,也不懂,只知道,你写的所谓用现成的轮子解决问题,在他的Excel文件里,他用不了。

TA的精华主题

TA的得分主题

发表于 2023-7-24 20:17 | 显示全部楼层
没办法,我只是刚学代码的初学者,所以不会用你高级的东西。至于嘲笑你,那也谈不上,你是来装逼的,我是来学习的,走的不是一条路,我嘲笑你干嘛。

TA的精华主题

TA的得分主题

发表于 2023-7-24 20:25 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
题目要求就看的头大

TA的精华主题

TA的得分主题

发表于 2023-7-24 23:41 | 显示全部楼层
装逼的到那儿都离不开装逼。你牛逼咋不去开发系统去,到这儿初学者园地来装逼。

TA的精华主题

TA的得分主题

发表于 2023-7-25 11:15 | 显示全部楼层

唉,论坛真的是很久没这么热闹过了。已经忘了以前各种假装虚心实在悄悄的装一把就跑的时光了。

咱也写个一句话完成的方法吧,否则Excel的棺材盖子要捂不住了。
  1. =LET(n,COUNTIF(B:B,)-1,m,INT(n/9),WRAPCOLS(SORTBY(A2:A236,B2:B236+RANDARRAY(COUNTA(A:A)-1)),m,""))
复制代码
如果不怕丢人还可以再装个更大的
  1. =WRAPCOLS(SORTBY(A2:A236,B2:B236+RANDARRAY(235)),23,"")
复制代码



image.jpg

评分

2

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-17 07:17 , Processed in 0.037849 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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