ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
Python自动化办公应用大全 Excel 2021函数公式学习大典 Kutools for Office 套件发布 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: xg1658

[求助] 处理工作表格,按人、按类型汇总所有行的工作内容

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-4-7 18:59 | 显示全部楼层
WPS里的JSA练习一下——


微信截图_20250407185754.png


250407_多维数据汇总.rar

10.67 KB, 下载次数: 5

用WPS打开并启用宏

TA的精华主题

TA的得分主题

发表于 2025-4-7 19:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub test()
Dim i, j As Integer
Dim ar, br, cr As Variant
Dim d1, d2, d3 As Object
Set d1 = CreateObject("scripting.dictionary")
Set d2 = CreateObject("scripting.dictionary")
Set d3 = CreateObject("scripting.dictionary")
ar = Sheets("工作表1").Range("a1:d" & Sheets("工作表1").[a65536].End(xlUp).Row)
For i = 3 To UBound(ar)
    If ar(i, 2) <> "..." Then
       d1(ar(i, 2)) = "": d2(ar(i, 3)) = ""
       If Not d3.exists(ar(i, 2) & ar(i, 3)) Then
           d3(ar(i, 2) & ar(i, 3)) = ar(i, 4)
           Else
           d3(ar(i, 2) & ar(i, 3)) = d3(ar(i, 2) & ar(i, 3)) & "," & ar(i, 4)
        End If
      End If
Next
With Sheets("工作表1")
.[g2].Resize(1 + d1.Count, 1 + d2.Count).ClearContents
.[g3].Resize(d1.Count, 1) = WorksheetFunction.Transpose(d1.keys)
.[h2].Resize(1, d2.Count) = d2.keys
br = .[g2].Resize(1 + d1.Count, 1 + d2.Count)
ReDim cr(1 To d1.Count, 1 To d2.Count)
For i = 2 To d1.Count + 1
   For j = 2 To d2.Count + 1
   cr(i - 1, j - 1) = d3(br(i, 1) & br(1, j))
   Next
Next
.[h3].Resize(d1.Count, d2.Count) = cr
End With
MsgBox "ok"
End Sub

TA的精华主题

TA的得分主题

发表于 2025-4-7 20:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请参考附件。。。

多维数据汇总.rar

17.25 KB, 下载次数: 14

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-4-7 20:29 | 显示全部楼层
  1. function main() {
  2.     // 获取当前工作簿的第一个工作表
  3.     const sheet = Application.ThisWorkbook.Worksheets.Item(1);
  4.     // 获取数据区域并去除表头
  5.     const data = sheet.Range('a1').CurrentRegion.Value2.slice(1);

  6.     // 提取姓名列并去重
  7.     const names = [...new Set(data.map(row => row[1]))];
  8.     // 提取类型列并去重
  9.     const types = [...new Set(data.map(row => row[2]))];

  10.     // 提前计算姓名和类型的数量
  11.     const nameCount = names.length;
  12.     const typeCount = types.length;

  13.     // 初始化结果数组,包含表头和空内容
  14.     const result = [['姓名', ...types], ...Array(nameCount).fill().map(() => Array(typeCount + 1).fill(''))];

  15.     // 遍历数据并填充结果数组
  16.     data.forEach(([_, name, type, content]) => {
  17.         const rowIndex = names.indexOf(name) + 1;
  18.         const colIndex = types.indexOf(type) + 1;
  19.         result[rowIndex][0] = name;
  20.         result[rowIndex][colIndex] = result[rowIndex][colIndex] === ''? content : result[rowIndex][colIndex] + ',' + content;
  21.     });

  22.     // 将结果写入工作表
  23.     sheet.Range('f1').Resize(nameCount + 1, typeCount + 1).Value2 = result;
  24. }
复制代码

TA的精华主题

TA的得分主题

发表于 2025-4-7 22:14 | 显示全部楼层
  1. function 模仿铭佬()
  2. {
  3.         let res=Range('A2').CurrentRegion().slice(2).reduce((r,[_,n,t,c])=>
  4.                 {
  5.                         let i=r[n]??=r.push([n])-1;
  6.                         let j=r[t]??=r[0].push(t)-1;
  7.                         r[i][j]=r[i][j]===undefined?c:r[i][j]+=c;
  8.                         return r;
  9.                 },[['姓名']])
  10.         Range('H1').Resize(res.length,res[0].length).Value2=res;
  11. }
复制代码


铭佬真是个天才

点评

确实精妙,给铭佬点赞!  发表于 2025-4-8 16:32

TA的精华主题

TA的得分主题

发表于 2025-4-8 06:29 来自手机 | 显示全部楼层
wang-way 发表于 2025-4-7 22:14
铭佬真是个天才

function 模仿铭佬()
{
        let res=Range('A2').CurrentRegion().slice(2).reduce((r,[_,n,t,c])=>
                {
                        let i=r[n]??=r.push([n])-1;
                        let j=r[t]??=r[0].push(t)-1;
                        r[j]=(r[j]||0)+=c;
                        return r;
                },[['姓名']])
        Range('H1').Resize(res.length,res[0].length).Value2=res;
}

TA的精华主题

TA的得分主题

发表于 2025-4-8 11:27 | 显示全部楼层
本帖最后由 袁先生 于 2025-4-8 11:28 编辑

在工作表1中I3单元格中填上如下公式=TEXTJOIN(",",TRUE,FILTER($D$3:$D$12,($C$3:$C$12=I$2)*($B$3:$B$12=$H3),"")),向右填充,再向下填允
image.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-12-15 03:16 , Processed in 1.039836 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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