Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Excel中的VBA编制明细表_Excel_Vba - Fatal编程技术网

用Excel中的VBA编制明细表

用Excel中的VBA编制明细表,excel,vba,Excel,Vba,我正在制定一个时间表,确定谁将做饭,谁将和一些朋友一起为旅行洗碗。 我在“A”栏中列出了参与者的姓名,并使用CountIf查看特定人员出现在时间表上的次数,以确保对每个人都公平。代码会随机挑选两个人做饭,两个人洗碗,确保他们不一样。然后将这些名称放入我在工作表中定义的计划中。 我当前的代码看起来是这样的,并且按照预期工作 Private Sub cookplan() last_row = Range("A1").End(xlDown).Row Dim awesome() Dim index1 A

我正在制定一个时间表,确定谁将做饭,谁将和一些朋友一起为旅行洗碗。 我在“A”栏中列出了参与者的姓名,并使用CountIf查看特定人员出现在时间表上的次数,以确保对每个人都公平。代码会随机挑选两个人做饭,两个人洗碗,确保他们不一样。然后将这些名称放入我在工作表中定义的计划中。 我当前的代码看起来是这样的,并且按照预期工作

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