You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多列查找作业编号,按出现次数返回对应卡车编号的技术需求

作业-卡车编号映射转换方案

现有调度表格如下:

卡车编号作业1作业2作业3
71592859285928
72395859282971
73297159282971

需要将其转换为以作业编号为列标题的表格,每个作业每出现一次,对应一行填入执行该作业的卡车编号(顺序无关),预期输出如下:

297139585928
727271
7371
7371
72
73

一、公式方案(适用于Excel 365/2021及以上版本)

如果你的Excel支持动态数组函数,可按以下步骤操作:

  1. 提取唯一作业编号作为列标题
    在空白单元格(如E1)输入公式:

    =UNIQUE(TOCOL(B2:D4,1))
    

    公式会自动提取作业区域内的非空唯一值,生成列标题。

  2. 填充对应卡车编号
    在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代码,你只需按步骤操作:

  1. 打开目标Excel文件,按下Alt+F11打开VBA编辑器。
  2. 右键点击左侧工作簿名称,选择插入→模块。
  3. 将以下代码粘贴到模块窗口:
    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
    
  4. 修改代码中的Set srcSheet = ThisWorkbook.Sheets("Sheet1")和Set srcRange = srcSheet.Range("B2:D4")为你实际的工作表名称和数据范围。
  5. 按下F5运行代码,或回到Excel界面,点击开发工具→宏,选择ConvertJobTruckTable执行。

代码运行后会自动生成新工作表并输出目标表格。


内容的提问来源于stack exchange,提问作者Zackary Chairvolotti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:21:06