ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 按关键字做表格分拆

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-12-5 10:12 | 显示全部楼层 |阅读模式
各位大侠,麻烦帮我编一段宏,要求是工作薄示例中有各个客户的明细,另外有一个sheet是需要分拆的客户清单。

要求运行宏后,自动分拆按需要分拆的客户明细为单独的工作薄,文件名的命名格式是:日期-客户名称-汇总实收金额(元)。
其中日期取值:B列,B列所有的日期都是相同的。客户名称取值:D列,汇总实收金额取值计算J列。
新生成的文件保存在原文件目录下面即可。

上传附件:工作簿示例是原始的需要按条件拆分的表格。另外一个是拆分后的示例文件。

示例.rar

352.82 KB, 下载次数: 19

TA的精华主题

TA的得分主题

发表于 2020-12-5 10:43 | 显示全部楼层
论坛里有很多拆分案例,你都接触VBA快6年了,搜索一下参考

TA的精华主题

TA的得分主题

发表于 2020-12-5 12:13 | 显示全部楼层
这个拆分工具完全可以满足你的需求,下载就能用
【新提醒】Excel 灵活拆分工具之四-ExcelVBA程序开发-ExcelHome技术论坛 -  http://club.excelhome.net/thread-1548093-1-1.html

TA的精华主题

TA的得分主题

发表于 2020-12-5 14:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub SplitToWsb()   'by ***笨鸟飞不高***
    Dim i%, j%, qrz%, xh%, hjh%, cfl%, bth%, r%, k%, m%, hjStr$, tStr$, ScStr$, fName$
    Dim rng As Range, rngs As Range, ws As Worksheet, wb As Workbook
    Dim arr, tempAr, hjAr, d As Object
    Set d = CreateObject("Scripting.Dictionary")
    qrz = MsgBox("当前是否选择了拆分总表?", vbYesNo)
    If qrz = 7 Then Exit Sub
    On Error Resume Next
        Set rng = Application.InputBox("请选择带标题行的拆分数据区域", Type:=8)
        If Err.Number <> 0 Then Exit Sub
    On Error GoTo 0
    Application.ScreenUpdating = False
    If rng.Count < 2 Then Exit Sub
    arr = rng
    xh = MsgBox("拆分区域的第一列是否为序号列?", vbYesNo)
    hjh = MsgBox("拆分的分表是否要加合计行?", vbYesNo)
    If hjh = 6 Then
        hjStr = InputBox("请输入合计数据在拆分区域中所对应的列数,如果是多列,以""@""符号分开", "提示")
    End If
    cfl = Val(InputBox("请输入拆分关键字在拆分区域中所对应的列数", "提示"))
    If cfl < LBound(arr, 2) Or cfl > UBound(arr, 2) Then Exit Sub
    bth = Val(InputBox("请输入标题行在拆分区域中的行数", "提示"))
    If bth > 0 Then Set rngs = Cells(rng(1).Row, rng(1).Column).Resize(bth, UBound(arr, 2))
    ScStr = InputBox("拆分输出到工作表还是工作簿 ?", "提示", "工作表")
    If ScStr <> "工作表" And ScStr <> "工作簿" Then Exit Sub
    Application.DisplayAlerts = False
    If ScStr = "工作表" Then
        For Each ws In Sheets
            If ws.Name <> ActiveSheet.Name Then ws.Delete
        Next
    End If
    If ScStr = "工作簿" Then
        qrz = MsgBox("此操作将会覆盖目标文件夹内同名的工作簿!", vbYesNo)
        If qrz = 7 Then Exit Sub
    End If
    For i = bth + 1 To UBound(arr)
        If Len(arr(i, cfl)) Then d(arr(i, cfl)) = d(arr(i, cfl)) & "," & i
    Next
    For i = bth + 1 To UBound(arr)
        If d.exists(arr(i, cfl)) Then
            If Not d.exists(arr(i, cfl) & "|Sc") Then
                r = 0: d(arr(i, cfl) & "|Sc") = "": tStr = d(arr(i, cfl)): tempAr = Split(tStr, ",")
                ReDim ScAr(1 To UBound(tempAr) + 1, 1 To UBound(arr, 2))
                If hjh = 6 Then ScAr(UBound(ScAr), 1) = "合计"
                For k = 1 To UBound(tempAr)
                    r = r + 1
                    If xh = 6 Then
                        ScAr(r, 1) = r
                        For j = 2 To UBound(arr, 2): ScAr(r, j) = arr(tempAr(k), j): Next
                        If hjh = 6 Then
                            hjAr = Split(hjStr, "@")
                            For m = 0 To UBound(hjAr)
                                ScAr(UBound(ScAr), Val(hjAr(m))) = ScAr(UBound(ScAr), Val(hjAr(m))) _
                                    + arr(tempAr(k), Val(hjAr(m)))
                            Next
                        End If
                    Else
                        For j = 1 To UBound(arr, 2): ScAr(r, j) = arr(tempAr(k), j): Next
                        If hjh = 6 Then
                            hjAr = Split(hjStr, "@")
                            For m = 0 To UBound(hjAr)
                                ScAr(UBound(ScAr), Val(hjAr(m))) = ScAr(UBound(ScAr), Val(hjAr(m))) _
                                    + arr(tempAr(k), Val(hjAr(m)))
                            Next
                        End If
                    End If
                Next
            If ScStr = "工作表" Then
                With Worksheets.Add(, Sheets(Sheets.Count))
                    .Name = Trim(arr(i, cfl))
                    If bth > 0 Then rngs.Copy .[a1].Resize(bth, UBound(ScAr, 2))
                    With .Range("A" & bth + 1).Resize(UBound(ScAr), UBound(ScAr, 2))
                        .Borders.Weight = xlThin
                        .HorizontalAlignment = xlCenter
                        .Font.Name = "宋体"
                        .Font.Size = 10
    '                    .NumberFormatLocal = "@"
                        .Value = ScAr
                    End With
                End With
            ElseIf ScStr = "工作簿" Then
                Set wb = Workbooks.Add
                If bth > 0 Then rngs.Copy Workbooks(Workbooks.Count).Sheets(1).[a1].Resize(bth, UBound(ScAr, 2))
                With Workbooks(Workbooks.Count).Sheets(1).Range("A" & bth + 1).Resize(UBound(ScAr), UBound(ScAr, 2))
                    .Borders.Weight = xlThin
                    .HorizontalAlignment = xlCenter
                    .Font.Name = "宋体"
                    .Font.Size = 10
    '                    .NumberFormatLocal = "@"
                    .Value = ScAr
                End With
                fName = ThisWorkbook.Path & "\" & Trim(arr(i, cfl)) & ".xlsx"
                wb.SaveAs fName
                wb.Close
            End If
            End If
        End If
    Next
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

代码供参考!!!

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-6 10:49 | 显示全部楼层
microyip 发表于 2020-12-5 10:43
论坛里有很多拆分案例,你都接触VBA快6年了,搜索一下参考

我懒啊,怕学。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-6 10:52 | 显示全部楼层
3190496160 发表于 2020-12-5 12:13
这个拆分工具完全可以满足你的需求,下载就能用
【新提醒】Excel 灵活拆分工具之四-ExcelVBA程序开发-Exce ...

首先我我希望不是所有的数据都拆分,只拆分指定的关键客户,拆分之后自动保存在电脑上,而且文件名必须要按我的要求来命名。所以有点纠结。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-6 10:53 | 显示全部楼层
3190496160 发表于 2020-12-5 12:13
这个拆分工具完全可以满足你的需求,下载就能用
【新提醒】Excel 灵活拆分工具之四-ExcelVBA程序开发-Exce ...

最好是帮我写一段简单的代码,我这个文件什么格式列数,表头名称等都是一成不变的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-6 11:00 | 显示全部楼层
我是想要拆分成这样一个文件名,否则再好的拆分工具对我来说也是没用,因为这个文件是发给客户的,同时在以后使用过程中,不需要打开这个文件,就可以知道当天这个客户的费用情况。
微信图片_20201206105909.png

TA的精华主题

TA的得分主题

发表于 2020-12-6 12:15 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
现成的工具给你不想用,那就出钱定制呗

TA的精华主题

TA的得分主题

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

意思就是我懒,所以想找免费的代工呗!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 11:00 , Processed in 0.047467 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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