|
- function Workbook_SheetChange(Sh, rg)
- {
- if(Sh.Name="Sheet1")
- {
- if(rg.Column>=3&&rg.Column<=5)
- {
- Application.EnableEvents=false;
- test();
- Application.EnableEvents=true;
- }
- }
- }
- function test()
- {
- Range("K3:M1000").ClearContents();//清空区域数据
- let maxrow=Cells.Item(Rows.Count,3).End(3).Row;//读取C列最大非空行
- let arr=Range("C2:F"+maxrow).Value2;//将区域单元格写入数组
- let obj={};//构造空对象
- for(let i=0;i<=maxrow-2;i++)
- {
- //if(obj.hasOwnProperty(arr[i][0]))//判断键值是否存在
- if(arr[i][0] in obj)//判断键值是否存在
- {
- let target=obj[arr[i][0]];
- target.Number+=(arr[i][1]||0);//汇总数量
- target.Price+=(arr[i][3]||0);//汇总总价
- target.Count++;//个数计算,用来跟汇总单价计算均价
- }else{
- obj[arr[i][0]]={
- Number:arr[i][1]||0,
- Price:arr[i][3]||0,
- Count:1
- }
- }
- }
- let i=2
- let brr=[];
- for (let myobj in obj)
- {
- i++;
- brr.push([myobj,obj[myobj].Number,(obj[myobj].Price/obj[myobj].Number).toFixed(2)]);//数组插入元素
- }
- brr.sort((a, b)=> {return b[2] - a[2];});//数组排序 降序
- Range("K3:M"+i).Value2=brr;//赋值
- test2();
- }
- function test2()
- {
- Range("P3:T1000").ClearContents();
- let maxrow=Cells.Item(Rows.Count,3).End(3).Row;//读取C列最大非空行
- let arr=Range("A2:E"+maxrow).Value2;
- let obj={};//构造空对象
- for(let i=0;i<=maxrow-2;i++)
- {
- if(arr[i][0]===undefined || arr[i][0]===null){arr[i][0]=arr[i-1][0];}//对空日期进行填充
- if(arr[i][0] in obj)//判断日期是否存入对象
- {
-
- }else{
-
- }
- }
-
- Range("P3:T"+i).Value2=brr;//输出分类汇总结果
- }
复制代码
函数test是好久之前写好的分类汇总,现在需要新增一个以日期字段的分类汇总,不知道test2怎么实现这个功能,写了日期填充数组,B列是没有用处的,在想JSA有没有SQL之类的写法,简易实现这个需求,按照test写法又得嵌套一层对象,比较懂JSA的大佬,烦请指点一二!
|
|