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



我正在做一张计分表,记录一次智力竞赛的成绩。我将三支球队的得分分别保存到数组的一个元素中,我想检查这个元素以确定是否有平局以及哪些球队打平。谁能提供一些指导,告诉我最有效的方法是什么?

编辑:

我希望能有比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
对于较大的数组,我将使用Collection

回答问题:

无论如何,如果不遍历数据,就无法获得所需的信息。

可以结合使用WorksheetFunction.Large法和WorksheetFunction.Match法来得到每个队伍对应的排名。

要测试是否发生了平局,您需要使用SumProduct函数。关于如何在VBA中使用它,请参阅本文末尾(http://goo.gl/o9po),因为它可能有点棘手且不直观。

注:虽然我没有期望,也不需要比上述信息更多的东西来标记问题已回答(我相信我在我的问题中已经非常清楚了),但更多的信息无疑会有所帮助。鉴于此,为了将来可能来的人的利益,以下是我最终使用的代码:

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, 30, 60}
输出:

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, 30, 250}
输出:

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, 30, 30}
输出:

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

最新更新