excel中按多列进行匹配并对数量进行累加

公司的生产计划是按订单下发,但不同订单的不同产品中可能有用到相同的配件,按单1对1时,对计算机十分友好,但对于在配件库检料的工人来说就比较麻烦,上百条产品里可能会有多条都是相同的产品,首先考虑的办法是把数据进行了排序,让相同代号、材质、名称的数据挨在一起,但这样也并不是最优的,然后考虑的办法是把所有代号+材质+名称+领料人相同的数据的请领数量累加到一起,使其只有一条。下面是生产系统导出到excel中的数据,其中黄色底纹的就是相同数据:

代码就不细说了,做个流程图出来:

下面是代码,由于vba不能像javascript那样处理JSON数据,所以在用数组处理时比较麻烦:

Option Explicit

Private infos() As String


'汇总
Sub myTotal()
    Dim totalRowNumber As Integer
    Dim i As Integer
    Dim j As Integer
    Dim arrCount As Integer     '数组数据位置
    Dim id As String
    
    '数组初始位置
    arrCount = 2
    
    '获得总行数
    totalRowNumber = Sheets(1).[a1].End(xlDown).Row
    
    '调整数组大小(考虑到避免多次调整数组大小,所以直接定义一个跟数据行一样多的数组)
    ReDim infos(2 To totalRowNumber, 1 To 13)
    
    For i = 2 To totalRowNumber
        id = Sheets(1).Cells(i, 5) & "|" & Sheets(1).Cells(i, 6) & "|" & Sheets(1).Cells(i, 7) & "|" & Sheets(1).Cells(i, 8)
        If isExist(id) Then
        '判断当前行是否已存在数组中,如果存在则请领数量累加
            addRequireNumber id, Sheets(1).Cells(i, 9), Sheets(1).Cells(i, 2)
        Else
        '如果不存在则加入到数组中
            For j = 1 To 13
                infos(arrCount, j) = Sheets(1).Cells(i, j)
            Next
            '数组条数+1
            arrCount = arrCount + 1
        End If
    Next
    
    
    '清除区域数据
    Sheets(1).Range(totalRowNumber + 1 & ":65535").ClearContents
    
    '输出数组到表格中
    For i = 2 To UBound(infos)
        '如果infos(i,1)没有内容,说明后面都是空的行,所以就结束函数了
        If Len(infos(i, 1)) = 0 Then Exit Sub
        
        For j = 1 To 13
            Sheets(1).Cells(totalRowNumber + i, j) = infos(i, j)
        Next
    Next
End Sub

'判断数组是否存在
Private Function isExist(ByVal name As String) As Boolean
    Dim i As Integer
    Dim id As String
    
    For i = 2 To UBound(infos)
        id = infos(i, 5) & "|" & infos(i, 6) & "|" & infos(i, 7) & "|" & infos(i, 8)
        If name = id Then
            isExist = True
            Exit Function
        End If
    Next
    isExist = False
End Function

'数量累加
Private Sub addRequireNumber(ByVal name As String, ByVal requireNumber As Long, ByVal order As String)
    Dim i As Integer
    Dim id As String
    Dim subOrder As String
    
    '去掉订单的年号
    subOrder = Mid(order, InStr(1, order, "-") + 1, Len(order))
    
    For i = 2 To UBound(infos)
        id = infos(i, 5) & "|" & infos(i, 6) & "|" & infos(i, 7) & "|" & infos(i, 8)
        If name = id Then
            infos(i, 9) = Str(Int(infos(i, 9)) + Int(requireNumber))
            '如果订单号中没有包含相同的字符才添加
            If InStr(1, infos(i, 2), subOrder) = 0 Then
                infos(i, 2) = infos(i, 2) & "/" & subOrder
            End If
            Exit Sub
        End If
    Next
End Sub

相关推荐

  1. Excel:如何数据进行码值转换

    2024-06-16 07:32:01       40 阅读
  2. Python数组/矩阵进行累加-累乘-累除

    2024-06-16 07:32:01       48 阅读
  3. excel合并单元格保留数据

    2024-06-16 07:32:01       65 阅读
  4. Excel文件按照内容进行分组

    2024-06-16 07:32:01       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 07:32:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 07:32:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 07:32:01       82 阅读
  4. Python语言-面向对象

    2024-06-16 07:32:01       91 阅读

热门阅读

  1. 数据库面试

    2024-06-16 07:32:01       31 阅读
  2. MySQL的高可用方案:深入Galera Cluster和ProxySQL

    2024-06-16 07:32:01       75 阅读
  3. c++ 单例模式

    2024-06-16 07:32:01       23 阅读
  4. Elasticsearch机器学习初探:智能数据洞察

    2024-06-16 07:32:01       33 阅读
  5. 可以免费发外链的论坛有哪些?

    2024-06-16 07:32:01       33 阅读
  6. 012_redhat安装activemq

    2024-06-16 07:32:01       32 阅读
  7. Python

    Python

    2024-06-16 07:32:01      31 阅读
  8. 双指针【1】两数之和基础版 归并排序

    2024-06-16 07:32:01       29 阅读
  9. mybatis框架原理,组件,案例,优化,优缺点总结

    2024-06-16 07:32:01       31 阅读
  10. TPS、QPS、CPS、PV和UV

    2024-06-16 07:32:01       49 阅读
  11. 如何用蒙版制作玻璃划动效果

    2024-06-16 07:32:01       32 阅读
  12. Python知识点总结

    2024-06-16 07:32:01       37 阅读
  13. Redis

    Redis

    2024-06-16 07:32:01      35 阅读