字典写入excel_Excel中“先出式”出货的问题,以后出库太方便了

来自Excel之家,侵联系删

先说一下,我们这里说的先进先出,不是数据结构上的队列……就只是一种就事论事——

百度是这么说的,先进先出是根据先入库先发出的原则,对于发出的存货以先入库存货的单价计算发出存货成本的方法……

19933e3c9bab378b9171d1c1afb15adf.png

这事看起来很复杂,代码实现起来……简单。

举个例子。

下图是一份库存表。

56dba114eb487e86c3249867a8386880.png

B列是产品名称,D列是单价,C列是进货数量,E列是已出库的数量,F列是实际存货的数量……

下图是一张出货单。本着没事就偷懒的原则,这张出货单星光模拟的极其简陋,没有出货日期,也没有出货单号……

9b5d9a52b4cf4d6b3b4bb02f926deda2.png

假设咱们现在出货的产品名称是:星光牌印钞机,出货数据量是150……

那咱们就要去库存表里找星光牌印钞机了……

在第3行找到了一条记录,可惜存货量为0,没用,继续向下找……

在第4行又找到了一条记录,只有23个,先拿过来,此时我们还需要150-23=127个星光牌印钞机……

在第9行又找到了一条记录,有144个,用不了这么多,拿过来127就够了,剩下的录入结余数……

所以计算完成后的出货单是下面这样子。

afd727ab9ca8ebbe0e414030fa5e91ab.png

库存表就变成了酱紫:

5edfdd56c80b7c36b832accb591443e3.png

把以上找星光牌印钞机的过程用VBA代码描述下来就好了。

动图如下:

e74f847812b937e4fdffb665221c09b6.gif

代码如下:

Sub FirstInFirstOut()

Dim arr As Variant

Dim Pname As String

Dim Pnum As Long, i As Long, j As Long

Dim Jnum As Long, k As Long, Tnum As Long

With Sheets("出库单")

.Select

Pname = Range("b2").Value

'出货产品的名称

Pnum = Range("e2").Value

'出货产品的数量

End With

If Pname = "" Or Pnum = 0 Then MsgBox "老板,您的信息填写不完整。": Exit Sub

arr = Sheets("库存表").Range("a1").CurrentRegion

'库存表的数据装入数组arr

ReDim brr(1 To UBound(arr), 1 To 6)

'结果数组,出库单只有6列,故设置为6列。最大行数不可能超过数据源arr,故设置为arr的行数

ReDim crr(1 To UBound(arr), 1 To 1)

'用于保存每个库存表商品出库的数量

For i = 1 To UBound(arr)

If arr(i, 2) = Pname Then

'如果库存表的产品名称等于出库单产品名称

Jnum = arr(i, 6) '结存数量

If Jnum > 0 Then '如果有结存数量

k = k + 1

If Jnum >= Pnum Then '如果结存数大于目标数

brr(k, 4) = Pnum '数量

Else

brr(k, 4) = Jnum

End If

brr(k, 1) = k '序号

brr(k, 2) = arr(i, 2) '商品名称

brr(k, 3) = arr(i, 1) '进货日期

brr(k, 5) = arr(i, 4) '单价

brr(k, 6) = brr(k, 4) * brr(k, 5) '金额

crr(i, 1) = brr(k, 4)

'将出库的商品数量记录起来

Tnum = Tnum + Jnum '累加总出库数量

Pnum = Pnum - Jnum

If Pnum <= 0 Then Exit For

End If

End If

Next

If Pnum > 0 Then

MsgBox "老板,冷静,你家的货不够出了啊。" & vbCrLf & _

"库存数量:" & Tnum & vbCrLf & _

"出货数量:" & Range("e2").Value

Else

Sheets("出库单").UsedRange.Offset(3).ClearContents

Range("a4").Resize(k, UBound(brr, 2)) = brr '数据写入出库单

For i = 1 To UBound(crr)

If crr(i, 1) > 0 Then

'将出库的数量写入库存表

With Sheets("库存表").Cells(i, 5)

.Value = crr(i, 1) + .Value

End With

End If

Next

MsgBox "ok"

End If

End Sub

小贴士:

1,代码里有注释。

2,很多时候代码做的事,只是把人工做的过程直白的描述出来,特别是VBA这种简单的小程序,数据量不大,也用不到什么算法,就是换个语言叙事而已。

3,不要把问题想的复杂,循环最重要,不行就循环,把自己要的数据先挑出来再说。一个循环不够,你就再弄一个,就Excel那点数据,效率也不会差到哪里去……能解决问题就好。

82e30371f07e58b1018c271c17795ac4.png

比如,倘若是多品项先进先出法出货,如果想思路简单,那就再套一个循环一个个计算每个品项……当然啦,你如果了解字典,也可以用字典。但从解决问题的角度,那不是必须的。

练习素材分享:

“素材”可以私信进了领取,点击私聊,输入“库存素材”,请用正式版今日头条

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本实验使用一下算 使用rand()函数随机产生页面号,用数组装入页面号,模拟页面调入内存发生页面置换的过程。 整个过程,都是使用数组来实现每个算,模拟队列,模拟堆栈的功能,实现每一个置换算。 页面置换算 最佳置换算(OPT):选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内存。用于算评价参照。 随机置换算 (S):产生一个取值范围在0和N-1之间的随机数,该随机数即可表示应被淘汰出内存的页面。 先进先出置换算(FIFO):选择最先进入内存即在内存驻留时间最久的页面换出到外存。 最近最久未使用置换算(LRU): 以“最近的过去”作为“最近的将来”的近似,选择最近一段时间最长时间未被访问的页面淘汰出内存 Clock置换算:为进入内存的页面设置一个访问位,当内存某页被访问,访问位置一,算在选择一页淘汰时,只需检查访问位,若为0,则直接换出,若为1,置该访问位为0,检测内存的下一个页面的访问位。 改进型Clock置换算: ①从查寻指针当前位置起扫描内存分页循环队列,选择A=0且M=0的第一个页面淘汰;若未找到,转② ② 开始第二轮扫描,选择A=0且M=1的第一个页面淘汰,同时将经过的所有页面访问位置0;若不能找到,转①
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值