1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 复杂的工资表合并问题求助

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-2-6 19:39 | 显示全部楼层 |阅读模式
本帖最后由 cshiq 于 2025-2-6 20:05 编辑

请老师们帮忙处理。

源文件特征及查询的合并要求:
1、每张表都以统一的表名“正式人员”表存在于一个工作簿,工作簿可能含有多张表。查询只合并该“正式人员”表,并增加一列标题为工作簿名称,如“202401”。
2、源表的表名占用2行,查询所合并后的文件无需保留表名行。
3、源表含有双行标题。要求查询保留单行标题名,双行标题名合并为单行标题名,合并的标题名以冒号分隔。
4、每张表的列标题数目不等,且后续向文件夹中添加的表格可能会有新的标题名列。要求查询结果列出所有标题名,将相同标题名的数据合并在一起。


查询结果表.png 源表n.png

源表2.png

源表1.png


表格合并.rar

238.86 KB, 下载次数: 16

TA的精华主题

TA的得分主题

发表于 2025-2-7 09:37 | 显示全部楼层
PQ参考解法

表格合并.zip

250.89 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2025-2-7 11:32 | 显示全部楼层
let
    源 = Folder.Files("C:\Users\minch\Desktop\temp\表格合并\需合并处理的工作簿"),
    删除的其他列 = Table.SelectColumns(源,{"Name", "Content"}),
    重命名的列 = Table.RenameColumns(删除的其他列,{{"Name", "日期"}}),
    取日期 = Table.TransformColumns(重命名的列,{{"日期", each Text.BeforeDelimiter(_,".")}}),
    bin转表 = Table.TransformColumns(取日期,{"Content",each Table.Skip(Excel.Workbook(_){[Name = "正式人员"]}[Data],2)}),
    处理表 = Table.TransformColumns(bin转表,{"Content",each Table.PromoteHeaders( Table.Skip(Table.Transpose(Table.ReplaceValue(Table.FillDown(Table.Transpose(_) ,{"Column1"}),each [Column1],null,(x,y,z) => if x=null then y else y&":"&x ,{"Column2"}))))}),
    展开的Content = Table.ExpandTableColumn(处理表, "Content", Table.ColumnNames(处理表[Content]{2})&{"年度奖金"}, Table.ColumnNames(处理表[Content]{2})&{"年度奖金"}),
    筛选的行 = Table.SelectRows(展开的Content, each [序号] <> null and [序号] <> "")
in
    筛选的行

把目录路径换成你的excel所在位置

TA的精华主题

TA的得分主题

发表于 2025-2-7 11:41 | 显示全部楼层
关键字:自定义
let
    源 = Folder.Files(Excel.CurrentWorkbook(){[Name="表1"]}[Content]{0}[路径]),
    删除的其他列 = Table.SelectColumns(源,{"Content", "Name"}),
    转换 = Table.TransformColumns( 删除的其他列,{"Content",each fx(_)},each Text.Replace(Text.From(_),".xlsx","")),
    重排序的列 = Table.ReorderColumns(转换,{"Name", "Content"}),
    深化与展开 = Table.ExpandTableColumn(重排序的列, "Content", List.Distinct(List.Combine(List.Transform(重排序的列[Content],each Table.ColumnNames(_)))))
in
    深化与展开

TA的精华主题

TA的得分主题

发表于 2025-2-7 11:44 | 显示全部楼层
关键字:folder.files
image.jpg

limonet.7z

228.16 KB, 下载次数: 26

TA的精华主题

TA的得分主题

发表于 2025-2-7 12:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub 数据合并()
Application.ScreenUpdating = False
Dim ar As Variant
Dim br()
Dim d As Object, dc As Object
Set d = CreateObject("scripting.dictionary")
lj = ThisWorkbook.Path & "\需合并处理的工作簿\"
ReDim br(1 To 100000, 1 To 200)
f = Dir(lj & "*.xls*")
y = 2: n = 1
br(1, 1) = "月份"
br(1, 2) = "序号"
Do While f <> ""
    If f <> ThisWorkbook.Name Then
        Set wb = Workbooks.Open(lj & f, 0)
        With wb.Worksheets("正式人员")
            r = .Cells(Rows.Count, 2).End(xlUp).Row
            yy = .Cells.Find("*", searchdirection:=xlPrevious).Column
            ar = .Range("a1").Resize(r, yy)
        End With
        mc = Split(wb.Name, ".")(0)
        wb.Close False
        For j = 2 To yy
            If ar(3, j) = "" Then ar(3, j) = ar(3, j - 1)
            If ar(3, j) <> "" Then
                If ar(4, j) <> "" Then
                    bt = ar(3, j) & ":" & ar(4, j)
                Else
                    bt = ar(3, j)
                End If
                lh = d(bt)
                If lh = "" Then
                    y = y + 1
                    d(bt) = y
                    lh = y
                    br(1, y) = bt
                End If
            End If
        Next j
        For i = 5 To UBound(ar)
            If ar(i, 2) <> "" Then
                n = n + 1
                br(n, 1) = mc
                br(n, 2) = n - 1
                For j = 2 To yy
                    If ar(3, j) <> "" Then
                        If ar(4, j) <> "" Then
                            bt = ar(3, j) & ":" & ar(4, j)
                        Else
                            bt = ar(3, j)
                        End If
                        lh = d(bt)
                        br(n, lh) = ar(i, j)
                    End If
                Next j
            End If
        Next i
    End If
f = Dir
Loop
If n = 1 Or y = 1 Then MsgBox "没有需要合并的数据!": End
With Sheets("正式人员")
    .[a1].CurrentRegion.Borders.LineStyle = 0
    .[a1].CurrentRegion = Empty
    .[a1].Resize(n, y) = br
    .[a1].Resize(n, y).Borders.LineStyle = 1
End With
Application.ScreenUpdating = True
MsgBox "ok!"
End Sub

TA的精华主题

TA的得分主题

发表于 2025-2-7 12:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
表格合并.rar (246.81 KB, 下载次数: 1)

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-2-7 14:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢楼上回复解答的deadzlq老师、minchar老师、limonet老师、3190496160老师,辛苦你们了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-2-7 14:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
limonet老师的代码太完美了,经测试,实际处理问题时可能出现的各种不确定性都能达到我想要的结果,太强大了!谢谢limonet老师,谢谢ExcelHome!

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-2-7 15:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
limonet老师的代码太完美了。经测试,能处理实际工作中标题可能出现的各个不确定性,完全实现我希望达到的结果,太强大了。谢谢limonet老师,谢谢ExcelHome!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

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

GMT+8, 2025-4-23 13:19 , Processed in 0.026285 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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