【问题标题】:What is the most efficient way to determine if any two of three elements in an Excel VBA array are identical?确定 Excel VBA 数组中三个元素中的任何两个是否相同的最有效方法是什么?
【发布时间】:2015-11-02 21:16:20
【问题描述】:

我正在制作一个计分表来跟踪测验比赛中的分数。我将三支球队的每支球队的分数都保存到一个数组元素中,我想检查该元素以确定是否存在平局以及哪些球队平局。任何人都可以就解决此问题的最有效方法提供任何指导吗?

编辑:

我希望有比 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 语句,那很好,但我只是认为可能有更简单的方法。

【问题讨论】:

  • 请出示您现有的相关代码。
  • 第一列是团队分数数组吗?第三列是 TeamTie 数组吗?第2栏的意义是什么?你如何填充第一列?
  • @RonRosenfeld,对不起,这更清楚了吗?第一列中显示的分数是根据几个因素计算得出的,这些因素与测验者在正确回答问题方面的表现有关。我可以尝试解释这一点,但它确实看起来像是无关紧要的信息,只会分散我试图回答的问题的注意力。
  • @tlewis3348 我不明白你的布局,但既然你有一个可以使用的答案,我就不再追究了。
  • @RonRosenfeld 呃……好吧。我不确定我是否理解有什么不理解的。我希望我能让事情更清楚,但我想这个问题并没有我想象的那么有用。很抱歉浪费了大家的时间。

标签: vba excel


【解决方案1】:

三分之二:

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

【讨论】:

  • 这可能行得通。我希望有更漂亮的东西,但我想这不是什么大不了的事。
【解决方案2】:

问题答案:

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

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

要测试是否出现平局,您需要使用SumProduct 函数。请参阅本文末尾 (http://goo.gl/o9po),了解如何在 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, 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

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 2021-07-09
    • 2014-01-26
    • 2017-03-23
    • 2011-06-12
    • 2018-05-06
    • 2011-03-08
    • 2021-07-10
    相关资源
    最近更新 更多