ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 对象嵌套分类汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-12-4 15:58 | 显示全部楼层 |阅读模式

  1. function Workbook_SheetChange(Sh, rg)
  2. {
  3.         if(Sh.Name="Sheet1")
  4.         {
  5.                 if(rg.Column>=3&&rg.Column<=5)
  6.                 {
  7.                         Application.EnableEvents=false;
  8.                         test();
  9.                         Application.EnableEvents=true;
  10.                 }
  11.         }
  12. }
  13. function test()
  14. {
  15.         Range("K3:M1000").ClearContents();//清空区域数据
  16.         let maxrow=Cells.Item(Rows.Count,3).End(3).Row;//读取C列最大非空行
  17.         let arr=Range("C2:F"+maxrow).Value2;//将区域单元格写入数组
  18.         let obj={};//构造空对象
  19.         for(let i=0;i<=maxrow-2;i++)
  20.         {
  21.                 //if(obj.hasOwnProperty(arr[i][0]))//判断键值是否存在
  22.                 if(arr[i][0] in obj)//判断键值是否存在
  23.                 {
  24.                         let target=obj[arr[i][0]];
  25.                         target.Number+=(arr[i][1]||0);//汇总数量
  26.                         target.Price+=(arr[i][3]||0);//汇总总价
  27.                         target.Count++;//个数计算,用来跟汇总单价计算均价
  28.                 }else{
  29.                         obj[arr[i][0]]={
  30.                                 Number:arr[i][1]||0,
  31.                                 Price:arr[i][3]||0,
  32.                                 Count:1
  33.                         }
  34.                 }       
  35.         }
  36.         let i=2
  37.         let brr=[];
  38.         for (let myobj in obj)
  39.         {
  40.                 i++;
  41.                 brr.push([myobj,obj[myobj].Number,(obj[myobj].Price/obj[myobj].Number).toFixed(2)]);//数组插入元素
  42.         }
  43.         brr.sort((a, b)=> {return b[2] - a[2];});//数组排序 降序
  44.         Range("K3:M"+i).Value2=brr;//赋值
  45.         test2();
  46. }
  47. function test2()
  48. {
  49.         Range("P3:T1000").ClearContents();
  50.         let maxrow=Cells.Item(Rows.Count,3).End(3).Row;//读取C列最大非空行
  51.         let arr=Range("A2:E"+maxrow).Value2;
  52.         let obj={};//构造空对象
  53.         for(let i=0;i<=maxrow-2;i++)
  54.         {
  55.                 if(arr[i][0]===undefined || arr[i][0]===null){arr[i][0]=arr[i-1][0];}//对空日期进行填充
  56.                 if(arr[i][0] in obj)//判断日期是否存入对象
  57.                 {
  58.                                
  59.                 }else{
  60.                        
  61.                 }
  62.         }       
  63.                        
  64.         Range("P3:T"+i).Value2=brr;//输出分类汇总结果
  65. }

复制代码
image.png 函数test是好久之前写好的分类汇总,现在需要新增一个以日期字段的分类汇总,不知道test2怎么实现这个功能,写了日期填充数组,B列是没有用处的,在想JSA有没有SQL之类的写法,简易实现这个需求,按照test写法又得嵌套一层对象,比较懂JSA的大佬,烦请指点一二!

进出库存.rar

22.57 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2024-12-5 22:31 | 显示全部楼层
image.jpg

进出库存.rar (29.27 KB, 下载次数: 4)
不知是不是想要的,直接写代码的,没有验证结果哦

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-12-6 11:31 | 显示全部楼层
Again123456 发表于 2024-12-5 22:31
不知是不是想要的,直接写代码的,没有验证结果哦

谢谢, 新需求用 在test基础上 日期+品种 组合字符串作为对象键值就可以了,主要还是想在JSA里面直接使用SQL语法,将数据转换为标准数据后,SQL写起来舒服很多

TA的精华主题

TA的得分主题

发表于 2024-12-6 11:50 | 显示全部楼层
Again123456 发表于 2024-12-5 22:31
不知是不是想要的,直接写代码的,没有验证结果哦

学习了Object作为参数可以提取需要的列
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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