ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 张起灵1

[求助] 有偿求助,一包芙蓉王

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-21 11:16 | 显示全部楼层
参与一下。。。
  1. Sub ykcbf()   '//2024.5.21
  2.     Dim arr, d
  3.     Application.ScreenUpdating = False
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     With Sheets("数据来源")
  6.         r = .Cells(.Rows.Count, "a").End(xlUp).Row
  7.         arr = .[a1].Resize(r, 12)
  8.     End With
  9.     ReDim brr(1 To 10000, 1 To UBound(arr, 2))
  10.     For i = 1 To UBound(arr)
  11.         s = CStr(arr(i, 4))
  12.         If Not d.exists(s) Then Set d(s) = CreateObject("Scripting.Dictionary")
  13.         d(s)(i) = i
  14.     Next
  15.     b = [{1,2,3,4,5,6,7,9,10,11,12}]
  16.     bb = [{4,5,6,7,11}]
  17.     On Error Resume Next
  18.     For Each k In d.keys
  19.         ReDim Sum(1 To 2)
  20.         For Each kk In d(k).keys
  21.             m = m + 1
  22.             For j = 1 To UBound(b)
  23.                 brr(m, j) = arr(kk, b(j))
  24.             Next
  25.             Sum(1) = Sum(1) + brr(m, 8)
  26.             Sum(2) = Sum(2) + brr(m, 9)
  27.         Next
  28.         m = m + 1
  29.         brr(m, 1) = "合计"
  30.         For x = 1 To UBound(bb)
  31.             brr(m, bb(x)) = brr(m - 1, bb(x))
  32.         Next
  33.         brr(m, 8) = Sum(1)
  34.         brr(m, 9) = Sum(2)
  35.     Next
  36.     With Sheets("VBA结果")
  37.         .UsedRange.Cells.Interior.ColorIndex = 0
  38.         .Columns(4).NumberFormatLocal = "@"
  39.         .[a2].Resize(m, 11) = brr
  40.         For i = 2 To m + 1
  41.             If .Cells(i, 1) = "合计" Then
  42.                 .Cells(i, 1).Resize(1, 11).Cells.Interior.ColorIndex = 6
  43.             End If
  44.         Next
  45.     End With
  46.     Set d = Nothing
  47.     Application.ScreenUpdating = True
  48.     MsgBox "OK!"
  49. End Sub
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-21 11:22 | 显示全部楼层
已解决                              

TA的精华主题

TA的得分主题

发表于 2024-5-21 11:29 | 显示全部楼层
原始数据多了一列空白的,我删了,效果如下
录制_2024_05_21_11_28_44_514.gif

TA的精华主题

TA的得分主题

发表于 2024-5-21 11:30 | 显示全部楼层
JSA代码,可以适合你的WPS软件
  1. function 数据整理(){
  2.         let arr=Sheets.Item("数据来源").Range("a1").CurrentRegion.Value2;
  3.         let dic={},k=0;
  4.         let obj=arr.reduce((obj,x)=>{
  5.                 dic[x[5]]=dic[x[5]] || ++k;
  6.                 let temp=obj[x[5]]=obj[x[5]] || ["合计",,,x[3],x[4],x[5],x[6],0,0,,x[10]];
  7.                 [7,8].forEach(y=>temp[7]+=x[7]);                //求和
  8.                 return obj;
  9.         },{});
  10.         arr.push(...Object.values(obj));
  11.         arr.sort((a,b)=>dic[a[5]]-dic[b[5]]);
  12.         Sheets.Item("JSA结果").Activate();
  13.         Cells.Clear();
  14.         Range("a1").Resize(arr.length,arr[0].length).Value2=arr;
  15.         Range("a1").CurrentRegion.EntireColumn.AutoFit();
  16.         [...Range("a1").CurrentRegion.Columns(1).Cells].forEach((rng,i)=>{
  17.                 if (rng.Value2=="合计") [rng.EntireRow.Interior.ColorIndex, rng.EntireRow.Font.Bold]=[33, true];
  18.         });
  19. }       
复制代码

TA的精华主题

TA的得分主题

发表于 2024-5-21 11:30 | 显示全部楼层
附件在此,请审核效果

测试20240521.zip

14.96 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2024-5-21 11:36 | 显示全部楼层
  1. Sub Test()
  2.     Dim d As Object, i As Long
  3.     Set d = CreateObject("scripting.dictionary")
  4.     d.CompareMode = vbTextCompare
  5.     ar = Sheet1.UsedRange.Value
  6.     ReDim br(1 To UBound(ar) * 2, 1 To UBound(ar, 2))
  7.     For i = 1 To UBound(ar)
  8.         If i > 1 Then
  9.         If ar(i, 4) <> ar(i - 1, 4) Or i = UBound(ar) Then
  10.                 j = j + 1
  11.                 br(j, 1) = "合计"
  12.                 For k = 4 To 7
  13.                     br(j, k) = br(j - 1, k)
  14.                 Next
  15.                     br(j, 8) = s1
  16.                     br(j, 9) = s2
  17.                     br(j, 10) = br(j - 1, 10)
  18.                     br(j, 11) = br(j - 1, 11)
  19.                     s1 = 0
  20.                     s2 = 0
  21.         End If
  22.         End If
  23.                 j = j + 1
  24.                 For k = 1 To UBound(ar, 2) - 1
  25.                     br(j, k) = ar(i, IIf(k < 10, k, k + 1))
  26.                 Next
  27.                 s1 = s1 + ar(i, 8)
  28.                 s2 = s2 + ar(i, 9)
  29.     Next
  30.     With Sheet3
  31.         .Cells.ClearContents
  32.         .Cells.Interior.Color = xlNone
  33.         .Cells.Font.Bold = False
  34.         .Range("a2").Resize(j, UBound(ar, 2)).Value = br
  35.         For i = 2 To j + 1
  36.             If br(i - 1, 1) = "合计" Then
  37.                 .Cells(i, 1).Resize(1, UBound(ar, 2)).Interior.Color = &HF0B000
  38.                 .Cells(i, 1).Resize(1, UBound(ar, 2)).Font.Bold = True
  39.             End If
  40.         Next
  41.     End With

  42.    
  43. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-5-21 11:43 | 显示全部楼层
Sub 分类小计()
Application.ScreenUpdating = False
Dim ar As Variant
Dim d As Object, dc As Object
Set d = CreateObject("scripting.dictionary")
With Sheets("数据来源")
    r = .Cells(Rows.Count, 1).End(xlUp).Row
    ar = .Range("a1:l" & r)
End With
Dim br()
For i = 1 To UBound(ar)
    If ar(i, 1) <> "" Then
        zd = ar(i, 4) & "|" & ar(i, 5) & "|" & ar(i, 6) & "|" & ar(i, 7)
        If Not d.exists(zd) Then Set d(zd) = CreateObject("scripting.dictionary")
        d(zd)(i) = i
    End If
Next i
With Sheets("VBA结果")
    .UsedRange.Font.Bold = False
    .UsedRange.Interior.ColorIndex = 0
    .UsedRange = Empty
    For Each k In d.keys
        n = 0
        ReDim br(1 To UBound(ar), 1 To 11)
        For Each kk In d(k).keys
            xh = kk
            If ar(xh, 2) <> "" Then
                n = n + 1
                For j = 1 To 7
                    br(n, j) = ar(xh, j)
                Next j
                For j = 9 To 12
                    br(n, j - 1) = ar(xh, j)
                Next j
            End If
        Next kk
        n = n + 1
        br(n, 1) = "合计"
        For j = 4 To 7
            br(n, j) = br(n - 1, j)
        Next j
        br(n, 11) = br(n - 1, 11)
        rs = .Cells(Rows.Count, 1).End(xlUp).Row + 1
        .Cells(rs, 1).Resize(n, UBound(br, 2)) = br
        For j = 8 To 9
            .Cells(rs + n - 1, j) = Application.Sum(Application.Index(br, 0, j))
        Next j
        With .Cells(rs + n - 1, 1).Resize(1, 11)
            .Interior.ColorIndex = 33
            .Font.Bold = True
        End With
    Next k
End With
Set d = Nothing
Application.ScreenUpdating = True
MsgBox "ok!"
End Sub

TA的精华主题

TA的得分主题

发表于 2024-5-21 11:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
测试20240521.rar (22.21 KB, 下载次数: 14)

TA的精华主题

TA的得分主题

发表于 2024-5-21 13:13 | 显示全部楼层
JSA 练手
  1. //JSA 012 分类插入合计行
  2. function subtotal1(){
  3.         var wb=ThisWorkbook;
  4.         var sht=wb.Worksheets.Item('数据来源');
  5.         var ar=sht.Range('a1').CurrentRegion.Value();
  6.         keys=new Set(ar.map(r=>r[3]));//D列编码去重
  7.        
  8.         br=[];
  9.         for(k of keys)
  10.         {
  11.                 //console.log(k)
  12.                 t=ar.filter(r=>r[3]==k);//筛选D列编码相同的数据行
  13.                 t.forEach(r=>br.push(r));//存入数组
  14.                 //构建合计行
  15.                 x=['合计','','',t[0][3],t[0][4],t[0][5],t[0][6],0,0,'',t[0][10]];
  16.                 console.log(...x,"////")
  17.                 x[7]=t.reduce((a,c)=>a+c[7],0);//H合计
  18.                 x[8]=t.reduce((a,c)=>a+c[8],0);//I合计
  19.                 //追加合计行
  20.                 br.push(x);
  21.         }
  22.         var sht=wb.Worksheets.Item('VBA结果');
  23.         var ar=sht.Range('a1').Resize(br.length,br[0].length).Value2=br;
  24. }
复制代码

TA的精华主题

TA的得分主题

发表于 2024-5-21 14:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

数组的filter方法好像效率挺低的
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-15 01:09 , Processed in 0.046454 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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