|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
- function test(){
- var ar=Range('a1').CurrentRegion.Value2.slice(1);
- bt=Range('a1').CurrentRegion.Value2[0] //表头,用于查找学科、分组、输出位置
- for(let k=0;k<2;k++){
- if(k==0) {[学科,分组,输出列名]=['总分','班级','班名次']}
- if(k==1) {[学科,分组,输出列名]=['总分','组合','组合内名次']}
- let 分数列=bt.indexOf(学科);
- let 分组列=bt.indexOf(分组);
- let br=ar.map(x=>[x[分组列],x[分数列]]);
- let c=bt.indexOf(输出列名)+1 //输出列要在表列数之上+1
- Cells(2,c).Resize(ar.length,1).Value2=myRank(br);
- }
-
- for(学科 of '总分,语文,数学,英语,日语,西语,物理,化学,生物,政治,历史,地理'.split(',')){
- let 输出列名=(学科=='总分')?'校名次':学科[0]+'名'
- let 分数列=bt.indexOf(学科)
- let br=ar.map(x=>['学校',x[分数列]]) //用同一字符代替分组,最大范围内排名
- let bt.indexOf(输出列名)+1;
- Cells(2,c).Resize(ar.length,1).Value2=myRank(br);
- }
- }
- function myRank(data){ //data由两列组成[group,score] 返回与data同序的排名
- let d={},d1={}
- for(x of data){ //字典存放每种分组的分数组成的数组 d[9班]=[499.5,493.5,...] d['物化生']=[......]
- let group=x[0],score=x[1]?x[1]:0
- if(group in d) {d[group].push(score)
- }else{d[group]=[score]}
- }
- for(let group in d){
- let br=d[group].sort((a,b)=>(b-a)) //每个分组组成的分数数组降序
- let n=1,s0=br[0],m=0
- for(score of br){ //对每个 分组+分数 给予序号(排名),放到字典d1里 d1[物化生499.5]=1
- let key=group+' '+score;
- if(score>0){
- m+=1;
- if(score==s0) {d1[key]=n;} //同分同名
- else{d1[key]=m;s0=score;n=m}
- }else{d1[key]='' } //9999}
- }
- }
- let res=[]
- for(let x of data){ //对源数据根据 分组+分数 得出排名的数组
- let group=x[0],score=x[1]?x[1]:0
- let key=group+' '+score;
- res.push([d1[key]]);
- }
- return res
- }
复制代码 |
|