excel - VBA循环遍历具有嵌套for循环的列

标签 excel vba

我以前从未编写过代码,但对于一个项目,我正在分析梦幻篮球统计数据以确定哪些球队会在比赛中获胜。有 9 个统计类别,总共 12 支球队,在球队 1 和 2 之间的比赛中,在一个类别中表现更好的球队得到 1,另一支球队得到 0。平局给每个 0.5。总分相加,得分多的队伍获胜。

我编写了一个宏,将团队 1 与每个类别的所有其他团队进行比较,并相应地给他们一个 1 或 0。我无法编写一个循环,然后从团队 2 开始并将其与所有其他人进行比较。我已经尝试在其他两个周围放置一个 for 循环,但我似乎无法正确抵消它或让它工作。任何帮助,将不胜感激。我的代码如下。谢谢!

Sub WhoWins()

    Dim teamAcounter As Integer
    Dim teamBcounter As Integer
    Dim teamAanswercounter As Integer
    Dim teamBanswercounter As Integer
    'these counters keep track of where we are in the stats and answers


    Dim Number1 As Single
    Dim Number2 As Single
    'these are the numbers currently being used to determine a win


    Dim answer1 As Single
    Dim answer2 As Single
    Dim split As Single
    answer1 = 1
    split = 0.5
    answer2 = 0
    'these are used to store a winning/losing/draw value in answers

    teamAanswercounter = teamBcounter + 16
    teamBanswercounter = teamAanswercounter + 1


    Dim columncounter As Integer

    teamAcounter = 3

    For columncounter = 2 to 10


        For teamBcounter = 4 To 14



            Number1 = Cells(teamAcounter, columncounter).Value
            Number2 = Cells(teamBcounter, columncounter).Value

            If Number1 > Number2 Then
                Cells(teamAanswercounter, columncounter).Value = 1 'answer1
                Cells(teamBanswercounter, columncounter).Value = 0 'answer2

            ElseIf Number2 > Number1 Then
                Cells(teamAanswercounter, columncounter).Value = 0 'answer2
                Cells(teamBanswercounter, columncounter).Value = 1 'answer1

             ElseIf Number1 = Number2 Then
                Cells(teamAanswercounter, columncounter).Value = split
                Cells(teamBanswercounter, columncounter).Value = split

            End If

            teamAanswercounter = teamAanswercounter + 3
            teamBanswercounter = teamAanswercounter + 1

        Next teamBcounter
        'teamBcounter = 4
        'teamAcounter = 3
        teamAanswercounter = teamBcounter + 1
        teamBanswercounter = teamAanswercounter + 1


    Next columncounter


End Sub

excel shapshot

最佳答案

这是我对您需要的代码的看法。我已经评论它以帮助理解。

Sub WhoWins()

    Dim ws As Worksheet
    Dim rngTeams As Range
    Dim rngStats As Range
    Dim arrTeams As Variant
    Dim arrStats As Variant
    Dim arrResults() As Variant
    Dim TeamAIndex As Long  'Think of this as the row for Team A
    Dim TeamBIndex As Long  'Think of this as the row for Team B
    Dim StatIndex As Long   'Think of this as the column
    Dim ResultIndex As Long
    Dim NumTeams As Long
    Dim NumStats As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")  'Change sheetname if necessary

    'Get the list of teams
    Set rngTeams = ws.Range("A3", ws.Range("A3").End(xlDown))

    'Get the range of statistics
    Set rngStats = rngTeams.Offset(, 1).Resize(, WorksheetFunction.CountA(ws.Rows(rngTeams.Row)) - 1)

    'Convert the ranges into arrays
    arrTeams = Application.Transpose(rngTeams.Value)
    arrStats = rngStats.Value
    NumTeams = UBound(arrTeams) - LBound(arrTeams) + 1
    NumStats = UBound(arrStats, 2) - LBound(arrStats, 2) + 1

    'Ready the results array
    ReDim arrResults(1 To WorksheetFunction.Combin(NumTeams, 2), 1 To 5)
        'arrResults columns
        '1 = TeamAName
        '2 = TeamAScore
        '3 = TeamBName
        '4 = TeamBScore
        '5 = Winner

    For TeamAIndex = LBound(arrTeams) To NumTeams - 1
        For TeamBIndex = TeamAIndex + 1 To NumTeams
            ResultIndex = ResultIndex + 1
            arrResults(ResultIndex, 1) = arrTeams(TeamAIndex)
            arrResults(ResultIndex, 2) = 0
            arrResults(ResultIndex, 3) = arrTeams(TeamBIndex)
            arrResults(ResultIndex, 4) = 0
            For StatIndex = LBound(arrStats, 2) To UBound(arrStats, 2)
                If arrStats(TeamAIndex, StatIndex) > arrStats(TeamBIndex, StatIndex) Then
                    'Team A wins the stat
                    arrResults(ResultIndex, 2) = arrResults(ResultIndex, 2) + 1
                ElseIf arrStats(TeamBIndex, StatIndex) > arrStats(TeamAIndex, StatIndex) Then
                    'Team B wins the stat
                    arrResults(ResultIndex, 4) = arrResults(ResultIndex, 4) + 1
                Else
                    'Tie
                    arrResults(ResultIndex, 2) = arrResults(ResultIndex, 2) + 0.5
                    arrResults(ResultIndex, 4) = arrResults(ResultIndex, 4) + 0.5
                End If
            Next StatIndex
            If arrResults(ResultIndex, 2) > arrResults(ResultIndex, 4) Then
                'Team A Wins the game
                arrResults(ResultIndex, 5) = arrTeams(TeamAIndex)
            ElseIf arrResults(ResultIndex, 4) > arrResults(ResultIndex, 2) Then
                'Team B Wins the game
                arrResults(ResultIndex, 5) = arrTeams(TeamBIndex)
            Else
                'Tie
                arrResults(ResultIndex, 5) = "Tie"
            End If
        Next TeamBIndex
    Next TeamAIndex

    'Output the results
    With ws.Cells(rngTeams.Row + rngTeams.Rows.Count + 1, "A").Resize(, UBound(arrResults, 2))
        .Value = Array("Team A", "Team A Score", "Team B", "Team B Score", "Winner")    'Column headers for the results
        .Offset(1).Resize(ResultIndex).Value = arrResults  'Results data
    End With

End Sub

关于excel - VBA循环遍历具有嵌套for循环的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24189773/

相关文章:

arrays - VBA数组删除整列

excel - 在工作表上进行更改时使 VBA 函数自动更新 - excel

excel - 像使用数组一样使用 Excel 单元格

apache - 如何使用 Apache POI 从 Excel 电子表格获取图表信息?

Excel:VLOOKUP 返回 true 还是 false?

mysql - 无法在 Access VBA 中将日期自动格式化为数字

excel - 如何将每个单独的 excel 行导出到自己的单独 csv 文件?

vba - 根据当前周打开文件

excel - 用于对某个范围内与另一个范围内的单元格中的任何值相匹配的单元格进行计数的公式

vba - 是否可以在Word域代码中使用VBA函数?