| 楼主 wcymiss
 | Q:如何按库存量对订单中的欠货进行分配?“订单”表是订单日期与欠货的明细,“库存”表是现有库存,现在需要根据订单时间的先后顺序,把库存里面的货分给客户,最终的结果就如“分配”表所示。同一个品名,订单时间早的,要把库存里面的货先给它分配。(下图依次为订单、分配、库存) 
 
   
 
   
 
   A:先将订单表按“品名”、“订单日期”进行升序排序。然后,按alt+F11,将下面的代码拷贝至“订单”表下。
  Sub 按库存分配订单()
    Dim d, arr, i&, arrt(), k
    Set d = CreateObject("scripting.Dictionary") '定义字典
    With Sheets("库存")
        arr = .Range("A1").CurrentRegion.Value '将库存表区域赋值给数组
        For i = 2 To UBound(arr, 1)
            If d.Exists(arr(i, 1)) Then
                d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2) '库存的品名作为字典Key值,同品名的汇总库存量作为Item值。
                Else: d.Add arr(i, 1), arr(i, 2)
            End If
        Next i
    End With
    k = d.Items '将字典的Item赋值给数组
    arr = Range("A1").CurrentRegion.Value '将订单表区域赋值给数组
    ReDim arrt(1 To UBound(arr, 1), 1 To 2) '重定义数组arrt,以备赋值
    arrt(1, 1) = "可分配量": arrt(1, 2) = "备注"
    With Sheets("分配")
        .Cells.Clear '清楚即将要填写数据的区域
        .Range("a1").Resize(UBound(arr, 1), UBound(arr, 2)) = arr '将数组arr也就是订单表的数据复制到分配表
        For i = 2 To UBound(arr, 1)
            If d.Exists(arr(i, 2)) Then
                arrt(i, 1) = Application.Min(arr(i, 5), d(arr(i, 2))) '比较库存与订单的大小,取最小值。
                d(arr(i, 2)) = d(arr(i, 2)) - arrt(i, 1) '扣除已分配的数量后赋值给Item
                arrt(i, 2) = arrt(i, 1) & "*已分配"
                Else: arrt(i, 1) = 0
            End If
        Next i
        .Range("a1").Offset(0, UBound(arr, 2)).Resize(UBound(arr, 1), 2) = arrt '数组复制到分配表
        Range("a1").Copy
        .Range("A1").CurrentRegion.Rows(1).PasteSpecial xlPasteFormats '设置标题行格式
        .Columns(4).NumberFormat = "yyyy-mm-dd" '将日期数据设置格式
        .Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous '设置边框
    End With
    Set d = Nothing
End Sub
 
  如何按库存量对订单进行分配?(vba字典).rar 
 |