ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 仓储费用根据仓储时间计算各批次仓储费,求VBA代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-5 17:31 | 显示全部楼层 |阅读模式
仓储费用计算根据各批货物入库时间长短及费率计算,求VBA代码,谢谢!

仓储费计算表.rar

8.05 KB, 下载次数: 24

TA的精华主题

TA的得分主题

发表于 2024-8-5 20:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

TA的精华主题

TA的得分主题

发表于 2024-8-6 01:31 | 显示全部楼层
  1. Sub 仓储费用()
  2. Dim arr()   '原始信息
  3. Dim brr()
  4. r = [a1].End(xlDown).Row
  5. arr = Range("a1").Resize(r, 6).Value

  6. Dim mydic As Object
  7. Set mydic = CreateObject("scripting.dictionary")
  8. For i = 1 To r - 1
  9.     mydic(arr(i + 1, 2)) = 0
  10. Next

  11. i = 0
  12. For Each Key In mydic.keys
  13.     i = i + 1
  14.     mydic(Key) = i
  15. Next

  16. ReDim brr(1 To r + mydic.Count, 1 To 10)
  17. Dim inputDate As String
  18. Dim jiesuanDate As Date



  19. inputDateStr:
  20. inputDate = InputBox("结算时间是:", "请输入结算时间")
  21. If ChkDateFormat(inputDate) Then
  22.     jiesuanDate = CDate(inputDate)
  23. Else
  24.     MsgBox "输入的日期格式有误,请按照yyyy-mm-dd格式(如2024-2-17)重新输入"
  25.     GoTo inputDateStr
  26. End If


  27. n = 0
  28. For i = 1 To r - 1                         '逐行扫描原始数据
  29.     If arr(i + 1, 4) > 0 Then              '搜索进库记录
  30.         n = n + 1
  31.         brr(n, 1) = arr(i + 1, 2)          '获取批次
  32.         brr(n, 2) = "入"                    '出入库
  33.         brr(n, 3) = arr(i + 1, 1)           '时间
  34.         brr(n, 4) = jiesuanDate              '结算时间
  35.         brr(n, 5) = arr(i + 1, 4)          '数量
  36.         kucun = brr(n, 5)
  37.         brr(n, 6) = 0                      '天数
  38.         brr(n, 7) = 0
  39.         brr(n, 8) = 0
  40.         brr(n, 9) = 0
  41.         brr(n, 10) = 0
  42.         For j = 1 To r - 1                 '从头搜索同批次出库记录
  43.             If arr(j + 1, 5) > 0 And arr(j + 1, 2) = arr(i + 1, 2) Then
  44.                 n = n + 1
  45.                 brr(n, 1) = arr(j + 1, 2)          '获取批次
  46.                 brr(n, 2) = "出"                   '出入库
  47.                 brr(n, 3) = arr(j + 1, 1)          '变动时间
  48.                 brr(n, 4) = jiesuanDate            '结算时间
  49.                 brr(n, 5) = arr(j + 1, 5)          '变动数量
  50.                 kucun = kucun - brr(n, 5)          '库存数量
  51.                 brr(n, 6) = arr(j + 1, 1) - arr(i + 1, 1) '天数
  52.                 If brr(n, 6) <= 5 Then
  53.                     brr(n, 7) = brr(n, 6)
  54.                     brr(n, 8) = 0
  55.                     brr(n, 9) = 0
  56.                 ElseIf brr(n, 6) <= 10 Then
  57.                     brr(n, 7) = 5
  58.                     brr(n, 8) = brr(n, 6) - 5
  59.                     brr(n, 9) = 0
  60.                 Else
  61.                     brr(n, 7) = 5
  62.                     brr(n, 8) = 5
  63.                     brr(n, 9) = brr(n, 6) - 10
  64.                 End If
  65.                 brr(n, 10) = brr(n, 5) * brr(n, 8) * 1 + brr(n, 5) * brr(n, 9) * 0.5
  66.                 Total = Total + brr(n, 10)
  67.             End If
  68.         Next
  69.         
  70.         '计算库存
  71.         n = n + 1
  72.         brr(n, 1) = arr(i + 1, 2)          '获取批次
  73.         brr(n, 2) = "库"                    '出入库
  74.         brr(n, 3) = jiesuanDate             '时间
  75.         brr(n, 4) = jiesuanDate             '结算时间
  76.         brr(n, 5) = kucun                   '数量
  77.         brr(n, 6) = jiesuanDate - arr(i + 1, 1) '天数
  78.         If brr(n, 6) <= 5 Then
  79.             brr(n, 7) = brr(n, 6)
  80.             brr(n, 8) = 0
  81.             brr(n, 9) = 0
  82.         ElseIf brr(n, 6) <= 10 Then
  83.             brr(n, 7) = 5
  84.             brr(n, 8) = brr(n, 6) - 5
  85.             brr(n, 9) = 0
  86.         Else
  87.             brr(n, 7) = 5
  88.             brr(n, 8) = 5
  89.             brr(n, 9) = brr(n, 6) - 10
  90.         End If
  91.         brr(n, 10) = brr(n, 5) * brr(n, 8) * 1 + brr(n, 5) * brr(n, 9) * 0.5
  92.         Total = Total + brr(n, 10)
  93.         
  94.         n = n + 1
  95.         brr(n, 1) = "小计"
  96.         brr(n, 10) = Total
  97.         
  98.         Total = 0
  99.         kucun = 0
  100.     End If
  101. Next
  102.                
  103. Range("G26").Resize(UBound(brr, 1), UBound(brr, 2)).Value = brr

  104.         
  105. End Sub


  106. Function ChkDateFormat(strDate As String) As Boolean
  107.     On Error GoTo errhandler
  108.     Dim dateValue As Date
  109.     dateValue = CDate(strDate)
  110.     ChkDateFormat = True
  111.     Exit Function
  112.    
  113. errhandler:
  114.     ChkDateFormat = False
  115.    
  116. End Function

复制代码
test.png

仓储费计算表.rar

24.87 KB, 下载次数: 24

TA的精华主题

TA的得分主题

发表于 2024-8-6 07:48 | 显示全部楼层
练习下。

Sub test()
Dim i As Long, j As Long, n As Long, r As Long, m As Long
Dim arr, brr(1 To 1000, 1 To 20), s
Set d = CreateObject("scripting.dictionary")
'date1 = #1/31/2024#
date1 = CDate(Application.InputBox("请输入截止日期", "输入日期", Format(Date, "yyyy-mm-dd"), Type:=1))
If date1 = 0 Then Exit Sub
a = Array("批次", "出入库", "时间", "计算时点", "数量", "天数", "免收天数", "收1元天数", "收0.5元天数", "仓储费")
With Sheet1
r = .Cells(65536, 1).End(xlUp).Row
arr = .Cells(1, 1).Resize(r, 6)
End With
For i = 2 To UBound(arr)
s = arr(i, 2)
If arr(i, 1) <= date1 Then
If Abs(arr(i, 4)) + Abs(arr(i, 5)) > 0 Then
If Not d.exists(s) Then
d(s) = Array(arr(i, 1), i)
Else
d(s) = Array(d(s)(0), d(s)(1) & "|" & i)
End If
End If
End If
Next 'i
For Each s In a
m = m + 1
brr(1, m) = s
Next
n = 1
For Each s In d.keys
a = Split(d(s)(1), "|")
kk = 0
For Each s1 In a
n = n + 1
brr(n, 1) = s
brr(n, 2) = IIf(arr(Val(s1), 4) > 0, Left(arr(1, 4), 2), Left(arr(1, 5), 2))
brr(n, 3) = arr(Val(s1), 1)
brr(n, 4) = date1
brr(n, 5) = arr(Val(s1), 4) + arr(Val(s1), 5)
brr(n, 6) = arr(Val(s1), 1) - d(s)(0)
kk = kk + arr(Val(s1), 4) - arr(Val(s1), 5)
Next 'a
n = n + 1
brr(n, 1) = s
brr(n, 5) = kk
brr(n, 2) = "库存"
brr(n, 4) = date1
brr(n, 6) = Val(date1 - d(s)(0))
n = n + 1
brr(n, 1) = "小计"
Next 'i
kk = 0
For i = 2 To n
If brr(i, 6) <= 5 Then
brr(i, 7) = brr(i, 6)
brr(i, 10) = 0
ElseIf brr(i, 6) <= 10 Then
brr(i, 7) = 5
brr(i, 8) = (brr(i, 6) - 5)
brr(i, 9) = brr(i, 6) - 5
brr(i, 10) = brr(i, 5) * brr(i, 9) * 1
Else
brr(i, 7) = 5
brr(i, 8) = (10 - 5)
brr(i, 9) = (brr(i, 6) - 10)
brr(i, 10) = brr(i, 5) * (5 * 1 + brr(i, 9) * 0.5)
End If
kk = kk + brr(i, 10)
If brr(i, 1) = "小计" Then
brr(i, 10) = kk
kk = 0
End If
Next 'i
Sheet1.Cells(27, 7).Resize(1000, 10).ClearContents
Sheet1.Cells(27, 7).Resize(n, 10) = brr
End Sub

仓储费计算表.zip

17.22 KB, 下载次数: 12

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-6 08:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 chenwenming 于 2024-8-6 09:28 编辑

谢谢,结果完全正确,如果数据表只是出入库流水,不人为添加库存行,计算时会出现错误,要是能按月分别结算仓储费就更好了,比如2月各发了400,单独计算2月的仓储费或分月形成仓储费计算表!

仓储费计算表(分月).rar

8.37 KB, 下载次数: 4

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-6 09:00 | 显示全部楼层
本帖最后由 chenwenming 于 2024-8-6 09:28 编辑
汉唐 发表于 2024-8-6 07:48
练习下。

Sub test()

谢谢,代码可以规避库存行的问题,结果正确!要是能按月分别结算仓储费就更好了,比如2月各发了400,单独计算2月的仓储费或分月形成仓储费计算表!

仓储费计算表(分月).rar

8.37 KB, 下载次数: 8

TA的精华主题

TA的得分主题

发表于 2024-8-6 15:07 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-6 16:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一招秒杀 发表于 2024-8-6 15:07
1句10行,忘记加个小计了

可以将文件上传观摩下,谢谢

TA的精华主题

TA的得分主题

发表于 2024-8-6 21:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
试着写了下代码,不过结果好像跟楼主的举例结果有些不同,可能是我理解有误,姑且写之姑且看之,仅供参考

仓储费计算表(分月).zip

19.64 KB, 下载次数: 17

TA的精华主题

TA的得分主题

发表于 2024-8-7 13:04 | 显示全部楼层
加多了1行,偷个懒,每次只计算1个月的
仓储费分月.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 14:46 , Processed in 0.049072 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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