确定Excel VBA数组中三个元素中的任意两个元素是否相同的最有效方法是什么?

确定Excel VBA数组中三个元素中的任意两个元素是否相同的最有效方法是什么?,vba,excel,Vba,Excel,我正在做一张记分表,以记录测验比赛的分数。我将三支球队的得分保存到数组的一个元素中,我想检查该元素以确定是否存在平局以及哪些球队平局。有没有人能提供一些指导,告诉我们最有效的方法是什么 编辑: 我希望得到比if语句更漂亮的东西(包含在下面的答案中),但在这一点上我没有更好的想法。老实说,我不知道我为什么会被否决。的确,我没有包括我的代码,因为虽然我已经考虑了一段时间的问题,我真的不知道从哪里开始。事实上,我明确要求只提供一些指导和适当的方法来进行这项工作,因为我不想表现出要求其他人为我做工作的样

我正在做一张记分表,以记录测验比赛的分数。我将三支球队的得分保存到数组的一个元素中,我想检查该元素以确定是否存在平局以及哪些球队平局。有没有人能提供一些指导,告诉我们最有效的方法是什么

编辑:

我希望得到比if语句更漂亮的东西(包含在下面的答案中),但在这一点上我没有更好的想法。老实说,我不知道我为什么会被否决。的确,我没有包括我的代码,因为虽然我已经考虑了一段时间的问题,我真的不知道从哪里开始。事实上,我明确要求只提供一些指导和适当的方法来进行这项工作,因为我不想表现出要求其他人为我做工作的样子。尽管如此,我将展示我试图重现的逻辑。我不确定我还能做什么

     Team Score      | Rank Description |   Team Tie ID
---------------------+------------------+-------------------
             / 250 \ | High Score       |            / 0 \
TeamScore1 = |  30 | | Low Score        | TeamTie1 = | 0 |
             \  60 / | Middle Score     |            \ 0 /
---------------------+------------------+-------------------
             / 250 \ | High score *TIE* |            / 1 \
TeamScore2 = |  30 | | Low Score        | TeamTie2 = | 0 |
             \ 250 / | High score *TIE* |            \ 1 /
---------------------+------------------+-------------------
             / 250 \ | High Score       |            / 0 \
TeamScore3 = |  30 | | Low Score *TIE*  | TeamTie3 = | 2 |
             \  30 / | Low Score *TIE*  |            \ 2 /
基本上,当任何一个队在测验结束时打成平局时,这两个队都会被问更多的问题,直到他们的分数改变以消除平局。我希望能够通过基于
TeamScore
数组生成
TeamTie
数组来检测团队何时处于平局状态。如果实现这一点的最佳方法是使用If语句,那么很好,但我只是认为可能有一种更简单的方法。

对于三分之二:

Public Function teext(SomeArray) As Boolean
    teext = False
    If SomeArray(1) = SomeArray(2) Or SomeArray(2) = SomeArray(3) Or SomeArray(1) = SomeArray(3) Then
        teext = True
    End If
End Function

对于较大的阵列,我将使用集合回答问题:

不管怎样,如果不在数据上循环,就无法获得所需的信息

您可以结合使用
WorksheetFunction.Large
方法和
WorksheetFunction.Match
方法来获得每个团队对应的排名

要测试是否出现平局,您需要使用
SumProduct
功能。有关如何在VBA中使用它的信息,请参见本文的结尾(),因为它可能有些棘手且不直观

注意:虽然我没有预料到,也不需要比上述信息更多的信息来标记问题的答案(我相信我在我的问题中已经非常清楚地说明了这一点),但更多的信息无疑会有所帮助。有鉴于此,为了未来可能到来的人们的利益,以下是我最终使用的代码:

Sub Test4Tie()
    ' Variable declaration
    Dim TeamScore(1 To 3) As Integer, NumTeams As Integer
    Dim TeamRank(1 To 3) As Integer, ScoreCount(1 To 3) As Integer
    Dim iTT As Integer, TeamScoreSrt(1 To 3) As Integer
    Dim TeamTie As Boolean, TeamScoreStr As String

    'Input the score for each team
    TeamScore(1) = 250
    TeamScore(2) = 30
    TeamScore(3) = 30

    'Input the number of teams
    NumTeams = 3

    For iTT = 1 To NumTeams
        ' Sort the teams from highest to lowest score
        TeamScoreSrt(iTT) = WorksheetFunction.Large(TeamScore, iTT)

        ' Create list of team scores to count the number of occurances of each score in
        If iTT < NumTeams Then
            TeamScoreStr = TeamScoreStr & CStr(TeamScore(iTT)) & ","
        Else
            TeamScoreStr = TeamScoreStr & CStr(TeamScore(iTT))
        End If
    Next iTT

    For iTT = 1 To NumTeams
        ' Count the number of occurances of each score
        ScoreCount(iTT) = Application.Evaluate("SUMPRODUCT(--({" & TeamScoreStr & "}=" & TeamScore(iTT) & "))")

        ' Get the rank of each score
        TeamRank(iTT) = WorksheetFunction.Match(TeamScore(iTT), TeamScoreSrt, 0)

        ' Detect ties
        If ScoreCount(iTT) > 1 Then
            TeamTie = True
        End If
        Debug.Print "TeamScore: " & TeamScore(iTT) & ", ScoreCount: " & ScoreCount(iTT) & ", TeamRank: " & TeamRank(iTT) & ", TeamTie: " & TeamTie
    Next iTT
End Sub
输出:

TeamScore: 250, ScoreCount: 1, TeamRank: 1, TeamTie: False
TeamScore: 30, ScoreCount: 1, TeamRank: 3, TeamTie: False
TeamScore: 60, ScoreCount: 1, TeamRank: 2, TeamTie: False
TeamScore: 250, ScoreCount: 1, TeamRank: 1, TeamTie: False
TeamScore: 30, ScoreCount: 1, TeamRank: 3, TeamTie: False
TeamScore: 50, ScoreCount: 1, TeamRank: 2, TeamTie: False
TeamScore: 250, ScoreCount: 1, TeamRank: 1, TeamTie: False
TeamScore: 30, ScoreCount: 2, TeamRank: 2, TeamTie: True
TeamScore: 30, ScoreCount: 2, TeamRank: 2, TeamTie: True
输入:

TeamScore = {250, 30, 60}
TeamScore = {250, 30, 250}
TeamScore = {250, 30, 30}
输出:

TeamScore: 250, ScoreCount: 1, TeamRank: 1, TeamTie: False
TeamScore: 30, ScoreCount: 1, TeamRank: 3, TeamTie: False
TeamScore: 60, ScoreCount: 1, TeamRank: 2, TeamTie: False
TeamScore: 250, ScoreCount: 1, TeamRank: 1, TeamTie: False
TeamScore: 30, ScoreCount: 1, TeamRank: 3, TeamTie: False
TeamScore: 50, ScoreCount: 1, TeamRank: 2, TeamTie: False
TeamScore: 250, ScoreCount: 1, TeamRank: 1, TeamTie: False
TeamScore: 30, ScoreCount: 2, TeamRank: 2, TeamTie: True
TeamScore: 30, ScoreCount: 2, TeamRank: 2, TeamTie: True
输入:

TeamScore = {250, 30, 60}
TeamScore = {250, 30, 250}
TeamScore = {250, 30, 30}
输出:

TeamScore: 250, ScoreCount: 1, TeamRank: 1, TeamTie: False
TeamScore: 30, ScoreCount: 1, TeamRank: 3, TeamTie: False
TeamScore: 60, ScoreCount: 1, TeamRank: 2, TeamTie: False
TeamScore: 250, ScoreCount: 1, TeamRank: 1, TeamTie: False
TeamScore: 30, ScoreCount: 1, TeamRank: 3, TeamTie: False
TeamScore: 50, ScoreCount: 1, TeamRank: 2, TeamTie: False
TeamScore: 250, ScoreCount: 1, TeamRank: 1, TeamTie: False
TeamScore: 30, ScoreCount: 2, TeamRank: 2, TeamTie: True
TeamScore: 30, ScoreCount: 2, TeamRank: 2, TeamTie: True

请显示您现有的相关代码。第一列是团队分数数组吗?第三个是团队关系阵列吗?第二栏的意义是什么?如何填充第一列?@RonRosenfeld,对不起,这更清楚吗?第一栏显示的分数是根据几个因素计算的,这些因素与测验者正确回答问题的能力有关。我可以尝试解释这一点,但它看起来确实像是无关的信息,只会分散我试图得到答案的问题的注意力。@tlewis3348我不理解您的布局,但既然您有一个可以使用的答案,我就不再继续了。@RonRosenfeld Uhh。。。可以我不确定我是否明白有什么不明白的。我希望我能把事情说得更清楚,但我想这个问题并没有我想象的那么有帮助。对不起,浪费了大家的时间。那可能有用。我希望能有更漂亮一点的,但我想这不是什么大不了的事。