各位老师好!
我根据以下的要求,让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 |