Excel VBA 用字典方法做先进先出法

7 篇文章 1 订阅

多年前,一家外包公司帮我司一物业公司做仓库收发存管理软件,我方要求先进先出法,该外包公司称那需要加入批次管理,每次出库选择好批次才能实现先进先出。我以为,这完全是谬论,既然是先进先出,那就已经设定好了规律和逻辑,不需要再指定批次,否则那还叫什么先进先出。最近,闲来无事,用EXCEL编了个小程序,经调试,是可以做到先进先出的。上图:

 备注:出入库按入正出负的原则制订

完整代码:

Public Crr() As Integer, StartingPosition%
Sub FirstInFirstOut()
    Dim Arr, Brr, Drr, i%, TypeCount%, j%, MaxAmount%
    Dim Dic As Object
    Set Dic = CreateObject("scripting.dictionary")
    Arr = [A1].CurrentRegion

    '按字典方法,获取产品种类
    For i = 2 To UBound(Arr)
        If Arr(i, 2) >= 0 Then
        Dic(Arr(i, 1)) = Dic(Arr(i, 1)) + Arr(i, 2)
        End If
    Next
    TypeCount = Dic.Count
    Brr = Dic.Keys
    Drr = Dic.Items
    
    '获取进货的总数量
    MaxAmount = Application.WorksheetFunction.Max(Drr)
    ReDim Crr(1 To TypeCount, 1 To MaxAmount)

    For i = 2 To UBound(Arr)
        'If Arr(i, 2) > 0 Then
        For j = 0 To TypeCount - 1
            If Brr(j) = Arr(i, 1) Then
                If Arr(i, 2) > 0 Then
                '目标Crr,第一维度为j+1,第二维度的数量:cells(i,2),第二维度的单价:cells(i,3)
                    Call GetStartingPosition(j + 1)
                    Call AddDate(j + 1, Val(Arr(i, 2)), Val(Arr(i, 3)))
                    Exit For
                Else
                    Call DeleteDate(j + 1, Val(Arr(i, 2)), i)
                    Exit For
                End If
            End If
        Next
        'End If
    Next


End Sub
Sub GetStartingPosition(i As Integer)
    For k = 1 To UBound(Crr, 2)
        If Crr(i, k) = Empty Or Crr(i, k) = 0 Then
            StartingPosition = k
            Exit For
        End If
    Next
End Sub
Sub AddDate(i%, j%, k%)
    For x = StartingPosition To StartingPosition + j - 1
        Crr(i, x) = k
    Next
End Sub
Sub DeleteDate(i, j, CellsNumber)
    Dim OutTotalAmount%, Drr() As Integer
    ReDim Drr(1 To UBound(Crr, 2)) As Integer
    For x = 1 To -j
        OutTotalAmount = OutTotalAmount + Crr(i, x)
        Crr(i, x) = Empty
    Next
    Cells(CellsNumber, 4) = -OutTotalAmount
    
    For x = -j + 1 To UBound(Crr, 2)
        Drr(x - -j) = Crr(i, x)
        Crr(i, x) = Empty
    Next
    
    For Temp = 1 To UBound(Drr)
        Crr(i, Temp) = Drr(Temp)
    Next
    
End Sub

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值