ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 自动计算陪餐费求助

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-25 14:55 | 显示全部楼层
大概写了一个。7楼的问题还是没理解。

新鲜.rar

65.26 KB, 下载次数: 2

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-25 16:44 | 显示全部楼层
  1. Sub test()
  2.     Dim r%, i%, m%
  3.     Dim arr, brr, zrr()
  4.     Dim d As Object
  5.     Dim rqmin As Date
  6.     Dim rqmax As Date
  7.     Dim rq1 As Date
  8.     Dim flg As Boolean
  9.     Application.ScreenUpdating = False
  10.     Application.DisplayAlerts = False
  11.     Set d = CreateObject("scripting.dictionary")
  12.     Set d1 = CreateObject("scripting.dictionary")
  13.     Set d2 = CreateObject("scripting.dictionary")
  14.     With Worksheets("统计陪餐费")
  15.         rq = .Range("bq1").Value
  16.     End With
  17.     With Worksheets("就餐人数表")
  18.         .AutoFilterMode = False
  19.         r = .Cells(.Rows.Count, 6).End(xlUp).Row
  20.         arr = .Range("a2:a" & r)
  21.         For i = 1 To UBound(arr)
  22.             If Format(arr(i, 1), "yyyymm") = Format(rq, "yyyymm") Then
  23.                 d1(arr(i, 1)) = Empty
  24.             End If
  25.         Next
  26.         n = 2
  27.         For Each aa In d1.keys
  28.             d1(aa) = n
  29.             n = n + 3
  30.             If rqmin = #12:00:00 AM# Then
  31.                 rqmin = aa
  32.             Else
  33.                 If rqmin > aa Then
  34.                     rqmin = aa
  35.                 End If
  36.             End If
  37.             If rqmax = #12:00:00 AM# Then
  38.                 rqmax = aa
  39.             Else
  40.                 If rqmax < aa Then
  41.                     rqmax = aa
  42.                 End If
  43.             End If
  44.         Next
  45.         ls = 1 + d1.Count * 3 + 2
  46.         r = .Cells(.Rows.Count, 6).End(xlUp).Row
  47.         arr = .Range("f2:i" & r)
  48.     End With
  49.     For i = 1 To UBound(arr)
  50.         xm = Right(arr(i, 2), 2)
  51.         Select Case arr(i, 2)
  52.             Case "小工友", "大工友", "其它人员"
  53.                 For rq1 = Application.Max(rqmin, arr(i, 3)) To Application.Min(rqmax, arr(i, 4))
  54.                     If d1.exists(rq1) Then
  55.                         n = d1(rq1)
  56.                         If Not d.exists(xm) Then
  57.                             Set d(xm) = CreateObject("scripting.dictionary")
  58.                         End If
  59.                         If Not d(xm).exists(arr(i, 1)) Then
  60.                             ReDim brr(1 To ls)
  61.                             brr(1) = arr(i, 1)
  62.                         Else
  63.                             brr = d(xm)(arr(i, 1))
  64.                         End If
  65.                         brr(n) = 3
  66.                         brr(n + 1) = 5
  67.                         If arr(i, 2) = "大工友" Or arr(i, 2) = "其它人员" Then
  68.                             brr(n + 2) = 5
  69.                         End If
  70.                         d(xm)(arr(i, 1)) = brr
  71.                     End If
  72.                 Next
  73.             Case "教师"
  74.                 For rq = Application.Max(rqmin, arr(i, 3)) To Application.Min(rqmax, arr(i, 4))
  75.                     If d1.exists(rq) Then
  76.                         d2(arr(i, 1)) = Empty
  77.                         Exit For
  78.                     End If
  79.                 Next
  80.         End Select
  81.     Next
  82.     If d2.Count <> 0 Then
  83.         Set d("教师") = CreateObject("scripting.dictionary")
  84.         js = d2.keys
  85.         riqi = d1.keys
  86.         m = 0
  87.         For i = 0 To UBound(riqi)
  88.             n = d1(riqi(i))
  89.             If i <> 0 Then
  90.                 If riqi(i) <> riqi(i - 1) + 1 Then
  91.                     m = m + 2
  92.                 End If
  93.             End If
  94.             If m + 1 > UBound(riqi) Then
  95.                 Exit For
  96.             End If
  97.             For q = 1 To 2
  98.                 If Not d("教师").exists(js(m + q - 1)) Then
  99.                     ReDim brr(1 To ls)
  100.                     brr(1) = js(m + q - 1)
  101.                 Else
  102.                     brr = d("教师")(js(m + q - 1))
  103.                 End If
  104.                 brr(n) = 3
  105.                 brr(n + 1) = 5
  106.                 brr(n + 2) = 5
  107.                 d("教师")(js(m + q - 1)) = brr
  108.             Next
  109.         Next
  110.     End If
  111.     With Worksheets("统计陪餐费")
  112.         .UsedRange.Offset(2, 0).Clear
  113.         With .Range("a3")
  114.             .Value = "陪餐人员"
  115.             .Resize(3, 1).Merge
  116.         End With
  117.         n = 2
  118.         For Each aa In d1.keys
  119.             With .Cells(3, n)
  120.                 .NumberFormatLocal = "m月d日"
  121.                 .Value = aa
  122.                 .Resize(1, 3).Merge
  123.             End With
  124.             With .Cells(4, n)
  125.                 .NumberFormatLocal = "[$-zh-CN]aaaa;@"
  126.                 .Value = aa
  127.                 .Resize(1, 3).Merge
  128.             End With
  129.             .Cells(5, n).Resize(1, 3) = Array("旱", "中", "晚")
  130.             n = n + 3
  131.         Next
  132.         With .Cells(3, n)
  133.             .Value = "顿人次"
  134.             .Resize(3, 1).Merge
  135.         End With
  136.         n = n + 1
  137.         With .Cells(3, n)
  138.             .Value = "金额"
  139.             .Resize(3, 1).Merge
  140.         End With
  141.         With .Range("a3").Resize(3, ls)
  142.             .Interior.Color = 10441261
  143.             .Font.Color = 16777215
  144.         End With
  145.         r = 6
  146.         For Each aa In Array("工友", "教师", "人员")
  147.             If d.exists(aa) Then
  148.                 m = 0
  149.                 ReDim crr(1 To d(aa).Count, 1 To ls)
  150.                 ReDim drr(1 To ls)
  151.                 drr(1) = IIf(aa <> "人员", aa & "小计", "其它小计")
  152.                 For Each bb In d(aa).keys
  153.                     brr = d(aa)(bb)
  154.                     For j = 2 To ls - 2
  155.                         If Len(brr(j)) <> 0 Then
  156.                             brr(ls - 1) = brr(ls - 1) + 1
  157.                             brr(ls) = brr(ls) + brr(j)
  158.                         End If
  159.                     Next
  160.                     m = m + 1
  161.                     For j = 1 To UBound(brr)
  162.                         crr(m, j) = brr(j)
  163.                     Next
  164.                     For j = 2 To UBound(brr)
  165.                         drr(j) = drr(j) + brr(j)
  166.                     Next
  167.                 Next
  168.                 .Cells(r, 1).Resize(UBound(crr), UBound(crr, 2)) = crr
  169.                 .Cells(r + UBound(crr), 1).Resize(1, UBound(drr)) = drr
  170.                 r = r + UBound(crr) + 1
  171.             End If
  172.         Next
  173.         With .Range("a3").Resize(r - 3, ls)
  174.             .Borders.LineStyle = xlContinuous
  175.             With .Font
  176.                 .Name = "微软雅黑"
  177.                 .Size = 11
  178.             End With
  179.         End With
  180.         .Columns(1).Resize(, ls).AutoFit
  181.         With .UsedRange
  182.             .HorizontalAlignment = xlCenter
  183.             .VerticalAlignment = xlCenter
  184.         End With
  185.     End With
  186. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-9-25 16:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
比较复杂的问题,11楼代码完全是错的。

新鲜.rar

66.79 KB, 下载次数: 4

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-25 17:19 | 显示全部楼层

真是太厉害了!无私奉献的褚老师!让人敬佩!

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-25 17:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
chxw68 发表于 2024-9-25 16:44
比较复杂的问题,11楼代码完全是错的。


我刚刚把问题整理您就给修改得差不多了,谢谢!
image.png

TA的精华主题

TA的得分主题

发表于 2024-9-25 17:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
修改好了。

新鲜.rar

68.93 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2024-9-25 17:52 | 显示全部楼层
本帖最后由 xsy我可以很好 于 2024-9-25 18:27 编辑

就餐费统计.rar (31.97 KB, 下载次数: 2)

image.png
我这个也是正确的哦,只是楼主不愿意变通,看也不看一眼

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-25 17:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

他的样表就多了一个周六、一个周日,这有点误导,所以我早上的代码没有破除周末

TA的精华主题

TA的得分主题

发表于 2024-9-25 18:17 | 显示全部楼层
xsy我可以很好 发表于 2024-9-25 17:56
他的样表就多了一个周六、一个周日,这有点误导,所以我早上的代码没有破除周末

它在原始表里的A列跟后面几列是没有关系的,我11楼的代码也理解错了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-25 18:59 | 显示全部楼层
chxw68 发表于 2024-9-25 18:17
它在原始表里的A列跟后面几列是没有关系的,我11楼的代码也理解错了。

真是感谢!能否在最后加个总计行,把工友,教师,其它人员的数字加总,把小计,总计改成公式(这样如果在有特殊情况手动修改一下数据,结果就自动更改过来了)麻烦了!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 03:40 , Processed in 0.041685 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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