用Excel中的VBA编制明细表
我正在制定一个时间表,确定谁将做饭,谁将和一些朋友一起为旅行洗碗。 我在“A”栏中列出了参与者的姓名,并使用CountIf查看特定人员出现在时间表上的次数,以确保对每个人都公平。代码会随机挑选两个人做饭,两个人洗碗,确保他们不一样。然后将这些名称放入我在工作表中定义的计划中。 我当前的代码看起来是这样的,并且按照预期工作用Excel中的VBA编制明细表,excel,vba,Excel,Vba,我正在制定一个时间表,确定谁将做饭,谁将和一些朋友一起为旅行洗碗。 我在“A”栏中列出了参与者的姓名,并使用CountIf查看特定人员出现在时间表上的次数,以确保对每个人都公平。代码会随机挑选两个人做饭,两个人洗碗,确保他们不一样。然后将这些名称放入我在工作表中定义的计划中。 我当前的代码看起来是这样的,并且按照预期工作 Private Sub cookplan() last_row = Range("A1").End(xlDown).Row Dim awesome() Dim index1 A
Private Sub cookplan()
last_row = Range("A1").End(xlDown).Row
Dim awesome()
Dim index1 As Integer
Dim index2 As Integer
Dim cook1 As String
Dim cook2 As String
Dim dish1 As String
Dim dish2 As String
ReDim awesome(last_row - 1, 0)
For i = 0 To last_row - 1
awesome(i, 0) = Range("A" & i + 1)
Next
For i = 1 To 5
index1 = Int((last_row - 1 - 0 + 1) * Rnd + 0)
cook1 = awesome(index1, 0)
Cells(i * 2, 6).Value = cook1
Do
index2 = Int((last_row - 1 - 0 + 1) * Rnd + 0)
cook2 = awesome(index2, 0)
Cells(i * 2, 7).Value = cook2
Loop While cook2 = cook1
Do
index1 = Int((last_row - 1 - 0 + 1) * Rnd + 0)
dish1 = awesome(index1, 0)
Loop While dish1 = cook1 Or dish1 = cook2
Do
index2 = Int((last_row - 1 - 0 + 1) * Rnd + 0)
dish2 = awesome(index2, 0)
Loop While dish2 = cook1 Or dish2 = cook2 Or dish2 = dish1
Cells(i * 2, 8).Value = dish1
Cells(i * 2, 9).Value = dish2
Next
End Sub
有没有办法使一个名字出现最多和最少的次数?现在,当我运行代码并查看CountIf结果时,2到3次似乎是一个合理的数字
更新
我现在已经让代码按预期工作。每个人至少需要一个烹饪和洗碗的任务,所以编码现在看起来像这样。我知道它并不漂亮,但它完成了任务:)
您可以将随机生成放在一个separte函数中,如果所选名称已使用两次,该函数将检查工作表。如果为false,则返回名称。如果为true,函数将调用自身(从而生成新名称),直到找到符合条件的名称 更新请注意,这是一种伪代码,不适用 在子计划中,每次需要新名称时,都要添加函数名
cook1 = GetName()
在结束子项之后插入一个名为GetName的新函数(或任何您想要的函数)
您可以将随机生成放在一个separte函数中,如果所选名称已使用两次,该函数将检查工作表。如果为false,则返回名称。如果为true,函数将调用自身(从而生成新名称),直到找到符合条件的名称 更新请注意,这是一种伪代码,不适用 在子计划中,每次需要新名称时,都要添加函数名
cook1 = GetName()
在结束子项之后插入一个名为GetName的新函数(或任何您想要的函数)
当您随机化事物时,无法排除已经出现的值的外观。唯一合理的解决方案是检查已出现的人员的最大次数,如果是,则重新运行随机程序以获得新名称。实际上,您可以使用解算器而不是vba。它是一个内置插件,用于解决各种场景。网站上有足够的教程。一旦某个名称被最多使用次数,您还可以删除/缩小可用名称的列表。字典会很好。当你随机化事物时,没有办法排除已经出现的值的外观。唯一合理的解决方案是检查已出现的人员的最大次数,如果是,则重新运行随机程序以获得新名称。实际上,您可以使用解算器而不是vba。它是一个内置插件,用于解决各种场景。网站上有足够的教程。一旦某个名称被最多使用次数,您还可以删除/缩小可用名称的列表。你最初的评论让我思考并找到了解决办法。虽然没有那么顺利,但这是一件了不起的事。请看我帖子中的更新:)谢谢你最初的评论让我思考并找到了解决方案。虽然没有那么顺利,但这是一件了不起的事。请参阅我帖子中的更新:)谢谢
Function GetName() As String
'Determine your name here
If CountForDeterminedName > 2 Then
'Call Function Again to find another Name
GetName = GetName()
Else
GetName = DeterminedName
End If
End Function