找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 1530|回复: 24

逐个处理表格区域中的单元格JSA

[复制链接]
发表于 2026-10-27 08:55:28 | 显示全部楼层 |阅读模式
本帖最后由 cutebe 于 2026-10-28 08:55 编辑


办公WPS表格代码JSA

//逐个显示表格选区内单元格 //显示可换成其他逐个操作单元格
//可多个小区块,重叠单元格只处理一次,整行/整列只处理在用区UsedRange内的

  1. function 区域内单元格地址(表,选区){        //返回单元格地址对象
  2.         let 在用区=表.UsedRange;
  3.         let 单元格对象={},计数=0;
  4.        
  5.         //遍历选区内所有小区块
  6.         console.log("选区地址:"+选区.Address() +"\t在用区:"+ 在用区.Address());
  7.         let 选区地址=选区.Address();
  8.         let 选区块组=选区地址.split(',');
  9.         for(let 块号=0;块号<选区块组.length;块号++){
  10.                 let 有效地址=选区块组[块号];        //console.log("块"+块号+":"+选区块组[块号]);
  11.                
  12.                 //处理整行、整列的区        //整两行$7:$8        //整列$D:$D
  13.                 let 区块待判地址=选区块组[块号].replace(/[$]/g,'');
  14.                 let 区块在用=Intersect(在用区,表.Range(区块待判地址));
  15.                 let 区块无行地址=区块待判地址.replace(/[\d]/g,'');        //地址去除数字
  16.                 let 区块无列地址=区块待判地址.replace(/[a-zA-Z]/g,'');        //地址去除字母
  17.                 if(区块在用){
  18.                         if(区块无行地址==':' || 区块无列地址==':'){
  19.                                 有效地址=区块在用.Address();        //整行或整列的在用重叠部分
  20.                         }
  21.                 }else{
  22.                         if(区块无行地址==':'){        //整行跳过
  23.                                 console.log("块"+块号+":"+选区块组[块号]+ "\t//整行不在用区跳过");
  24.                                 continue;
  25.                         }
  26.                         if(区块无列地址==':'){        //整列跳过
  27.                                 console.log("块"+块号+":"+选区块组[块号]+ "\t//整列不在用区跳过");
  28.                                 continue;
  29.                         }
  30.                 }
  31.                
  32.                 //获取普通有限区块的行号列号,遍历区内每个单元格
  33.                 let 单块有效区=表.Range(有效地址);
  34.                 for(let 单元格 of 单块有效区.Cells){
  35.                         let 格地址=单元格.Address(0,0);
  36.                         if(typeof 单元格对象[格地址]=="undefined"){
  37.                                 单元格对象[格地址]=1;计数++;        //存单元格地址
  38.                         }else{单元格对象[格地址]++;}
  39.                 }
  40.                 console.log("块"+块号+":"+选区块组[块号] +"\t有效:"+有效地址 +"\t行列数:"+单块有效区.Rows.Count +","+ 单块有效区.Columns.Count);
  41.         }
  42.         console.log("单元格数量:"+ 计数);
  43.         return 单元格对象;
  44. }
复制代码

感谢 Klubnikoff 指正,修改方案二:        //另一修改方案在上面原代码处↑
if(区块无行地址==':'){        //整行跳过
        if(区块在用){
                有效地址=区块在用.Address();
        }else{
                console.log("块"+块号+":"+选区块组[块号]+ "\t//整行不在用区跳过");
                continue;
        }
}
if(区块无列地址==':'){        //整列跳过
        if(区块在用){
                有效地址=区块在用.Address();
        }else{
                console.log("块"+块号+":"+选区块组[块号]+ "\t//整列不在用区跳过");
                continue;
        }
}
 楼主| 发表于 2026-10-27 09:01:43 | 显示全部楼层
办公WPS表格代码JSA        //旧版

//逐个显示表格选区内单元格 //显示可换成其他逐个操作单元格
//可多个小区块,重叠单元格只处理一次,整行/整列只处理在用区UsedRange内的

  1. function 显示区内单元格测试(){
  2.         console.clear();
  3.         let 当前表=ActiveSheet,选中区域=Selection;
  4.         let 单元格地址对象=区域内单元格(当前表,选中区域);        //活动表,选中多区
  5.         for(let 格地址属性 in 单元格地址对象){
  6.                 if(单元格地址对象.hasOwnProperty(格地址属性)){
  7.                         console.log("地址属性:"+ 格地址属性 +"\t值:"+ 单元格地址对象[格地址属性]);
  8.                         let 单元格=当前表.Range(格地址属性);
  9.                         //可以对单元格进行操作。如:
  10.                         //单元格.Value2=2;        //修改内容
  11.                         //单元格.Interior.Color = 0xC0FF;        //设置背景橙色
  12.                 }
  13.         }
  14. }

  15. function 区域内单元格(表,选区){        //旧版函数:返回单元格对象
  16.         let 在用区=表.UsedRange;console.clear();
  17.         let 单元格对象={},计数=0;
  18.        
  19.         //遍历选区内所有小方块
  20.         console.log("选区地址:"+选区.Address() +"\t在用区:"+ 在用区.Address());
  21.         let 选区地址=选区.Address();
  22.         let 选区块组=选区地址.split(',');
  23.         for(let 块号=0;块号<选区块组.length;块号++){
  24.                 let 有效地址=选区块组[块号];        //console.log("块"+块号+":"+选区块组[块号]);
  25.                
  26.                 //处理整行、整列的区        //整两行$7:$8        //整列$D:$D
  27.                 let 区块待判地址=选区块组[块号].replace(/[$]/g,'');
  28.                 let 区块无行地址=区块待判地址.replace(/[\d]/g,'');        //地址去除数字
  29.                 if(区块无行地址==':'){        //整行区,取在用区内部分
  30.                         if(Intersect(在用区,表.Range(区块待判地址))){
  31.                                 let 整行在用区=Range(在用区.Address() +" "+ 区块待判地址);
  32.                                 //console.log("块"+块号+":"+ 选区块组[块号] + "\t整行取重叠在用:"+ 整行在用区.Address());
  33.                                 有效地址=整行在用区.Address();
  34.                         }else{
  35.                                 console.log("块"+块号+":"+选区块组[块号]+ "\t//整行不在用区跳过");continue;        //整行跳过
  36.                         }
  37.                 }
  38.                 let 区块无列地址=区块待判地址.replace(/[a-zA-Z]/g,'');
  39.                 if(区块无列地址==':'){        //整列区,也是取在用区内部分
  40.                         if(Intersect(在用区,表.Range(区块待判地址))){
  41.                                 let 整列在用区=Range(在用区.Address() +" "+ 区块待判地址);
  42.                                 //console.log("块"+块号+":"+ 选区块组[块号] + "\t整列取重叠在用:"+ 整列在用区.Address());
  43.                                 有效地址=整列在用区.Address();
  44.                         }else{
  45.                                 console.log("块"+块号+":"+选区块组[块号]+ "\t//整列不在用区跳过");continue;        //整列跳过
  46.                         }
  47.                 }
  48.                
  49.                 //获取普通区块的行号列号,遍历区内每个单元格
  50.                 let 单块有效区=表.Range(有效地址);
  51.                 let 单块起止=有效地址.split(':');
  52.                 let 起始格=表.Range(单块起止[0]),终止格=表.Range(单块起止[1]);
  53.                 for(let 行号=起始格.Row;行号<=终止格.Row;行号++){
  54.                         for(let 列号=起始格.Column;列号<=终止格.Column;列号++){
  55.                                 let 单元格=表.Cells(行号,列号);
  56.                                 let 格地址=单元格.Address(0,0);
  57.                                 if(typeof 单元格对象[格地址]=="undefined"){单元格对象[格地址]=1;计数++;}        //存单元格地址
  58.                                 else{单元格对象[格地址]++;}
  59.                                 //console.log("属性:"+ typeof 单元格对象[单元格.Address(0,0)]);
  60.                         }
  61.                 }
  62.                 console.log("块"+块号+":"+选区块组[块号] +"\t有效:"+有效地址 +"\t行列数:"+单块有效区.Rows.Count +","+ 单块有效区.Columns.Count);
  63.         }
  64.         console.log("单元格数量:"+ 计数);
  65.         return 单元格对象;
  66. }
复制代码
回复

使用道具 举报

发表于 2026-10-27 09:28:22 | 显示全部楼层
感谢分享。
回复

使用道具 举报

发表于 2026-10-27 09:28:53 | 显示全部楼层
回复

使用道具 举报

发表于 2026-10-27 09:29:41 | 显示全部楼层
回复

使用道具 举报

发表于 2026-10-27 09:36:33 | 显示全部楼层
学习学习,感谢分享!!!
回复

使用道具 举报

发表于 2026-10-27 10:36:46 | 显示全部楼层
谢谢分享
回复

使用道具 举报

 楼主| 发表于 2026-10-27 10:40:51 | 显示全部楼层
应用:不自动换行 两端对齐的换行需要逐单元格处理

把WPS文字的表,复制到表格中;有部分单元格换行的原因是水平两端对齐格式。整个区域直接操作无效,需要逐个单元格处理。
  1. function 取消自动换行测试(){
  2.         let 当前表=ActiveSheet,选中区域=Selection;
  3.         选中区域.WrapText=false;        //不自动换行
  4.        
  5.         let 单元格地址对象=区域内单元格(当前表,选中区域);        //活动表,选中多区
  6.         for(let 格地址属性 in 单元格地址对象){
  7.                 if(单元格地址对象.hasOwnProperty(格地址属性)){
  8.                         let 单元格=当前表.Range(格地址属性);
  9.                         //取消水平两端对齐
  10.                         if(单元格.HorizontalAlignment==-4130){单元格.HorizontalAlignment=1;}
  11.                 }
  12.         }
  13.        
  14.         选中区域.EntireRow.AutoFit();        //自适应行高
  15. }
复制代码
回复

使用道具 举报

发表于 2026-10-27 11:08:01 | 显示全部楼层
进来看看,学习了
回复

使用道具 举报

发表于 2026-10-28 05:08:14 | 显示全部楼层
新版这里有个边界情况:if(区块在用) 没先判断是不是整行/整列,所以普通矩形选区也会被裁到 UsedRange。比如 UsedRange 是 A1:B2,选中 B2:C3,按这段逻辑最后只会处理 B2,C2、B3、C3 都漏了;但普通选区完全在 UsedRange 外时反而又会完整处理。

如果本意是注释里说的“只有整行/整列才限制在在用区”,可以把求交后替换有效地址的逻辑放进整行/整列判断里,普通矩形选区直接保留原地址。

点评

感谢指正。  发表于 2026-10-28 08:56
回复

使用道具 举报

发表于 2026-10-28 06:20:54 | 显示全部楼层
学习学习

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

发表于 2026-10-28 13:05:24 | 显示全部楼层
回复

使用道具 举报

发表于 2026-11-7 07:54:28 | 显示全部楼层
路过,留个脚印~
回复

使用道具 举报

 楼主| 发表于 2026-11-7 17:12:18 | 显示全部楼层

测试代码编辑

  1. <p>function 取消自动换行(){</p><p><span style="white-space:pre">        </span>console.clear();</p><p><span style="white-space:pre">        </span>let 当前表=ActiveSheet,选中区域=Selection;</p><p><span style="white-space:pre">        </span>//选中区域.WrapText=false;<span style="white-space:pre">        </span>//不自动换行</p><p><span style="white-space:pre">        </span></p><p><span style="white-space:pre">        </span>let 单元格地址对象=区域内单元格地址(当前表,选中区域);<span style="white-space:pre">        </span>//活动表,选中多区</p><p><span style="white-space:pre">        </span>for(let 格地址属性 in 单元格地址对象){</p><p><span style="white-space:pre">                </span>if(单元格地址对象.hasOwnProperty(格地址属性)){</p><p><span style="white-space:pre">                        </span>let 单元格=当前表.Range(格地址属性);</p><p><span style="white-space:pre">                        </span>//取消水平两端对齐</p><p><span style="white-space:pre">                        </span>if(单元格.HorizontalAlignment==-4130){单元格.HorizontalAlignment=1;}</p><p><span style="white-space:pre">                        </span>单元格.WrapText=false;<span style="white-space:pre">        </span>//不自动换行</p><p><span style="white-space:pre">                </span>}</p><p><span style="white-space:pre">        </span>}</p><p><span style="white-space:pre">        </span></p><p><span style="white-space:pre">        </span>选中区域.EntireRow.AutoFit();<span style="white-space:pre">        </span>//自适应行高</p><p>}</p>
复制代码


回复

使用道具 举报

发表于 2026-11-7 17:19:31 来自手机 | 显示全部楼层
回复

使用道具 举报

发表于 2026-11-7 17:20:00 来自手机 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 2026-11-7 17:36:28 | 显示全部楼层
  1. function 取消自动换行(){
  2.         console.clear();
  3.         let 当前表=ActiveSheet,选中区域=Selection;
  4.         //选中区域.WrapText=false;        //不自动换行

  5.         let 单元格地址对象=区域内单元格地址(当前表,选中区域);        //活动表,选中多区
  6.         for(let 格地址属性 in 单元格地址对象){
  7.                 if(单元格地址对象.hasOwnProperty(格地址属性)){
  8.                         let 单元格=当前表.Range(格地址属性);
  9.                         //取消水平两端对齐
  10.                         if(单元格.HorizontalAlignment==-4130){单元格.HorizontalAlignment=1;}
  11.                         单元格.WrapText=false;        //不自动换行
  12.                 }
  13.         }

  14.         选中区域.EntireRow.AutoFit();        //自适应行高
  15. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2026-11-7 18:55:36 | 显示全部楼层

编辑代码测试

编辑代码测试
  1. function 取消自动换行测试(){
  2.         console.clear();
  3.         let 当前表=ActiveSheet,选中区域=Selection;
  4.         //选中区域.WrapText=false;        //不自动换行
  5.        
  6.         let 单元格地址对象=区域内单元格地址(当前表,选中区域);        //活动表,选中多区
  7.         for(let 格地址属性 in 单元格地址对象){
  8.                 if(单元格地址对象.hasOwnProperty(格地址属性)){
  9.                         let 单元格=当前表.Range(格地址属性);
  10.                         //取消水平两端对齐
  11.                         if(单元格.HorizontalAlignment==-4130){单元格.HorizontalAlignment=1;}
  12.                         单元格.WrapText=false;        //不自动换行
  13.                 }
  14.         }
  15.        
  16.         选中区域.EntireRow.AutoFit();        //自适应行高
  17. }

  18. //提取表格选区内单元格地址,让可以逐个单元格操作
  19. //可多个小区块,重叠单元格只处理一次,整行/整列只处理在用区UsedRange内的
  20. function 区域内单元格地址(表,选区){        //返回单元格地址对象
  21.         let 在用区=表.UsedRange;
  22.         let 单元格对象={},计数=0;
  23.        
  24.         //遍历选区内所有小区块
  25.         console.log("选区地址:"+选区.Address() +"\t在用区:"+ 在用区.Address());
  26.         let 选区地址=选区.Address();
  27.         let 选区块组=选区地址.split(',');
  28.         for(let 块号=0;块号<选区块组.length;块号++){
  29.                 let 有效地址=选区块组[块号];        //console.log("块"+块号+":"+选区块组[块号]);
  30.                
  31.                 //处理整行、整列的区
  32.                 let 区块待判地址=选区块组[块号].replace(/[$]/g,'');
  33.                 let 区块在用=Intersect(在用区,表.Range(区块待判地址));
  34.                 let 区块无行地址=区块待判地址.replace(/[\d]/g,'');        //地址去除数字        //整两行$7:$8
  35.                 let 区块无列地址=区块待判地址.replace(/[a-zA-Z]/g,'');        //地址去除字母        //整列$D:$D
  36.                 if(区块无行地址==':' || 区块无列地址==':'){
  37.                         if(区块在用){
  38.                                 有效地址=区块在用.Address();        //整行或整列的在用重叠部分
  39.                         }else{
  40.                                 if(区块无行地址==':'){        //整行跳过
  41.                                         console.log("块"+块号+":"+选区块组[块号]+ "\t//整行不在用区跳过");
  42.                                         continue;
  43.                                 }
  44.                                 if(区块无列地址==':'){        //整列跳过
  45.                                         console.log("块"+块号+":"+选区块组[块号]+ "\t//整列不在用区跳过");
  46.                                         continue;
  47.                                 }
  48.                         }
  49.                 }
  50.                
  51.                 //遍历区内每个单元格
  52.                 let 单块有效区=表.Range(有效地址);
  53.                 for(let 单元格 of 单块有效区.Cells){
  54.                         let 格地址=单元格.Address(0,0);
  55.                         if(typeof 单元格对象[格地址]=="undefined"){
  56.                                 单元格对象[格地址]=1;计数++;        //存单元格地址
  57.                         }else{单元格对象[格地址]++;}
  58.                 }
  59.                 console.log("块"+块号+":"+选区块组[块号] +"\t有效:"+有效地址 +"\t行列数:"+单块有效区.Rows.Count +","+ 单块有效区.Columns.Count);
  60.         }
  61.         console.log("单元格数量:"+ 计数);
  62.         return 单元格对象;
  63. }
复制代码


点评

我编辑你的代码,正常显示!  详情 回复 发表于 7 天前
你可以把代码放在txt文件中,发到 ,我来测试一下。  详情 回复 发表于 2026-11-7 20:53
回复

使用道具 举报

发表于 2026-11-7 20:53:10 | 显示全部楼层

你可以把代码放在txt文件中,发到 184822951@qq.com ,我来测试一下。
回复

使用道具 举报

发表于 2026-11-7 22:41:35 来自手机 | 显示全部楼层
很好谢谢
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层

我编辑你的代码,正常显示!
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
这帖的收藏!
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
这帖的收藏
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-11-15 12:41

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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