MICROSOFT

EP10. “Possible Football Matches 列出所有可能对阵组合”

首页 Microsoft 工具 Excel · VBA · Loop · EP10
约 6 分钟· #EP10#Excel#Loop
🔒 登录后可标记已读
  • 这篇用双层循环列出一份球队清单里所有「两两配对」的可能对阵组合(比如 A 对 B、A 对 C、B 对 C,但不会重复列出 B 对 A)
  • 前置知识:EP06 冒泡排序里用到的双层循环和 CurrentRegion
  • 学完能理解「内层循环从 i + 1 开始」这个避免重复配对、避免自己对自己的经典写法
  • 也能套用在排班表、比赛赛程这类需要列出两两组合的场景

重点内容


适用版本

桌面版通用(Excel 365 / 2021 / 2019 等)。


完整 VBA 代码

Dim rng As Range, matchname As String, counter As Integer, i As Integer, j As Integer

Set rng = Range("A1").CurrentRegion
counter = 0

Worksheets(1).Columns(3) = ""

For i = 1 To rng.Count
    For j = i + 1 To rng.Count
        matchname = rng.Cells(i).Value & " vs " & rng.Cells(j).Value
        Cells(counter + 1, 3).Value = matchname
        counter = counter + 1
    Next j
Next i

ActiveSheet.Columns(3).PrintPreview

代码说明

  1. 声明 rng(球队清单范围)、matchname(拼出来的对阵字符串)、counter(已写入的对阵组合数)、ij(双层循环计数器)
  2. Set rng = Range("A1").CurrentRegion 自动抓取 A1 所在的连续数据区域(整份球队清单),不管清单有几支球队都能自动适应
  3. Worksheets(1).Columns(3) = "" 先清空第 3 列(C 列),准备写入这次的对阵结果
  4. 外层循环 i 从 1 到球队总数,内层循环 ji + 1 开始(不是从 1 开始)——这样能保证每对球队只会被组合一次,也不会出现「球队自己对自己」的情况
  5. matchname = rng.Cells(i).Value & " vs " & rng.Cells(j).Value& 把两支球队名字拼成 "球队A vs 球队B" 的字符串
  6. 把拼好的对阵写入 C 列的第 counter + 1 行,counter 加 1,让下一组对阵往下一行写
  7. 双层循环跑完后,用 ActiveSheet.Columns(3).PrintPreview 直接打开 C 列的打印预览,方便查看/打印完整对阵表

怎么运行

在 A 列从 A1 开始输入一份球队名单(比如 "Kickers"、"Shooters"、"Little Giants"),Alt + F11 打开 VBA 编辑器执行代码(或点命令按钮),C 列会列出所有球队两两配对的组合(例如 "Kickers vs Shooters"),并自动弹出打印预览。教程建议手动把 C 列文字居中,打印预览效果会更整齐。

[截图:宏运行完成后自动弹出的 Print Preview 打印预览窗口,显示 C 列列出的所有对阵组合]


学完你会

  • ✅ 会用内层循环从 i + 1 开始,避免重复配对和自己对自己
  • ✅ 会用 & 把两个值拼成一句描述性字符串
  • ✅ 会用 CurrentRegion 让代码自动适应清单长度,不用写死行数

常见错误

  • 内层循环如果写成 For j = 1 To rng.Count(从 1 开始而不是 i + 1),会重复列出"A vs B"和"B vs A"这种本质相同的对阵,也会多出"A vs A"这种无意义的自我配对
  • PrintPreview 会直接打开打印预览窗口,如果只是想看结果不想预览打印,可以把这行删掉或注释掉
  • 球队清单如果不是从 A1 开始的连续区域(中间有空行、或从别的单元格开始),CurrentRegion 抓到的范围会不符合预期,抓漏或抓多球队

Sources

Blog / Website:

  1. Possible Football Matches