ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 17903|回复: 33

[已解决] 关于货物先进先出

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-31 21:58 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本人想要根据入库时间早晚出库,做到先进先出,在自动输出到表单写明具体仓库出货量,就是表格中的出库仓库自动生成。
各位大大,谢谢啦{:soso_e100:} 66.rar (1.64 KB, 下载次数: 596)

TA的精华主题

TA的得分主题

发表于 2012-7-31 23:53 | 显示全部楼层
试试
  1. Sub test()
  2.     Dim arr, i&, d As Object, st1$, st2$
  3.     Dim brr, x&, j&, temp1, temp2&
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Sheet2.Range("a1").CurrentRegion.Sort key1:="商品名称", order1:=xlAscending, key2:="入库时间", order2:=xlAscending, header:=xlYes
  6.     arr = Sheet2.Range("a1").CurrentRegion
  7.     For i = 2 To UBound(arr)
  8.         st1 = arr(i, 1)
  9.         st2 = arr(i, 2) & "/" & arr(i, 3)
  10.         If Not d.exists(st1) Then
  11.             d(st1) = st2
  12.         Else
  13.             d(st1) = d(st1) & "|" & st2
  14.         End If
  15.     Next
  16.     brr = Sheet1.Range("A2", "c" & Sheet1.Range("a65536").End(xlUp).Row)
  17.     For i = 1 To UBound(brr)
  18.         st1 = brr(i, 1)
  19.         st2 = ""
  20.         If d.exists(st1) Then
  21.             x = brr(i, 2)
  22.             temp1 = Split(d(st1), "|")
  23.             For j = 0 To UBound(temp1)
  24.                 temp2 = Split(temp1(j), "/")(1)
  25.                 If x > temp2 Then
  26.                     If st2 = "" Then st2 = temp1(j) Else st2 = st2 & ";" & temp1(j)
  27.                     x = x - temp2
  28.                 Else
  29.                     If st2 = "" Then st2 = Split(temp1(j), "/")(0) & "/" & x Else st2 = st2 & ";" & Split(temp1(j), "/")(0) & "/" & x
  30.                     brr(i, 3) = st2
  31.                     Exit For
  32.                 End If
  33.             Next
  34.         End If
  35.     Next
  36.     Sheet1.Range("a2").Resize(UBound(brr), 3) = brr
  37. End Sub
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-7-31 23:54 | 显示全部楼层
请看附件
66.rar (8.86 KB, 下载次数: 552)

TA的精华主题

TA的得分主题

发表于 2012-8-1 00:14 | 显示全部楼层
yangyangzhifeng 发表于 2012-7-31 23:54
请看附件

如果再有一个名称为123 数量为40的试试

TA的精华主题

TA的得分主题

发表于 2012-8-1 00:39 | 显示全部楼层
本帖最后由 yangyangzhifeng 于 2012-8-1 08:10 编辑
AVEL 发表于 2012-8-1 00:14
如果再有一个名称为123 数量为40的试试


考虑不周,没有考虑重复商品,修改如下
  1. Sub test()
  2.     Dim arr, i&, d As Object, st1$, st2$
  3.     Dim brr, x&, j&, temp1, temp2&
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Sheet2.Range("a1").CurrentRegion.Sort key1:="商品名称", order1:=xlAscending, key2:="入库时间", order2:=xlAscending, header:=xlYes
  6.     arr = Sheet2.Range("a1").CurrentRegion
  7.     For i = 2 To UBound(arr)
  8.         st1 = arr(i, 1)
  9.         st2 = arr(i, 2) & "/" & arr(i, 3)
  10.         If Not d.exists(st1) Then
  11.             d(st1) = st2
  12.         Else
  13.             d(st1) = d(st1) & "|" & st2
  14.         End If
  15.     Next
  16.     brr = Sheet1.Range("A2", "c" & Sheet1.Range("a65536").End(xlUp).Row)
  17.     For i = 1 To UBound(brr)
  18.         st1 = brr(i, 1)
  19.         st2 = ""
  20.         If d.exists(st1) Then
  21.             x = brr(i, 2)
  22.             temp1 = Split(d(st1), "|")
  23.             For j = 0 To UBound(temp1)
  24.                 temp2 = Split(temp1(j), "/")(1)
  25.                 If x > temp2 Then
  26.                
  27.                     If st2 = "" Then st2 = temp1(j) Else st2 = st2 & ";" & temp1(j)
  28.                     If j = UBound(temp1) Then MsgBox "商品" & st1 & "-库存不够": brr(i, 3) = st2
  29.                     d(st1) = Replace(d(st1), temp1(j) & "|", "", , 1)
  30.                     x = x - temp2
  31.                 Else
  32.                     If st2 = "" Then st2 = Split(temp1(j), "/")(0) & "/" & x Else st2 = st2 & ";" & Split(temp1(j), "/")(0) & "/" & x
  33.                     d(st1) = Replace(d(st1), temp1(j), Split(temp1(j), "/")(0) & "/" & temp2 - x, , 1)
  34.                     brr(i, 3) = st2
  35.                     Exit For
  36.                 End If
  37.             Next
  38.         End If
  39.     Next
  40.     Sheet1.Range("a2").Resize(UBound(brr), 3) = brr
  41. End Sub
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-1 08:57 | 显示全部楼层
yangyangzhifeng 发表于 2012-8-1 00:39
考虑不周,没有考虑重复商品,修改如下

问题解决,各位大大太强了

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-6 15:05 | 显示全部楼层
yangyangzhifeng 发表于 2012-8-1 00:39
考虑不周,没有考虑重复商品,修改如下

嗯,可以了,那现在我想把各仓位出库的做一个详单,就如同表格3,怎么直接生成,谢谢了{:soso_e100:}
66.rar (10.58 KB, 下载次数: 380)

TA的精华主题

TA的得分主题

发表于 2012-8-6 23:01 | 显示全部楼层
搁[浅灬 发表于 2012-8-6 15:05
嗯,可以了,那现在我想把各仓位出库的做一个详单,就如同表格3,怎么直接生成,谢谢了

  1. Sub test()
  2.     Dim arr, i&, d As Object, st1$, st2$
  3.     Dim brr, x&, j&, temp1, crr
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Sheet2.Range("a1").CurrentRegion.Sort key1:="商品名称", order1:=xlAscending, key2:="入库时间", order2:=xlAscending, header:=xlYes
  6.     arr = Sheet2.Range("a1").CurrentRegion
  7.     For i = 2 To UBound(arr)
  8.         st1 = arr(i, 1)
  9.         st2 = i
  10.         If Not d.exists(st1) Then
  11.             d(st1) = st2
  12.         Else
  13.             d(st1) = d(st1) & "|" & st2
  14.         End If
  15.     Next
  16.     brr = Sheet1.Range("A2", "c" & Sheet1.Range("a65536").End(xlUp).Row)
  17.     ReDim crr(1 To UBound(arr) + UBound(brr), 1 To 3)
  18.     crr(1, 1) = "商品名称": crr(1, 2) = "仓库": crr(1, 3) = "出货数量"
  19.     y = 1
  20.     For i = 1 To UBound(brr)
  21.         st1 = brr(i, 1)
  22.         st2 = ""
  23.         If d.exists(st1) Then
  24.             x = brr(i, 2)
  25.             temp1 = Split(d(st1), "|")
  26.             For j = 0 To UBound(temp1)
  27.                 If x > arr(temp1(j), 3) Then
  28.                     If st2 = "" Then st2 = arr(temp1(j), 2) & "/" & arr(temp1(j), 3) Else st2 = st2 & ";" & arr(temp1(j), 2) & "/" & arr(temp1(j), 3)
  29.                     If j = UBound(temp1) Then MsgBox "商品" & st1 & "-库存不够": brr(i, 3) = st2
  30.                     d(st1) = Replace(d(st1), temp1(j) & "|", "", , 1)
  31.                     x = x - arr(temp1(j), 3)
  32.                     y = y + 1
  33.                     crr(y, 1) = arr(temp1(j), 1): crr(y, 2) = arr(temp1(j), 2): crr(y, 3) = arr(temp1(j), 3)
  34.                     arr(temp1(j), 1) = "": arr(temp1(j), 2) = "": arr(temp1(j), 3) = "": arr(temp1(j), 4) = ""
  35.                 Else
  36.                     If st2 = "" Then st2 = arr(temp1(j), 2) & "/" & x Else st2 = st2 & ";" & arr(temp1(j), 2) & "/" & x
  37.                     brr(i, 3) = st2
  38.                     arr(temp1(j), 3) = arr(temp1(j), 3) - x
  39.                      y = y + 1
  40.                     crr(y, 1) = arr(temp1(j), 1): crr(y, 2) = arr(temp1(j), 2): crr(y, 3) = x
  41.                     If arr(temp1(j), 3) = 0 Then arr(temp1(j), 1) = "": arr(temp1(j), 2) = "": arr(temp1(j), 3) = "": arr(temp1(j), 4) = ""
  42.                     Exit For
  43.                 End If
  44.             Next
  45.         End If
  46.     Next
  47.     Sheet1.Range("a2").Resize(UBound(brr), 3) = brr
  48.     Sheet2.Range("a1").Resize(UBound(arr), UBound(arr, 2)) = arr
  49.     Sheet2.Range("a1").Resize(UBound(arr), UBound(arr, 2)).Sort key1:="商品名称", order1:=xlAscending, key2:="入库时间", order2:=xlAscending, header:=xlYes
  50.     Sheet3.Cells.ClearContents: Sheet3.Range("a1").Resize(y, 3) = crr
  51. End Sub

复制代码
66.rar (9.35 KB, 下载次数: 832)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-8 17:58 | 显示全部楼层
yangyangzhifeng 发表于 2012-8-6 23:01

谢谢,因为我们使用的是勤哲,需要的是表格1写入商品名称,表格2通过表间公式自动提取库存,再通过宏排仓位后,把仓位的出货数量提取到表格3,再利用表间公式减去表格3,从而达到减去库存,所以表格2不能消去,所以各位大大再帮帮忙(如果你有更好思路欢迎说出,主要排拍仓位再自动减库存,太难了)谢谢啦

TA的精华主题

TA的得分主题

发表于 2012-8-8 19:31 | 显示全部楼层
搁[浅灬 发表于 2012-8-8 17:58
谢谢,因为我们使用的是勤哲,需要的是表格1写入商品名称,表格2通过表间公式自动提取库存,再通过宏排仓 ...

以上附件已经自动更新了库存,不知要什么效果?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-5 03:21 , Processed in 0.051093 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表