如何在Excel中实现无关联数据的两个表的全连接(笛卡尔积)
在Excel中高效生成两个无关联表格的笛卡尔积
以下是几种高效实现的方法,可根据数据量和使用场景选择:
方法1:Power Query(推荐,适合大数据量)
Power Query是Excel内置工具,无需公式或代码,操作直观且性能出色:
- 分别将两个数据源转为Excel表:选中数据区域,按
Ctrl+T,勾选「我的表格有标题」,假设两个表命名为Table1(含name列)和Table2(含number列) - 点击「数据」选项卡 → 「从表格/范围」,选择任意一个表进入Power Query编辑器
- 在编辑器中,点击「添加列」→ 「自定义列」,输入公式
=Table2,点击确定 - 点击新生成列右侧的展开按钮(双向箭头),选择展开所有列
- 点击「关闭并上载」,结果会自动导入新工作表,包含所有
name与number的组合
方法2:数组公式(适合小数据量)
如果数据量不大,用数组公式可快速生成结果:
假设name数据在A2:A4,number数据在C2:C4:
- 在
E2单元格输入公式:=INDEX($A$2:$A$4,INT((ROW(E2)-2)/COUNTA($C$2:$C$4))+1) - 在
F2单元格输入公式:=INDEX($C$2:$C$4,MOD(ROW(F2)-2,COUNTA($C$2:$C$4))+1) - 同时选中
E2:F2,下拉填充直到出现错误值,即可得到所有组合
方法3:VBA宏(适合重复批量操作)
如果需要频繁生成笛卡尔积,可编写VBA宏一键完成:
Sub GenerateCartesianProduct() Dim wsName As Worksheet, wsNum As Worksheet, wsOutput As Worksheet Dim lastRowName As Long, lastRowNum As Long Dim i As Long, j As Long, outputRow As Long ' 替换为你的工作表名称 Set wsName = ThisWorkbook.Sheets("Sheet1") Set wsNum = ThisWorkbook.Sheets("Sheet2") Set wsOutput = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) lastRowName = wsName.Cells(wsName.Rows.Count, "A").End(xlUp).Row lastRowNum = wsNum.Cells(wsNum.Rows.Count, "C").End(xlUp).Row ' 写入表头 wsOutput.Cells(1, 1) = "name" wsOutput.Cells(1, 2) = "number" outputRow = 2 ' 循环生成所有组合 For i = 2 To lastRowName For j = 2 To lastRowNum wsOutput.Cells(outputRow, 1) = wsName.Cells(i, "A").Value wsOutput.Cells(outputRow, 2) = wsNum.Cells(j, "C").Value outputRow = outputRow + 1 Next j Next i End Sub
使用说明:修改代码中的工作表名称和列号,按Alt+F11打开VBA编辑器,插入模块粘贴代码,运行宏即可生成结果
内容的提问来源于stack exchange,提问作者Sam Bennett
相关产品推荐
相关产品推荐

