多列查找作业编号,按出现次数返回对应卡车编号的技术需求
作业-卡车编号映射转换方案
现有调度表格如下:
| 卡车编号 | 作业1 | 作业2 | 作业3 |
|---|---|---|---|
| 71 | 5928 | 5928 | 5928 |
| 72 | 3958 | 5928 | 2971 |
| 73 | 2971 | 5928 | 2971 |
需要将其转换为以作业编号为列标题的表格,每个作业每出现一次,对应一行填入执行该作业的卡车编号(顺序无关),预期输出如下:
| 2971 | 3958 | 5928 |
|---|---|---|
| 72 | 72 | 71 |
| 73 | 71 | |
| 73 | 71 | |
| 72 | ||
| 73 |
一、公式方案(适用于Excel 365/2021及以上版本)
如果你的Excel支持动态数组函数,可按以下步骤操作:
提取唯一作业编号作为列标题
在空白单元格(如E1)输入公式:=UNIQUE(TOCOL(B2:D4,1))公式会自动提取作业区域内的非空唯一值,生成列标题。
填充对应卡车编号
在E2单元格输入数组公式,按Ctrl+Shift+Enter确认后,向右向下拖动填充:=IFERROR(INDEX($A$2:$A$4,SMALL(IF(($B$2:$D$4=E$1),ROW($B$2:$D$4)-ROW($B$2)+1,""),ROW(A1))),"")
二、VBA方案(适合所有Excel版本,操作简单)
以下是一键运行的VBA代码,你只需按步骤操作:
- 打开目标Excel文件,按下
Alt+F11打开VBA编辑器。 - 右键点击左侧工作簿名称,选择插入→模块。
- 将以下代码粘贴到模块窗口:
Sub ConvertJobTruckTable() Dim srcSheet As Worksheet, destSheet As Worksheet Dim srcRange As Range, cell As Range Dim jobDict As Object Dim jobList As Variant, truckNum As String Dim maxCount As Integer, i As Integer, j As Integer ' 配置源工作表和数据范围(根据实际修改) Set srcSheet = ThisWorkbook.Sheets("Sheet1") Set srcRange = srcSheet.Range("B2:D4") ' 创建新工作表存放结果 Set destSheet = ThisWorkbook.Sheets.Add(After:=srcSheet) destSheet.Name = "作业映射结果" ' 用字典存储每个作业对应的卡车编号列表 Set jobDict = CreateObject("Scripting.Dictionary") ' 遍历所有作业记录 For Each cell In srcRange If cell.Value <> "" Then truckNum = srcSheet.Cells(cell.Row, "A").Value If jobDict.Exists(cell.Value) Then jobDict(cell.Value) = jobDict(cell.Value) & "," & truckNum Else jobDict(cell.Value) = truckNum End If End If Next cell ' 写入列标题 destSheet.Range("A1").Resize(1, jobDict.Count).Value = jobDict.Keys ' 计算最大行数 maxCount = 0 For Each jobList In jobDict.Items i = UBound(Split(jobList, ",")) + 1 If i > maxCount Then maxCount = i Next jobList ' 填充卡车编号数据 For i = 1 To maxCount For j = 1 To jobDict.Count jobList = Split(jobDict.Items(j - 1), ",") If i - 1 <= UBound(jobList) Then destSheet.Cells(i + 1, j).Value = jobList(i - 1) Else destSheet.Cells(i + 1, j).Value = "" End If Next j Next i ' 自动调整列宽 destSheet.Columns.AutoFit MsgBox "转换完成!结果已存放在新工作表中。" End Sub - 修改代码中的
Set srcSheet = ThisWorkbook.Sheets("Sheet1")和Set srcRange = srcSheet.Range("B2:D4")为你实际的工作表名称和数据范围。 - 按下
F5运行代码,或回到Excel界面,点击开发工具→宏,选择ConvertJobTruckTable执行。
代码运行后会自动生成新工作表并输出目标表格。
内容的提问来源于stack exchange,提问作者Zackary Chairvolotti
相关产品推荐
相关产品推荐

