如何在Excel中生成A列参赛者的仅两两组合?
Excel生成两两参赛者组合的方法
假设你的参赛者姓名在A列(示例为A1:A5,无表头),以下是几种仅生成两两组合的可行方法:
方法一:公式法(无需宏)
生成不重复的两两组合(如John-Melinda,不重复生成Melinda-John)
在B1单元格输入以下公式,下拉填充直到出现空值:
=IF(ROW()-1>COMBIN(COUNTA(A:A),2),"",INDEX(A:A,INT((SQRT(8*(ROW()-1)+1)-1)/2)+1)&"-"&INDEX(A:A,ROW()-1-INT((SQRT(8*(ROW()-1)+1)-1)/2)*(INT((SQRT(8*(ROW()-1)+1)-1)/2)+1)/2+INT((SQRT(8*(ROW()-1)+1)-1)/2)+2))
公式说明:COMBIN(COUNTA(A:A),2)计算总组合数,通过数学公式遍历所有i<j的配对,避免重复。
生成双向两两组合(同时包含John-Melinda和Melinda-John)
在B1单元格输入以下公式,下拉填充至空值:
=IF(ROW()>COUNTA(A:A)*COUNTA(A:A)-COUNTA(A:A),"",INDEX(A:A,INT((ROW()-1)/(COUNTA(A:A)-1))+1)&"-"&INDEX(A:A,MOD(ROW()-1,COUNTA(A:A)-1)+IF(MOD(ROW()-1,COUNTA(A:A)-1)>=INT((ROW()-1)/(COUNTA(A:A)-1)),2,1)))
方法二:VBA宏法
按Alt+F11打开VBA编辑器,插入模块后粘贴对应代码,运行宏即可生成组合:
生成不重复两两组合
Sub GenerateUniquePairs() Dim nameRange As Range Dim names() As String Dim i As Integer, j As Integer Dim outputRow As Integer ' 定位A列所有非空姓名单元格 Set nameRange = Range("A1", Range("A" & Rows.Count).End(xlUp)) names = nameRange.Value outputRow = 1 ' 输出到B列起始行,可自行修改 ' 遍历i<j的配对,避免重复 For i = 1 To UBound(names) For j = i + 1 To UBound(names) Cells(outputRow, 2).Value = names(i, 1) & "-" & names(j, 1) outputRow = outputRow + 1 Next j Next i End Sub
生成双向两两组合
Sub GenerateAllPairs() Dim nameRange As Range Dim names() As String Dim i As Integer, j As Integer Dim outputRow As Integer Set nameRange = Range("A1", Range("A" & Rows.Count).End(xlUp)) names = nameRange.Value outputRow = 1 ' 遍历所有i≠j的配对 For i = 1 To UBound(names) For j = 1 To UBound(names) If i <> j Then Cells(outputRow, 2).Value = names(i, 1) & "-" & names(j, 1) outputRow = outputRow + 1 End If Next j Next i End Sub
方法三:Power Query法(可视化操作)
- 选中A列数据,点击「数据」选项卡 →「从表格/区域」,导入Power Query编辑器(若提示无表头,选择「我的表格有标题」或忽略,后续可调整列名)。
- 点击「添加列」→「自定义列」,输入公式:
=List.RemoveItems(Table.Column(#"更改的类型", "姓名"), {[姓名]}),将新列命名为「配对候选」。 - 点击新列右侧的展开按钮,选择「展开到新行」。
- 再次添加自定义列,输入公式:
=[姓名]&"-"&[配对候选]。 - 若需去重,点击「开始」→「删除行」→「删除重复项」,选择生成的组合列。
- 点击「关闭并上载」,将结果导入Excel表格。
内容的提问来源于stack exchange,提问作者user16068355
相关产品推荐
相关产品推荐

