找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 945|回复: 1

[转载代码] 在WPS中展开表数据

[复制链接]
发表于 2026-6-10 16:20:16 | 显示全部楼层 |阅读模式
一行展开成一个表。        //JSA代码

一行在简表区,简表在工作表靠右;一个表在工作表左侧。
选中简表区某一行,点击按钮,先展开成同表的分配表 再填写另一个文件编码表,最后保存。
  1. function 随心看(){        //生成目标分配表、扩展编码表
  2.         console.clear();
  3.         let 目标簿=ActiveWorkbook;
  4.         let 表路径=目标簿.Path;
  5.         let 表文件名=目标簿.Name;
  6.         let 月目标序号=表文件名.indexOf('月目标');
  7.         if(月目标序号==-1){alert("文件名找不到“月目标”!");return;}
  8.         let 月份=表文件名.slice(0,月目标序号);
  9.         let 扩展编码表文件名=表路径+"\\"+月份+"月商品导入.xlsx"        //扩展编码表
  10.         if(!FileSystem.Exists(扩展编码表文件名)){alert("找不到 扩展编码表:\n"+扩展编码表文件名);return;}
  11.         if(表文件名.indexOf("(随心看任务)")!=-1){        //文件名包含随心看
  12.                 let 表=ActiveSheet;
  13.                 let 表名=表.Name;
  14.                 console.log(表名);
  15.                 if(表名.indexOf("随心看任务")!=-1){        //表名包含随心看
  16.                         //简表头尾列号
  17.                         let 简表首内容='序号',左侧非空和=-4170,右侧非空格=-4161;
  18.                         let 简表头首格=表.Range("1:1").Find(简表首内容);
  19.                         let 简表头尾格=简表头首格.End(右侧非空格);
  20.                         let 简表首列号=简表头首格.Column,简表尾列号=简表头尾格.Column;
  21.                        
  22.                         //单行判断与选中行号
  23.                         let 选区=Selection;
  24.                         let 选区地址=选区.Address();
  25.                         let 选区行号数串=选区地址.replace(/[^\d]+/g,',');
  26.                         let 选区行号数组=选区行号数串.split(',');
  27.                         let 选中行对象={},选区行号;
  28.                         for(let i=0;i<选区行号数组.length;i++){
  29.                                 if(+选区行号数组[i]!=0){
  30.                                         选区行号=选区行号数组[i];
  31.                                         if(typeof 选中行对象[选区行号数组[i]]=='undefined'){
  32.                                                 选中行对象[选区行号数组[i]]=1;
  33.                                         }else{选中行对象[选区行号数组[i]]++;}
  34.                                 }
  35.                         }
  36.                         let 选中行数=Object.keys(选中行对象).length;
  37.                         if(选中行数==1){        //选中了单行
  38.                                 let 选中行号=选区行号;
  39.                                 //确定首尾列号
  40.                                 let 选区格串=选区地址.replace(/:/g,',');
  41.                                 let 选区格组=选区格串.split(',');
  42.                                 let 选定最小列号=100,选定最大列号=0;
  43.                                 for(let i=0;i<选区格组.length;i++){
  44.                                         let 格列号=表.Range(选区格组[i]).Column;        //获取单元格的列号
  45.                                         if(格列号<选定最小列号){选定最小列号=格列号;}
  46.                                         if(格列号>选定最大列号){选定最大列号=格列号;}
  47.                                 }
  48.                                 if(选定最小列号>=简表首列号 && 选定最大列号<=简表尾列号){
  49.                                         let 简表头区=表.Range(表.Cells(1,简表首列号),表.Cells(1,简表尾列号));
  50.                                         let 序号列=简表头区.Find('序号').Column;
  51.                                         let 任务名称列=简表头区.Find('任务名称').Column;
  52.                                         let 开始时间列=简表头区.Find('开始时间').Column;
  53.                                         let 结束时间列=简表头区.Find('结束时间').Column;
  54.                                         let 统计类型列=简表头区.Find('统计类型').Column;
  55.                                         let 统计目标列=简表头区.Find('统计目标').Column;
  56.                                         let 编码列=简表头区.Find('编码').Column;        //简表数据
  57.                                        
  58.                                         let 总行数=表.UsedRange.Rows.Count;
  59.                                         let 分配表头区=表.Range(表.Cells(1,1),表.Cells(1,简表首列号-1));
  60.                                         let 任务量列=分配表头区.Find('任务量').Column;
  61.                                         let 任务量列区=表.Range(表.Cells(2,任务量列),表.Cells(总行数,任务量列));        //门店目标分配
  62.                                         let 人员数列=分配表头区.Find('人员数').Column;
  63.                                         let 门店目标格=表.Cells(1,任务量列+1);let 门店目标列=门店目标格.Column;
  64.                                         let 人均目标格=表.Cells(1,任务量列+2);
  65.                                         let 门店目标列区=表.Range(门店目标格.Offset(1,0),表.Cells(总行数,门店目标列));        //门店目标分配
  66.                                         let 目标描述区=表.Columns(人员数列-1);        //竖分区:目标内容描述
  67.                                         let 任务名格=目标描述区.Find('任务名');
  68.                                         let 时间格=目标描述区.Find('时间');
  69.                                         let 编码格=目标描述区.Find('编码');        //目标表数据
  70.                                        
  71.                                         let 选中所在行头格=表.Cells(选中行号,简表首列号);
  72.                                         let 选行头格内容=表.Cells(选中行号,简表首列号).Value2;
  73.                                         if(选行头格内容!='' && typeof 选行头格内容!='undefined'){
  74.                                                 //一、读取简表行内容
  75.                                                 let 任务名称=表.Cells(选中行号,任务名称列).Value2;
  76.                                                 let 开始时间=表.Cells(选中行号,开始时间列).Value2;
  77.                                                 let 结束时间=表.Cells(选中行号,结束时间列).Value2;
  78.                                                 let 目标类型=表.Cells(选中行号,统计类型列).Value2;
  79.                                                 let 统计目标=表.Cells(选中行号,统计目标列).Value2;
  80.                                                 let 编码=表.Cells(选中行号,编码列).Value2;
  81.                                                
  82.                                                 //二、填写目标分配表
  83.                                                 if(目标类型=='销售金额'){
  84.                                                         人均目标格.Value2='金额';人均目标格.Font.Color=0xFF;        //红色
  85.                                                         任务名格.Font.Color=0xFF;时间格.Font.Color=0xFF;编码格.Font.Color=0xFF;
  86.                                                 }else{if(目标类型=='销售数量'){
  87.                                                         人均目标格.Value2='数量';人均目标格.Font.Color=0xFF0000;        //蓝色
  88.                                                         任务名格.Font.Color=0xFF0000;时间格.Font.Color=0xFF0000;编码格.Font.Color=0xFF0000;
  89.                                                 }}
  90.                                                 人均目标格.Offset(1,0).Value2=统计目标;        //金额值/数量值,即人均目标量
  91.                                                 任务名格.Offset(1,0).Value2=任务名称;        //任务名称
  92.                                                 时间格.Offset(1,0).Value2=开始时间;时间格.Offset(2,0).Value2=结束时间;        //开始结束日期
  93.                                                 编码格.Offset(1,0).Value2=编码;        //药品编码
  94.                                                 let 门店目标分配量组=门店目标列区.Value2;
  95.                                                 任务量列区.Value2=门店目标分配量组;        //任务量值:整列赋值
  96.                                                 目标簿.Save();        //保存目标表
  97.                                                
  98.                                                 //三、打开编码表,并填写保存        扩展编码表文件名
  99.                                                 let 扩展表已打开=0,扩展簿=null;
  100.                                                 for(let 工作簿 of Workbooks){
  101.                                                         if(工作簿.Path+'\\'+工作簿.Name==扩展编码表文件名){
  102.                                                                 扩展簿=工作簿;扩展表已打开=1;break;
  103.                                                         }
  104.                                                 }
  105.                                                 if(!扩展表已打开){扩展簿=Workbooks.Open(扩展编码表文件名);}
  106.                                                 let 扩展表=扩展簿.Worksheets(1);        //取扩展工作表
  107.                                                 表.Activate();        //切换显示原任务表
  108.                                                 let 编码数组=编码.split(',');
  109.                                                 let 扩展表头区=扩展表.Range("1:1");
  110.                                                 let 扩展表编码列=扩展表头区.Find('商品编码').Column;
  111.                                                 let 扩展表品名列=扩展表头区.Find('商品名称').Column;
  112.                                                 扩展表.Cells(2,扩展表品名列).Value2=任务名称;        //任务名当品名
  113.                                                 let 扩展表总行数=扩展表.UsedRange.Rows.Count;        //清空扩展表原编码
  114.                                                 扩展表.Range(扩展表.Cells(2,扩展表编码列),扩展表.Cells(扩展表总行数,扩展表编码列)).ClearContents();
  115.                                                 for(let i=0;i<编码数组.length;i++){        //扩展表填入商品编码
  116.                                                         扩展表.Cells(i+2,扩展表编码列).Value2=编码数组[i];
  117.                                                 }
  118.                                                 扩展簿.Save();        //保存扩展表
  119.                                         }else{alert("选中行为空 或 不完整!");}
  120.                                 }else{alert("选区不在表范围,或有超出部分!");}
  121.                         }else{alert("选中了 整列 或 多行!");}
  122.                 }else{alert("表名不包含“随心看”!");}
  123.         }else{alert("文件名不包含“随心看”!");}
  124. }
复制代码


有简单的选中区位置判断 和 根据行头定位列号。
 楼主| 发表于 2026-6-11 14:57:21 | 显示全部楼层

简版:只处理一个表

判断是否简表区域内,确定行号,扩展表。
  1. function 爆品目标(){
  2.         console.clear();
  3.         let 目标簿=ActiveWorkbook;
  4.         let 表路径=目标簿.Path;
  5.         let 表文件名=目标簿.Name;
  6.         let 月目标序号=表文件名.indexOf('月爆品目标');
  7.         if(月目标序号==-1){alert("文件名不含“月爆品目标”!");return;}
  8.         let 月份=表文件名.slice(0,月目标序号);
  9.         console.log(月份+"月爆品目标");
  10.         if(表文件名.indexOf("爆品目标")!=-1){        //文件名包含爆品
  11.                 let 表=目标簿.Worksheets(1);
  12.                 let 表名=表.Name;
  13.                 if(表名=="Sheet1" && ActiveSheet.Name==表名){        //第一个表名必须为Sheet1
  14.                         //简表头尾列号
  15.                         let 简表首内容='序号',左侧非空格=-4170,右侧非空格=-4161;
  16.                         let 简表头首格=表.Range("1:1").Find(简表首内容);
  17.                         let 简表头尾格=简表头首格.End(右侧非空格);
  18.                         let 简表首列号=简表头首格.Column,简表尾列号=简表头尾格.Column;
  19.                        
  20.                         //单行判断与选中行号
  21.                         let 选区=Selection;
  22.                         let 选区地址=选区.Address();
  23.                         let 选区行号数串=选区地址.replace(/[^\d]+/g,',');        //从地址分析行列
  24.                         let 选区行号数组=选区行号数串.split(',');
  25.                         let 选中行对象={},选区行号;
  26.                         for(let i=0;i<选区行号数组.length;i++){
  27.                                 if(+选区行号数组[i]!=0){
  28.                                         选区行号=选区行号数组[i];
  29.                                         if(typeof 选中行对象[选区行号数组[i]]=='undefined'){
  30.                                                 选中行对象[选区行号数组[i]]=1;
  31.                                         }else{选中行对象[选区行号数组[i]]++;}
  32.                                 }
  33.                         }
  34.                         let 选中行数=Object.keys(选中行对象).length;
  35.                         if(选中行数==1){        //选中了单行
  36.                                 let 选中行号=选区行号;
  37.                                 //确定首尾列号
  38.                                 let 选区格串=选区地址.replace(/:/g,',');
  39.                                 let 选区格组=选区格串.split(',');
  40.                                 let 选定最小列号=100,选定最大列号=0;
  41.                                 for(let i=0;i<选区格组.length;i++){
  42.                                         let 格列号=表.Range(选区格组[i]).Column;        //获取单元格的列号
  43.                                         if(格列号<选定最小列号){选定最小列号=格列号;}
  44.                                         if(格列号>选定最大列号){选定最大列号=格列号;}
  45.                                 }
  46.                                 if(选定最小列号>=简表首列号 && 选定最大列号<=简表尾列号){        //选区在范围内,预读取行头
  47.                                         let 简表头区=表.Range(表.Cells(1,简表首列号),表.Cells(1,简表尾列号));
  48.                                         let 序号列=简表头区.Find('序号').Column;
  49.                                         let 方案编号列=简表头区.Find('方案编号').Column;
  50.                                         let 方案名列=简表头区.Find('方案名').Column;
  51.                                         let 开始日期列=简表头区.Find('开始日期').Column;
  52.                                         let 结束日期列=简表头区.Find('结束日期').Column;
  53.                                         let 统计方式列=简表头区.Find('统计方式').Column;
  54.                                         let 统计目标列=简表头区.Find('目标/人').Column;
  55.                                         let 编码列=简表头区.Find('编码').Column;        //简表数据
  56.                                        
  57.                                         let 总行数=表.UsedRange.Rows.Count;
  58.                                         let 分配表头区=表.Range(表.Cells(1,1),表.Cells(1,简表首列号-1));
  59.                                         let 目标格=分配表头区.Find('目标');        //目标数量/目标金额
  60.                                         let 方案编码列=分配表头区.Find('方案编码').Column;
  61.                                         let 方案编码区=表.Range(表.Cells(2,方案编码列),表.Cells(总行数,方案编码列));        //方案编码
  62.                                         let 方案名称格=分配表头区.Find('方案名称');
  63.                                         let 门店名格=分配表头区.Find('门店名');
  64.                                         let 人数格=分配表头区.Find('人数');
  65.                                         let 人均目标格=人数格.Offset(0,1);        //目标表数据:目标金额/人        目标数量/人
  66.                                        
  67.                                         let 选中所在行头格=表.Cells(选中行号,简表首列号);
  68.                                         let 选行头格内容=选中所在行头格.Value2;
  69.                                         if(选行头格内容!='' && typeof 选行头格内容!='undefined'){        //选中行满足条件,扩展数据
  70.                                                 //一、读取简表行内容
  71.                                                 let 方案编号=表.Cells(选中行号,方案编号列).Value2;
  72.                                                 let 方案名=表.Cells(选中行号,方案名列).Value2;
  73.                                                 let 统计方式=表.Cells(选中行号,统计方式列).Value2;
  74.                                                 let 统计目标=表.Cells(选中行号,统计目标列).Value2;
  75.                                                 let 编码=表.Cells(选中行号,编码列).Value2;
  76.                                                
  77.                                                 //二、填写目标分配表
  78.                                                 方案编码区.Value2=方案编号;        //方案编码
  79.                                                 方案名称格.Offset(1,0).Value2=方案名;        //方案名
  80.                                                 人均目标格.Offset(1,0).Value2=统计目标;        //人均目标
  81.                                                 if(统计方式=='金额'){        //格式与颜色
  82.                                                         let 金色号=0x2E;
  83.                                                         目标格.Value2='目标金额';目标格.Font.ColorIndex=金色号;
  84.                                                         人均目标格.Value2='目标金额/人';人均目标格.Font.ColorIndex=金色号;        //金色
  85.                                                         方案编码区.Font.ColorIndex=金色号;方案名称格.Resize(2,1).Font.ColorIndex=金色号;
  86.                                                         门店名格.Font.ColorIndex=金色号;人数格.Font.ColorIndex=金色号;
  87.                                                 }else{if(统计方式=='数量'){
  88.                                                         let 蓝色=0xFF0000;
  89.                                                         目标格.Value2='目标数量';目标格.Font.Color=蓝色;
  90.                                                         人均目标格.Value2='目标数量/人';人均目标格.Font.Color=蓝色;        //蓝色
  91.                                                         方案编码区.Font.Color=蓝色;方案名称格.Resize(2,1).Font.Color=蓝色;
  92.                                                         门店名格.Font.Color=蓝色;人数格.Font.Color=蓝色;
  93.                                                 }}
  94.                                                 目标簿.Save();        //保存目标表
  95.                                         }else{alert("选中行为空 或 不完整!");}
  96.                                 }else{alert("选区不在表范围,或有超出部分!");}
  97.                         }else{alert("选中了 整列 或 多行!");}
  98.                 }else{alert("首表名不为“Sheet1”或未激活!");}
  99.         }else{alert("文件名不包含“爆品”!");}
  100. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-7-14 10:25

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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