ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 填收入明细

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-28 19:48 | 显示全部楼层 |阅读模式
本帖最后由 yangqianming 于 2024-9-29 07:30 编辑

需求:1、输入明细出了第1、2行外都自动生成。
2、点击填收入明细按钮,自动根据第一行的表头文字筛选出就餐人数表的就餐时间填入到第3行,第4行是星期几,第5行是每个日期对应的早、中、晚三餐餐名。
3,班级和应到人数是从就餐表的C,D列提取。
4、早中晚数据就是班名对应的人数,但是低段学生(1-3年级)和工友只吃早、午两餐,每见到的日期和当前日期不连续则当前日晚不填数据。
5、低段人数合计,高段人数合计,就餐学生总计(高段人数合计+低段人数合计)同餐同费人数合计(陪餐教师+低段工友+高段工友),就餐人数合计(就餐学生合计+同餐同费人数合计),顿人数总计下面早、中、晚是本行对应早、中、晚人数和,应收金额下面小计是对应人数小计中早*3、午*5、晚*5得到。合计数据都使用公式便于特殊情况修改汇总。
写的啰嗦文件有模拟数据结果。
填收入明细.rar (26.81 KB, 下载次数: 7)

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-29 16:13 | 显示全部楼层
感觉这个帖子又要废了,马上放国庆长假,不过没关系大家国庆玩得开心快乐更重要!祝国庆节快快乐乐!

TA的精华主题

TA的得分主题

发表于 2024-9-30 11:31 | 显示全部楼层
yangqianming 发表于 2024-9-29 16:13
感觉这个帖子又要废了,马上放国庆长假,不过没关系大家国庆玩得开心快乐更重要!祝国庆节快快乐乐!

老兄,你这次的需求吧,就是个体力活,有写代码的功夫,手搓用公式能搞3个来回


微信截图_20240930112435.png

代码就请你手抄抄了。另外,代码运行后跟上面效果图的差异部分,留作十一假期的作业,请杨老师认真完成

微信截图_20240930112602.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-30 12:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
sunya_0529 发表于 2024-9-30 11:31
老兄,你这次的需求吧,就是个体力活,有写代码的功夫,手搓用公式能搞3个来回

太厉害了!您不厌其烦静心解答每一个问题的精神,带着能让更多人掌握解决问题的能力的初衷,让论坛更好的发扬光大的目标都是我等小白学习的榜样,谢谢老师的多次援手,祝国庆开心快乐!天天笑哈哈!

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-30 20:39 | 显示全部楼层
sunya_0529 发表于 2024-9-30 11:31
老兄,你这次的需求吧,就是个体力活,有写代码的功夫,手搓用公式能搞3个来回

抄了一遍运行不对又抄错了,明天在把图片放大仔细核对看看,要抄的一点儿不错还是不太容易
填收入明细.rar (1.26 MB, 下载次数: 0)

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-1 09:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
yangqianming 发表于 2024-9-30 20:39
抄了一遍运行不对又抄错了,明天在把图片放大仔细核对看看,要抄的一点儿不错还是不太容易
  1. function 汇总收入明细() {
  2.     const [wst1,wst2]=[...ThisWorkbook.Sheets];
  3.         const reportMonth=new Date(wst2.Range('A1').Value2.match(/\d+/g).join('/')+'/2');
  4.         const dates=wst1.Range('A1').CurrentRegion().slice(1).flat().filter(d=>{
  5.                 return new Date(d).getYear()=== reportMonth.getYear() && new Date(d).getMonth()===reportMonth.getMonth();
  6.         });
  7.         const clazz=wst1.Range('C1').CurrentRegion().slice(1);
  8.         const weekday=(date)=>{//输入日期返回星期几
  9.                 if(Date.parse(date) !== NaN) return '星期' + '日一二三四五六'[new Date(date).getDay()];               
  10.         }
  11.         const res=[];
  12.         res.push(['低段','应到数',...dates.map(d=> Array(3).fill(d)).flat(),'顿人数总计',,,'应收金额',,,'班主任签字']);
  13.         res.push([, , ...dates.map(d => Array(3).fill(weekday(d))).flat(),...Array(6).fill('小计')]);
  14.         res.push([,,...Array(dates.length + 2).fill(['早','午','晚']).flat()]);

  15.     const sumOfMeal = `=SUMPRODUCT(R5C3:R5C${dates.length * 3 + 2}=R5C)*RC3:RC${dates.length*3+2})`; // 顿人数总计
  16.     const sumOfAR = `=RC[-3]*if(R5C="早",3,5)`; // 应收金额
  17.     const sumOfRow = [...Array(3).fill(sumOfMeal), ...Array(3).fill(sumOfAR)]; // 定义行合计数组

  18.     const junior = clazz.filter(([c]) => Number(c) < 4); // 筛选低年级信息
  19.     junior.forEach(([c, s]) => {
  20.         res.push([c, s, ...res[0].slice(2, -7).map((d, j) => j % 3===2 ? '' : s), ...sumOfRow]);
  21.     });
  22.     res.push(['低段人数合计', ...Array((dates.length + 2) * 3 + 1).fill(`=SUM(R[-${junior.length}]C:R[-1]C)`)]);

  23.     const senior = clazz.filter(([c]) => Number(c) > 4); // 筛选高年级信息
  24.     senior.forEach(([c, s]) => {
  25.         res.push([c, s, ...res[0].slice(2, -7).map((d, j, arr) => arr[j+1]-d > 86400000 ? '' : s), ...sumOfRow]);
  26.     });
  27.     res.push(['高段人数合计', ...Array((dates.length + 2) * 3 + 1).fill(`=SUM(R[-${senior.length}]C:R[-1]C)`)]);

  28.     res.push(['就餐学生总计', ...Array((dates.length + 2) * 3 + 1).fill(`=SUM(R[-${junior.length + senior.length + 2}]C:R[-1]C)/2`)]);

  29.     const teachers = clazz.filter(([c]) => c === '陪餐教师').flat();
  30.     res.push([...teachers, ...res[0].slice(2, -7).map((d, j,arr) => arr[j+1]-d > 86400000 ? '' : teachers[1]), ...sumOfRow]);

  31.     const juniorStaff = clazz.filter(([c]) => c === '低段工友').flat();
  32.     res.push([...juniorStaff, ...res[0].slice(2, -7).map((d, j) => j % 3 === 2 ? '' : juniorStaff[1]), ...sumOfRow]);

  33.     const seniorStaff = clazz.filter(([c]) => c === '高段工友').flat();
  34.     res.push([...seniorStaff, ...res[0].slice(2, -7).map((d, j,arr) => arr[j+1]-d > 86400000 ? '' : seniorStaff[1]), ...sumOfRow]);

  35.     res.push(['同餐同费人数合计', ...Array((dates.length + 2) * 3 + 1).fill(`=SUM(R[-3]C:R[-1]C)`)]);
  36.     res.push(['就餐总人数合计', ...Array((dates.length + 2) * 3 + 1).fill(`=SUM(R[-5]C,R[-1]C)`)]);
  37.         wst2.Range('3:999').Clear();
  38.         with(wst2.Range('A3').Resize(res.length,res[0].length)){
  39.                 Value2 = res;
  40.         }
  41.        
  42.         }
复制代码

仔细核对代码没有抄错,结果在Value2 = res;还报错

TA的精华主题

TA的得分主题

发表于 2024-10-1 12:17 | 显示全部楼层
yangqianming 发表于 2024-10-1 09:15
仔细核对代码没有抄错,结果在Value2 = res;还报错

出错时,要学会排查是哪里出错了。
Value2 = res;
要么是Value2前的单元格引用错了,检查一下你用的附件是不是帖子里的上传的,wst2定义时是根据工作表顺序来的,你实际用的统计表如果不是在第2个工作表,容易出错。抄代码的时候,这些细节可以结合你的实际情况来,比如用工作名称来赋值给wst2,避免出现这种异常。

接下来是res,可以在出错代码前写一个:
console.log(JSON.stringify(res));
在立即窗口中看看res数组是什么,什么都没有的话,就是上面的赋值或存数据时出问题了,这行代码可以从定义res的行往后,res.push()后看看res数组是不是正确地添加数据了,分别看看是哪里出的问题。

TA的精华主题

TA的得分主题

发表于 2024-10-1 12:18 | 显示全部楼层
yangqianming 发表于 2024-10-1 09:15
仔细核对代码没有抄错,结果在Value2 = res;还报错

你再仔细对一下,代码有没有抄对


微信截图_20241001121637.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-1 13:31 | 显示全部楼层
本帖最后由 yangqianming 于 2024-10-1 13:33 编辑
yangqianming 发表于 2024-10-1 09:15
仔细核对代码没有抄错,结果在Value2 = res;还报错

老师都那么认真仔细的构思帮我,我还能不下功夫抄吗?基本完成了作业任务,还有一点就是那个相同的日期合并不了,郁闷!感谢!

填收入明细.rar (531.13 KB, 下载次数: 1)

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-1 18:40 | 显示全部楼层
sunya_0529 发表于 2024-10-1 12:18
你再仔细对一下,代码有没有抄对

谢谢老师!现在可以了,交个作业!基本完美!祝国庆快乐!玩得开心!
填收入明细.rar (532.33 KB, 下载次数: 10)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-25 15:36 , Processed in 0.047068 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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