用vba数组和字典模拟E和F列公式.7z
(6.83 KB, 下载次数: 2)
- function test(){
- let arr = Range("a1").CurrentRegion.Value2
- let res = arr.slice(1).reduce(//这个其实和for循环一样,稍后我写个for的示例
- (p,[a,b,c,d])=> (//两个参数: p是“预定义的对象”(也可以是数组),用来存放结果;参数2即[a,b,c,d]是arr循环到的“当前元素”,即当前行,是一个一维数组。
- p[[a,b,c]] = p[[a,b,c]]||[a,b,c,d,0,0],//格式化字典,以当前行的前3例数组转成的字符窜做字典key,第一次见到key是,
- //key对应value 是[a,b,c,d,0,0],前4个元素就是当前行,后面两0是计数和求和,根据需求设计的
- p[[a,b,c]][4]++,//p[key]对应的value是[a,b,c,d,计数,求和]的一维数组,其第4个元素就是计数,每循环一次加1
- p[[a,b,c]][5]+= d,//p[key]对应的value是[a,b,c,d,计数,求和]的一维数组,其第5个元素就是求和,每循环一次累加当前值
- p) , //t箭头函数后面的括号之间,可以理解是一个逗号运算符的表达式,其返回值为最后一个逗号后面的值,相当于return p
- {} )//这里预定义了一个p,类型是Object,用来做字典
- res = Object.values(res)
- res.unshift(arr[0].concat(["计数","求和"]))
- Range("h1").Resize(res.length,res[0].length).Value2 = res
- }
- function test2(){//for示例
- let brr = Range("a1").CurrentRegion.Value2
- let arr = brr.slice(1)
- let p = {} // p是“预定义的对象”,类型是Object,用来做字典,接收for循环运行后的结果
- for (let i in arr ){
- let [a,b,c,d] = arr[i] //[a,b,c,d]是arr循环到的“当前元素”,即当前行,是一个一维数组。
- //原理:数组解构,a是年b是月,c 是商品,d 是金额
- let key= [a,b,c] //格式化字典key,以当前行的前3列
- let value = [a,b,c,d,0,0] //格式化字典key的value,第一次见到key是[a,b,c,d,0,0],
- p[key] = p[key]||value //前4个元素就是当前行,后面两0是计数和求和,根据需求设计的
- p[key][4]++
- p[key][5]+= d
- }
- let res = Object.values(p)
- res.unshift(brr[0].concat(["计数","求和"]))
- Range("h1").Resize(res.length,res[0].length).Value2 = res
-
- }
复制代码
|