1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 计算物料周期

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-4-14 16:47 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 看飞鸟的金鱼 于 2025-4-15 15:44 编辑

统计一下物料周期,跟踪物料消耗时间!
image.png

物料周期.zip

232.11 KB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2025-4-14 18:02 | 显示全部楼层
只提取了领料日期,其它计算没做

附件供参考。。。

物料周期.zip

359.37 KB, 下载次数: 13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-4-14 18:03 | 显示全部楼层
  1. Sub ykcbf()    '//2025.4.14
  2.     Application.ScreenUpdating = False
  3.     Set d = CreateObject("Scripting.Dictionary")
  4.     With Sheets("领料明细")
  5.         r = .Cells(Rows.Count, 1).End(3).Row
  6.         Set Rng = .Range("a2:l" & r)
  7.         Rng.Sort Rng.Columns(2), 1, Orientation:=1
  8.         arr = Rng.Value
  9.     End With
  10.     For i = 1 To UBound(arr)
  11.         If arr(i, 1) = Empty Then Exit For
  12.         s = CStr(arr(i, 1))
  13.         If InStr(d(s), arr(i, 2)) = 0 Then d(s) = d(s) & " " & arr(i, 2)
  14.     Next
  15.     On Error Resume Next
  16.     With Sheets("所有商品")
  17.         r = .Cells(Rows.Count, 1).End(3).Row
  18.         c = .Cells(1, Columns.Count).End(1).Column
  19.         For i = 2 To r
  20.             s = CStr(arr(i, 1))
  21.             col = 7
  22.             If d.exists(s) Then
  23.                 t = Split(Mid(d(s), 2))
  24.                 For x = 0 To UBound(t)
  25.                     .Cells(i, col) = CDate(t(x))
  26.                     col = col + 3
  27.                 Next
  28.             End If
  29.         Next
  30.     End With
  31.     Set d = Nothing
  32.     Application.ScreenUpdating = False
  33.     MsgBox "OK!"
  34. End Sub

复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-4-15 01:31 | 显示全部楼层

  1. Sub Demo()
  2.     With Sheets("领料明细").Range("A1").CurrentRegion
  3.         .Sort Key1:=.Columns(2), Order1:=xlDescending, Header:=xlYes
  4.         Dim arr: arr = .Value
  5.     End With
  6.     Dim dict: Set dict = CreateObject("Scripting.Dictionary")
  7.     Dim i, j, k, crr
  8.     For i = 2 To UBound(arr, 1)
  9.         If Not dict.Exists(arr(i, 1)) Then
  10.             dict.Add arr(i, 1), arr(i, 2)
  11.         Else
  12.             ' 同一天多次领料只记录一次
  13.             If InStr(1, dict(arr(i, 1)), arr(i, 2)) = 0 Then _
  14.             dict(arr(i, 1)) = dict(arr(i, 1)) & " " & arr(i, 2)
  15.         End If
  16.     Next
  17.     Const SCOL = 7 ' 最近第1次领料日期 所在列
  18.     Dim iCol As Long
  19.     With Sheets("所有商品").Range("A1").CurrentRegion
  20.         .Resize(.Rows.Count - 1, .Columns.Count - 4).Offset(1, 4).ClearContents
  21.         Dim brr: brr = .Value
  22.         For i = 2 To UBound(brr, 1)
  23.             If dict.Exists(brr(i, 1)) Then
  24.                 crr = Split(dict(brr(i, 1)), " ")
  25.                 For j = 0 To UBound(crr)
  26.                     iCol = SCOL + j * 3
  27.                     If iCol > UBound(brr, 2) Then
  28.                         MsgBox "请扩充标题行包含足够多的列数用于保存结果数据"
  29.                         Exit Sub
  30.                     End If
  31.                     brr(i, iCol) = crr(j)
  32.                     If j > 0 Then _
  33.                         brr(i, iCol - 4) = CDate(brr(i, iCol - 3)) - CDate(brr(i, iCol))
  34.                     If j > 1 Then _
  35.                         brr(i, iCol - 8) = brr(i, iCol - 7) - brr(i, iCol - 4)
  36.                 Next
  37.             End If
  38.         Next
  39.         .Value = brr
  40.     End With
  41. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2025-4-15 09:32 | 显示全部楼层
Sub test250415()
Dim i, j, k, m, n, p As Integer, d1, d2 As Object, ar, br, cr As Variant
Set d1 = CreateObject("scripting.dictionary")
Set d2 = CreateObject("scripting.dictionary")
ar = Sheets("领料明细").[a1].CurrentRegion
For i = UBound(ar) To 2 Step -1
   If ar(i, 1) <> "" Then
       d1(ar(i, 1)) = 1 + d1(ar(i, 1)): d2(ar(i, 1) & d1(ar(i, 1))) = ar(i, 2)
    End If
Next
br = Sheets("所有商品").UsedRange
For j = 7 To UBound(br, 2)
  If InStr(br(1, j), "最近") > 0 Then
    m = WorksheetFunction.Find("第", br(1, j)): n = WorksheetFunction.Find("次", br(1, j))
    p = Val(Mid(br(1, j), m + 1, n - m - 1))
    For i = 2 To UBound(br)
    br(i, j) = d2(br(i, 1) & p)
    Next
   End If
Next
For i = 2 To UBound(br)
    br(i, 5) = WorksheetFunction.Max(DateDiff("d", br(i, 7), br(i, 10)), 0): br(i, 6) = WorksheetFunction.Max(br(i, 5) - 1, 0)
    br(i, 8) = WorksheetFunction.Max(DateDiff("d", br(i, 10), br(i, 13)), 0): br(i, 9) = WorksheetFunction.Max(br(i, 8) - 1, 0)
    br(i, 11) = WorksheetFunction.Max(DateDiff("d", br(i, 13), br(i, 15)), 0): br(i, 12) = WorksheetFunction.Max(br(i, 11) - 1, 0)
    For j = 14 To 24 Step 2
    br(i, j) = WorksheetFunction.Max(DateDiff("d", br(i, j + 1), br(i, j + 3)) - 1, 0)
    Next
Next
Sheets("所有商品").[a1].Resize(UBound(br), UBound(br, 2)) = br
MsgBox "ok"
End Sub

TA的精华主题

TA的得分主题

发表于 2025-4-15 09:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
供参考,欢迎批评指正

物料周期250415.zip

382.21 KB, 下载次数: 5

样稿

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-15 10:40 | 显示全部楼层
本帖最后由 看飞鸟的金鱼 于 2025-4-15 14:25 编辑

感谢老师的回复!这个每一个物料都有领料日期,不是这样呀!

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-15 10:44 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-4-15 10:46 | 显示全部楼层
本帖最后由 看飞鸟的金鱼 于 2025-4-15 15:17 编辑
翁知江安 发表于 2025-4-15 09:34
供参考,欢迎批评指正

感谢老师的回复!回去看看代码!这个新增领料明细后重新运行它好像不会把新增日期填上去?有没有办法让最近日期排在前面,比如3月31日排在3月15日前面,有新增领料时日期往后顺延排序(类似于降序排序)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

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

GMT+8, 2025-4-25 01:27 , Processed in 0.037565 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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