ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 麻烦大神,将任意月到月工资按人名汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-25 17:00 | 显示全部楼层 |阅读模式
麻烦大神,将任意月到月工资按人名汇总,其中可能会出现退休,新增人员,人名位置不一定一一对应,实现汇总表效果,谢谢!

任意月工资按人汇总.rar

131.37 KB, 下载次数: 10

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-25 17:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-25 17:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-1-25 20:54 | 显示全部楼层
参与一下。。。
  1. Sub ykcbf()  '//2024.1.25
  2.     Dim arr, brr, d
  3.     Application.ScreenUpdating = False
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     Set d1 = CreateObject("Scripting.Dictionary")
  6.     Set sh = ThisWorkbook.Sheets("汇总")
  7.     yf1 = Val(sh.[k1]): yf2 = Val(sh.[m1])
  8.     For Each sht In Sheets
  9.         If sht.Name <> sh.Name Then
  10.             fn = Val(sht.Name)
  11.             If fn >= yf1 And fn <= yf2 Then
  12.                 With sht
  13.                     r = .Cells(Rows.Count, 1).End(3).Row
  14.                     arr = .Range("a1:aa" & r)
  15.                     For i = 4 To UBound(arr)
  16.                         For j = 4 To UBound(arr, 2)
  17.                             s = arr(i, 3) & "|" & arr(3, j)
  18.                             d(s) = d(s) + arr(i, j)
  19.                             s = arr(i, 3)
  20.                             If Not d1.exists(s) Then
  21.                                 d1(s) = sht.Name
  22.                             Else
  23.                                 d1(s) = IIf(InStr(d1(s), sht.Name), d1(s), d1(s) & " " & sht.Name)
  24.                             End If
  25.                         Next
  26.                     Next
  27.                 End With
  28.             End If
  29.         End If
  30.     Next
  31.     With sh
  32.         r = .Cells(Rows.Count, 1).End(3).Row
  33.         .[b4:z1000] = ""
  34.         arr = .Range("a1:z" & r)
  35.         For i = 4 To UBound(arr)
  36.             For j = 2 To UBound(arr, 2) - 1
  37.                 s = arr(i, 1) & "|" & arr(3, j)
  38.                 If d.exists(s) Then
  39.                     arr(i, j) = d(s)
  40.                 End If
  41.             Next
  42.             s = arr(i, 1)
  43.             If d1.exists(s) Then
  44.                 arr(i, UBound(arr, 2)) = d1(s)
  45.             Else
  46.                 arr(i, UBound(arr, 2)) = ""
  47.             End If
  48.         Next
  49.         .Range("a1:z" & r) = arr
  50.     End With
  51.     Set d = Nothing
  52.     Application.ScreenUpdating = True
  53.     MsgBox "OK!"
  54. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

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

任意月工资按人汇总.7z

116.52 KB, 下载次数: 16

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-25 21:50 | 显示全部楼层
本帖最后由 wcj6376tcp 于 2024-1-25 22:05 编辑
ykcbf1100 发表于 2024-1-25 20:54
附件供参考。。。

谢谢老师,新增甲11会没有任何数据,如果手动清除汇总表后,不会出现任何数据,麻烦老师再看看看,谢谢!

TA的精华主题

TA的得分主题

发表于 2024-1-25 22:10 | 显示全部楼层
wcj6376tcp 发表于 2024-1-25 21:50
谢谢老师,新增甲11会没有任何数据,如果手动清除汇总表后,不会出现任何数据,麻烦老师再看看看,谢谢!

甲11是12月份开始才有数据的,你必须选择12为截止时间才可以。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-25 22:42 | 显示全部楼层
本帖最后由 wcj6376tcp 于 2024-1-25 22:43 编辑
ykcbf1100 发表于 2024-1-25 22:10
甲11是12月份开始才有数据的,你必须选择12为截止时间才可以。

现在问题是我如果手动清除了汇总表a4以下的数据后,哪怕在k1 m1 输入任何月份运行就只提示OK?

TA的精华主题

TA的得分主题

发表于 2024-1-26 08:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 ykcbf1100 于 2024-1-26 08:47 编辑
wcj6376tcp 发表于 2024-1-25 22:42
现在问题是我如果手动清除了汇总表a4以下的数据后,哪怕在k1 m1 输入任何月份运行就只提示OK?

你的意思是姓名列也要自动生成?
改好了。。。

另外,a4以下区域代码在汇总前会自动帮你先清空的,不用手工清除。

任意月工资按人汇总.7z

119.23 KB, 下载次数: 29

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-26 09:41 | 显示全部楼层
本帖最后由 wcj6376tcp 于 2024-1-26 10:10 编辑
ykcbf1100 发表于 2024-1-26 08:37
你的意思是姓名列也要自动生成?
改好了。。。

谢谢!就是需要这种效果,太厉害了!方便以后季报工资。在老师的基础上修改了一下。

Sub ykcbf()  '//2024.1.25
    Dim arr, brr, d
    Dim Miny, Maxy, Rs As Long
    Dim T As Date
    T = Timer
   
    Miny = InputBox("请输入要汇总的起始月份:", "输入起始月份数...", "1")
    Maxy = InputBox("请输入要汇总的终止月份:", "输入终止月份数...", "12")
    Range("K1").Value = Miny
    Range("M1").Value = Maxy
    Range("V1").Value = "=NOW()" '当前时间
    Cells(1, 22) = Cells(1, 22).Value '记录汇总时间
   
    'Application.ScreenUpdating = False
    Set d = CreateObject("Scripting.Dictionary")
    Set d1 = CreateObject("Scripting.Dictionary")
    Set d2 = CreateObject("Scripting.Dictionary")
    Set sh = ThisWorkbook.Sheets("汇总")
    yf1 = Val(sh.[K1]): yf2 = Val(sh.[M1])
    For Each sht In Sheets
        If sht.Name <> sh.Name Then
            fn = Val(sht.Name)
            If fn >= yf1 And fn <= yf2 Then
                With sht
                    r = .Cells(rows.Count, 1).End(3).Row
                    arr = .Range("A1:AA" & r)
                    For i = 4 To UBound(arr)
                        For j = 4 To UBound(arr, 2)
                            s = arr(i, 3) & "|" & arr(3, j)
                            d(s) = d(s) + arr(i, j)
                            s = arr(i, 3)
                            If Not d1.exists(s) Then
                                d1(s) = sht.Name
                            Else
                                d1(s) = IIf(InStr(d1(s), sht.Name), d1(s), d1(s) & " " & sht.Name)
                            End If
                            d2(arr(i, 3)) = ""
                        Next
                    Next
                End With
            End If
        End If
    Next
    With sh
        r = .Cells(rows.Count, 1).End(3).Row
        .[A4:Z1000] = ""
        .[A4].Resize(d2.Count, 1) = WorksheetFunction.Transpose(d2.keys)
        arr = .Range("A1:Z" & r)
        For i = 4 To UBound(arr)
            For j = 2 To UBound(arr, 2) - 1
                s = arr(i, 1) & "|" & arr(3, j)
                If d.exists(s) Then
                    arr(i, j) = d(s)
                End If
            Next
            s = arr(i, 1)
            If d1.exists(s) Then
                arr(i, UBound(arr, 2)) = d1(s)
            Else
                arr(i, UBound(arr, 2)) = ""
            End If
        Next
        .Range("A1:Z" & r) = arr
    End With
    Set d = Nothing
    'Application.ScreenUpdating = True
    Rs = Sheets("汇总").Range("A3").CurrentRegion.rows.Count - 4 '获取行数
    MsgBox "汇总" & Miny & "-" & Maxy & "月数据完毕!用时 " & Format((Timer - T), "0.0000") & " 秒," & vbCrLf & "共汇总 " & Rs & " 个人员数据。", vbInformation, ""
End Sub


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

本版积分规则

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

GMT+8, 2024-11-19 01:28 , Processed in 0.039237 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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