ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 仓库先进先出公式设置求教

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-9-24 10:23 | 显示全部楼层 |阅读模式
各路大神,有一个仓库先进先出问题求教,入库表格列出入库的品名、日期、库位、数量等信息,出库时列出品名和数量,求教库位、和入库日期两列公式如何设置,在输入品名和数量后能够显示最早入库产品且没有被发出的货位和入库信息,谢谢。

先进先出公式.zip

7.02 KB, 下载次数: 115

TA的精华主题

TA的得分主题

发表于 2018-9-24 12:28 | 显示全部楼层
  1. Sub 先进先出计算出库()
  2.     Dim m, n, x, z, i, j, arr, brr, ar, br(), a, b, ai, s
  3.     Dim d As Object, k, t
  4.     Set d = CreateObject("scripting.dictionary")
  5.     ar = Range("A2").CurrentRegion
  6.     With Sheet1
  7.         arr = .Range("A3:D" & UBound(ar) + 4)
  8.         .[H1:K10000] = ""
  9.         .[H1].Resize(UBound(arr), 4) = arr
  10.         .Range("H1:K" & UBound(arr) + 1).Sort Key1:=.Range("I1"), Key2:=.Range("H1")
  11.         arr = .Range("H1").CurrentRegion
  12.     End With
  13.     For i = 1 To UBound(arr)
  14.         If Not d.exists(arr(i, 2)) Then
  15.             m = 1: ReDim brr(1 To 4, 1 To m)
  16.         Else
  17.             brr = d(arr(i, 2))
  18.             m = UBound(brr, 2) + 1: ReDim Preserve brr(1 To 4, 1 To m)
  19.         End If
  20.         For j = 1 To 4: brr(j, m) = arr(i, j): Next
  21.         d(arr(i, 2)) = brr
  22.     Next
  23.     k = d.keys: t = d.items
  24.     For i = 2 To UBound(ar)
  25.         For x = 0 To d.Count - 1
  26.             If ar(i, 2) = k(x) Then
  27.                 If t(x)(3, 1) >= ar(i, 3) Then
  28.                     n = n + 1: ReDim Preserve br(1 To 5, 1 To n)
  29.                     br(1, n) = ar(i, 1)
  30.                     br(2, n) = k(x)
  31.                     br(3, n) = ar(i, 3)
  32.                     br(4, n) = t(x)(4, 1)
  33.                     br(5, n) = t(x)(1, 1)
  34.                 Else
  35.                     a = 0
  36.                     For y = 1 To UBound(t(x), 2)
  37.                         a = a + t(x)(3, y)
  38.                         If a >= ar(i, 3) Then ai = y: Exit For
  39.                     Next
  40.                     b = 0
  41.                     For y = 1 To ai - 1
  42.                         b = b + t(x)(3, y)
  43.                         n = n + 1: ReDim Preserve br(1 To 5, 1 To n)
  44.                         For z = 2 To 4
  45.                             br(z, n) = t(x)(z, y)
  46.                         Next
  47.                         br(1, n) = ar(i, 1)
  48.                         br(5, n) = t(x)(1, y)
  49.                     Next
  50.                     n = n + 1: ReDim Preserve br(1 To 5, 1 To n)
  51.                     br(1, n) = ar(i, 1)
  52.                     br(2, n) = k(x)
  53.                     br(3, n) = ar(i, 3) - b
  54.                     br(4, n) = t(x)(4, ai)
  55.                     br(5, n) = t(x)(1, ai)
  56.                 End If
  57.             End If
  58.         Next
  59.     Next
  60.     s = Range("A2:E2")
  61.     [H2].Resize(1, 5) = s: [H3].Resize(n, 5) = Application.Transpose(br)
  62.     Set d = Nothing
  63. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-9-24 12:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
QQ截图20180924123902.png

TA的精华主题

TA的得分主题

发表于 2018-9-24 15:05 | 显示全部楼层
D3:E10{=INDEX(IF(COLUMN(A1)=1,入库!$D$3:$D$13,入库!$A$3:$A$13),MATCH(,0/((入库!$B$3:$B$13=$B3)*SUMIF(OFFSET(入库!$B$3,,,ROW($1:$11)),入库!$B$3:$B$13,入库!$C$3:$C$13)>=SUMIF($B$3:$B3,$B3,$C$3:$C3)),))

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-9-24 16:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub 先进先出计算出库()
  2.     Range("H1:L10000") = ""
  3.     Dim m, n, x, y, z, i, j, arr, brr, ar, br(), a, b, ai, s
  4.     Dim d As Object, k, t
  5.     Set d = CreateObject("scripting.dictionary")
  6.     ar = Range("A2").CurrentRegion
  7.     With Sheet1
  8.         arr = .Range("A3:D" & UBound(ar) + 4)
  9.         .[H1:K10000] = ""
  10.         .[H1].Resize(UBound(arr), 4) = arr
  11.         .Range("H1:K" & UBound(arr) + 1).Sort Key1:=.Range("I1"), Key2:=.Range("H1")
  12.         arr = .Range("H1").CurrentRegion
  13.         .Range("H1:K10000") = ""
  14.     End With
  15.     For i = 1 To UBound(arr)
  16.         If Not d.exists(arr(i, 2)) Then
  17.             m = 1: ReDim brr(1 To 4, 1 To m)
  18.         Else
  19.             brr = d(arr(i, 2))
  20.             m = UBound(brr, 2) + 1: ReDim Preserve brr(1 To 4, 1 To m)
  21.         End If
  22.         For j = 1 To 4: brr(j, m) = arr(i, j): Next
  23.         d(arr(i, 2)) = brr
  24.     Next
  25.     k = d.keys: t = d.items
  26.     For i = 2 To UBound(ar)
  27.         For x = 0 To d.Count - 1
  28.             If ar(i, 2) = k(x) Then
  29.                 If t(x)(3, 1) >= ar(i, 3) Then
  30.                     n = n + 1: ReDim Preserve br(1 To 5, 1 To n)
  31.                     br(1, n) = ar(i, 1)
  32.                     br(2, n) = k(x)
  33.                     br(3, n) = ar(i, 3)
  34.                     br(4, n) = t(x)(4, 1)
  35.                     br(5, n) = t(x)(1, 1)
  36.                     t(x)(3, 1) = t(x)(3, 1) - ar(i, 3)
  37.                 Else
  38.                     a = 0
  39.                     For y = 1 To UBound(t(x), 2)
  40.                         a = a + t(x)(3, y)
  41.                         If a >= ar(i, 3) Then ai = y: Exit For
  42.                     Next
  43.                     If a < ar(i, 3) Then MsgBox "【" & k(x) & "】计划出库数 【" & _
  44.                         ar(i, 3) & "】超过库存量【" & a & "】了!", vbOKCancel, "提示:": Exit Sub
  45.                     b = 0
  46.                     For y = 1 To ai - 1
  47.                         b = b + t(x)(3, y)
  48.                         If t(x)(3, y) <> 0 Then
  49.                             n = n + 1: ReDim Preserve br(1 To 5, 1 To n)
  50.                             For z = 2 To 4
  51.                                 br(z, n) = t(x)(z, y)
  52.                             Next
  53.                             br(1, n) = ar(i, 1)
  54.                             br(5, n) = t(x)(1, y)
  55.                         End If
  56.                         t(x)(3, 1) = 0
  57.                     Next
  58.                     n = n + 1: ReDim Preserve br(1 To 5, 1 To n)
  59.                     br(1, n) = ar(i, 1)
  60.                     br(2, n) = t(x)(2, ai)
  61.                     br(3, n) = ar(i, 3) - b
  62.                     br(4, n) = t(x)(4, ai)
  63.                     br(5, n) = t(x)(1, ai)
  64.                     t(x)(3, ai) = a - ar(i, 3)
  65.                 End If
  66.             End If
  67.         Next
  68.     Next
  69.     s = Range("A2:E2")
  70.     [H2].Resize(1, 5) = s: [H3].Resize(n, 5) = Application.Transpose(br)
  71.     Set d = Nothing
  72. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-9-24 16:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-9-24 17:36 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-9-24 20:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-9-24 21:21 | 显示全部楼层
你这问题的答案就不能模拟一下,C7出库900对应的应该是A-1,A-2两个货位,结果咋写?如果出货对应3,4个货位呢?如果要合并单元格,那就麻烦了,得辅助;

TA的精华主题

TA的得分主题

发表于 2018-9-25 09:05 | 显示全部楼层
不需要考虑入库/出库的日期的吗,2018-18是什么日期。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 18:20 , Processed in 0.045148 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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