ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 自动生成陪餐费统计表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-18 08:58 | 显示全部楼层
yangqianming 发表于 2024-3-17 07:14
是的,能帮我实现一下吗?谢谢!

你先要确定一个标准的模板,哪些信息是实现给定好的,哪些是需要用代码填充的,哪些是事先用公式解决的,这个需要先明确好。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-18 16:10 | 显示全部楼层
LIUZHU 发表于 2024-3-18 08:58
你先要确定一个标准的模板,哪些信息是实现给定好的,哪些是需要用代码填充的,哪些是事先用公式解决的, ...

红色用代码填充数据(早3,午5,晚5),绿色需要计算(麻烦的话可以不管,我自己写公式就行),麻烦了!
陪餐费统计表.rar (30.29 KB, 下载次数: 3)

TA的精华主题

TA的得分主题

发表于 2024-3-18 16:34 | 显示全部楼层
本帖最后由 Again123456 于 2024-3-18 16:37 编辑

这个日期对像没研究过,得到第三四行:
1、/\d+/g正则匹配出year,month
2、 new Date(year,month,0) 求出这个月有多少天
3、  week =[“星期日”,“星期一”,...]
4、循环得到【month +"月“ + i + "日",week[ new Date(year,month,i).getDay() ]】日期和星期几的数组
5、筛选周六日,得到结果
等高手如何处理日期,乘机学习一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-18 16:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Again123456 发表于 2024-3-18 16:34
这个日期对像没研究过,得到第三四行:
1、/\d+/g正则匹配出year,month
2、 new Date(year,month,0) 求 ...

你就是高手,还有你不会的吗?不过这个js的确难弄,反正我一头雾水。

TA的精华主题

TA的得分主题

发表于 2024-3-18 16:43 | 显示全部楼层
yangqianming 发表于 2024-3-18 16:40
你就是高手,还有你不会的吗?不过这个js的确难弄,反正我一头雾水。

我也是菜鸟,日期我没玩过,感觉这种实现功能应该不难,只是写的不高级

TA的精华主题

TA的得分主题

发表于 2024-3-18 17:09 | 显示全部楼层
yangqianming 发表于 2024-3-18 16:40
你就是高手,还有你不会的吗?不过这个js的确难弄,反正我一头雾水。

师傅数量是固定的,还是,每周也是两个师傅配餐,和教师一样?

TA的精华主题

TA的得分主题

发表于 2024-3-18 18:14 | 显示全部楼层
本帖最后由 Again123456 于 2024-3-18 18:48 编辑
yangqianming 发表于 2024-3-18 16:40
你就是高手,还有你不会的吗?不过这个js的确难弄,反正我一头雾水。
  1. function test(){
  2.         let [year , month ] = Range("a1").Value2.match(/\d+/g), dateArr = []
  3.         let n = new Date( year , month, 0).getDate()
  4.         let weekdays = [ null,"星期一","星期二","星期三","星期四","星期五",null]
  5.         Range("b3:br4").ClearContents()
  6.         for (let i = 1 ; i <= n ; i ++){
  7.                 let weekdayindex = new Date(year,month-1,i).getDay()
  8.                 dateArr.push([ month +"月" + i + "日" , weekdays[weekdayindex]])
  9.         }
  10.         dateArr = dateArr.filter(v=>v[1])
  11.         for(let i in dateArr){
  12.                 Cells(3 , 3 * i + 2).Value2 = dateArr[i][0]
  13.                 Cells(4 , 3 * i + 2).Value2 = dateArr[i][1]
  14.         }
  15. }
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-18 18:32 | 显示全部楼层
LIUZHU 发表于 2024-3-18 17:09
师傅数量是固定的,还是,每周也是两个师傅配餐,和教师一样?

师傅数量固定,但前面四个人只有早3元,午5元,后面7个早3午5晚5,就餐费一样

TA的精华主题

TA的得分主题

发表于 2024-3-18 19:37 | 显示全部楼层
本帖最后由 LIUZHU 于 2024-3-18 19:49 编辑

试一下
  1. function 陪餐费统计表(){
  2.         let s=Sheets.Item("陪餐缴费统计表").Range("a1").Value2;
  3.         let sf=Sheets.Item("陪餐缴费统计表").Range("a19:a29").Value2.flat();
  4.         let [year,month]=[s.match(/(\d+(?=年))/)[0],s.match(/(\d+(?=月))/)[0]];
  5.         let end=new Date(year,month,0,8,0,0).getDate();
  6.         let bt=[[],[],[]],wf=WorksheetFunction;
  7.         let arr1=[],arr2=[];
  8.         let m=1;                //统计当星期数
  9.         for (let i=1;i<=end;i++){
  10.                 let weekday=new Date(year,month-1,i,8,0,0).getDay();
  11.                 weekday=weekday==0?7:weekday;
  12.                 if (weekday==6 || weekday==7){
  13.                         if (i>=1 && weekday==6) m+=0.5;                //增加半个星期
  14.                         if (i>=2 && weekday==7) m+=0.5;                //增加半个星期
  15.                         continue;
  16.                 }
  17.                 let idate=new Date(year,month-1,i,8,0,0).getTime()/(24*3600*1000)+25569                //1970-1-1:25569
  18.                 bt[0].push(idate,null,null);
  19.                 bt[1].push(`星期${wf.Text(weekday,"[dbnum1]")}`,null,null);
  20.                 bt[2].push("早","中","晚");
  21.                 [0,1].forEach(x=>{                                //教师陪餐统计
  22.                         let n=2*(m-1)+x;
  23.                         let k=bt[0].length-3;
  24.                         let temp=arr1[n]=arr1[n] || [];
  25.                         [temp[k],temp[k+1],temp[k+2]]=[3,5,5];
  26.                 });
  27.                 for (j=0;j<sf.length;j++){                //师傅就餐统计
  28.                         let temp=arr2[j]=arr2[j] || [];
  29.                         temp.push(3,5,sf[j].includes("赵")?null:5);
  30.                 }
  31.         }
  32.         [["B3:BR5",bt],["B6:BR17",arr1],["B19:BR29",arr2]].forEach(([rngstr,darr])=>{
  33.                 Range(rngstr).ClearContents();
  34.                 Range(rngstr).Cells.Item(1,1).Resize(darr.length,darr[darr.length-1].length).Value2=darr;
  35.         });
  36. }
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-18 19:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不能上传附件了,不知道为什么?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-21 20:16 , Processed in 0.047407 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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