ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 297|回复: 12

[求助] 转化表格

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-11 10:45 | 显示全部楼层 |阅读模式
想把源数据转为转表格式的表格,转表中的表是模拟表,不要用透视表和pq,只用jsa,请大佬们出手相助!

转表.rar (7.44 KB, 下载次数: 12)

TA的精华主题

TA的得分主题

发表于 2024-8-11 13:48 | 显示全部楼层
转表.7z (7.11 KB, 下载次数: 3) 随便搞了一下,合计就不搞了,没什么意思

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-8-11 14:23 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-8-11 14:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
转表.7z (7.3 KB, 下载次数: 6) 合计加了

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-8-11 15:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-8-11 15:29 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-11 19:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 yangqianming 于 2024-8-11 20:08 编辑
您觉得简单没意思我确好多看不懂,比如行列号怎么算出来的,怎么对应上的
  1. function test(){
  2.     let res = [year, month, area] = [['年'], ['月'], ['地区']], hj = {}; // 初始化结果数组,包含年、月、地区三个子数组, 初始化hj字典
  3.     Sheets('源数据').Range('a1').CurrentRegion.Value2.slice(1).forEach(([a, y, m, s, j]) => { // 循环源数据,把各列结构
  4.         let r, c; // r为行号,c为列号
  5.         if (!month[y + m]) { // 如果月份在month数组中不存在
  6.             hj[y + m] = [0, 0]; // 初始化合计对象中的年月键,用于存储数量和金额
  7.             month[y + m] = year.push(y) - 1; // 处理年份行,并获取新添加年份的索引
  8.             year.push(y); // 再次添加年份,用于构建列头
  9.             month.push(m); // 处理月份行
  10.             month.push(m); // 再次添加月份,用于构建列头
  11.             area.push('数量'); // 处理数量行
  12.             area.push('金额'); // 处理金额行
  13.         }
  14.         area[a] ??= res.push([a]) - 1; // 如果地区不存在,则添加到area数组中,并获取其索引
  15.         r = area[a]; // 获取地区对应的行号
  16.         c = month[y + m]; // 获取月份对应的列号
  17.         res[r][c] = s; // 本行数据写入结果数组(数量)
  18.         res[r][c + 1] = j; // 本行数据写入结果数组(金额)
  19.         hj[y + m][0] += s; // 记录本月数量合计
  20.         hj[y + m][1] += j; // 记录本月金额合计
  21.     });
  22.     res.push(['合计', ...Object.values(hj).flat()]); // 压入合计行
  23.     Sheets('转表').Cells.Clear(); // 清除转表工作表中的内容
  24.     Sheets('转表').Range('a1').Resize(res.length, res[0].length).Value2 = res; // 将结果数组写入转表工作表
  25.     let rng=Sheets('转表').Range('a1').Resize(res.length, res[0].length);
  26.              rng.Borders.LineStyle = xlContinuous;//边框
  27.                 rng.Borders.Item(xlEdgeLeft).Weight = xlMedium;
  28.                 rng.Borders.Item(xlEdgeBottom).Weight = xlMedium;
  29.                 rng.Borders.Item(xlEdgeTop).Weight = xlMedium;
  30.                 rng.Borders.Item(xlEdgeRight).Weight = xlMedium;                       
  31.                 rng.HorizontalAlignment=xlCenter;//水平居中
  32.                 rng.VerticalAlignment=xlCenter;//垂直居中
  33.                 rng.Font.Name="黑体"
  34.                 rng.Font.Size=16
  35.    
  36.      // 合并单元格
  37.     let r = 1, c = 2, cs = 0, ce = 0;
  38.     while(r <= 2){
  39.         while(c <= res[0].length){
  40.             if(Sheets('转表').Cells(r, c).Text != Sheets('转表').Cells(r, c - 1).Text){
  41.                 cs = c; // 开始新的合并区域
  42.             } else {
  43.                 if(Sheets('转表').Cells(r, c).Text != Sheets('转表').Cells(r, c + 1).Text){
  44.                     ce = c; // 结束当前合并区域
  45.                     if(ce > cs) {
  46.                         Sheets('转表').Range(Sheets('转表').Cells(r, cs), Sheets('转表').Cells(r, ce)).Merge(true);
  47.                     }
  48.                 }
  49.             }
  50.             c++;
  51.         }
  52.         r++;
  53.     }
  54. }
复制代码

转表.rar

352.19 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2024-8-13 09:40 | 显示全部楼层
将楼主的原数据更改了一下,稍微加大一点点难度.
本代码使用Ramda的方法(还有优化空间...)
表格转换.png

表格转换.rar

67.13 KB, 下载次数: 6

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-13 10:11 | 显示全部楼层
spaghetti8 发表于 2024-8-13 09:40
将楼主的原数据更改了一下,稍微加大一点点难度.
本代码使用Ramda的方法(还有优化空间...)

可惜我看不懂!我没有学过编程,读书时都没有看见过电脑,后来工作上有时要用到表格工具就学一下,最开始是往格子里面录,再后来学了几个简单函数,然后不会了就求助,看到wps js好像感觉能看懂一点儿,就学着写,无耐怎么也搞不明白,希望有一天也能写一点点,谢谢您的解答!

TA的精华主题

TA的得分主题

发表于 2024-8-13 10:27 | 显示全部楼层
yangqianming 发表于 2024-8-13 10:11
可惜我看不懂!我没有学过编程,读书时都没有看见过电脑,后来工作上有时要用到表格工具就学一下,最开始 ...

你自己的代码也适合那个增加的难度的,不过感觉JS的轮子实在是太多了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-19 09:59 , Processed in 0.059569 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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