ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 将并排多列拆分成包含子文件夹工作簿

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-29 22:00 | 显示全部楼层 |阅读模式
本帖最后由 lele400024 于 2024-9-30 09:06 编辑

核心需求:
1、按源数据Q列新建文件夹,根据Q列拆分为不同文件夹内的三个工作簿,不同工作簿分别对应K、M、O列品牌数据。(可以不用参照“报表格式”表格,直接拆分即可)

如果各位老师有时间还可以做以下内容
2、若源数据F列为“不含税材料价”,则“报表格式”G列=源数据L/N/P×1.13,保留2为小数;否则,将源数据F列写入报表“备注”。
3、格式参照:“报表格式”第一行为源数据Q列名称&报价单,C列对应源数据K/M/O,H列等于G列乘以F列,D列对应源数据E列。

下图为源数据表
源数据表.png

下图为拆分工作簿格式
报表格式.png
下图为实现效果
拆分文件夹.png 拆分文件夹内工作簿.png 拆分后工作簿明细.png

附件如下:
并排多列拆分.rar (68.04 KB, 下载次数: 1)

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-29 22:18 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
涉及上万行数据,拆分文件夹上百个,一个个手动建太耗时了。拜托各位老师帮助,感谢

TA的精华主题

TA的得分主题

发表于 2024-9-29 22:28 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-9-30 07:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
商业的,建议付费。虽然可以用字典嵌套做,但需要花费半天时间

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-30 07:57 来自手机 | 显示全部楼层
按自己理解写了一下,但是还是无法实现,请各位老师如果有时间帮忙修改,再次感谢
Sub SplitWorkbooksByMultipleColumns()
    Dim sourceWorkbook As Workbook
    Set sourceWorkbook = Workbooks("数据.xlsx") '请修改为实际的工作簿名称
   
    Dim sourceSheet As Worksheet
    Set sourceSheet = sourceWorkbook.Sheets("源数据")
   
    Dim lastRow As Long
    lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "Q").End(xlUp).Row
   
    Dim uniqueQValues As New Collection
    Dim i As Long
    For i = 2 To lastRow
        value = sourceSheet.Cells(i, "Q").Value
        On Error Resume Next
        uniqueQValues.Add value, CStr(value)
        On Error GoTo 0
    Next i
   
    Dim desktopPath As String
    desktopPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
   
    Dim qValue As Variant
    For Each qValue In uniqueQValues
        Dim uniqueKValues As New Collection
        Dim uniqueMValues As New Collection
        Dim uniqueOValues As New Collection
        
        For i = 2 To lastRow
            If sourceSheet.Cells(i, "Q").Value = qValue Then
                kValue = sourceSheet.Cells(i, "K").Value
                mValue = sourceSheet.Cells(i, "M").Value
                oValue = sourceSheet.Cells(i, "O").Value
                On Error Resume Next
                uniqueKValues.Add kValue, CStr(kValue)
                uniqueMValues.Add mValue, CStr(mValue)
                uniqueOValues.Add oValue, CStr(oValue)
                On Error GoTo 0
            End If
        Next i
        
        Dim kValue As Variant
        Dim mValue As Variant
        Dim oValue As Variant
        For Each kValue In uniqueKValues
            For Each mValue In uniqueMValues
                For Each oValue In uniqueOValues
                    Dim newWorkbook As Workbook
                    Set newWorkbook = Workbooks.Add
                    
                    Dim newSheet As Worksheet
                    Set newSheet = newWorkbook.Sheets(1)
                    newSheet.Name = qValue & "-" & kValue
                    
                    sourceSheet.Range("A1:Q" & lastRow).AutoFilter Field:=17, Criteria1:=qValue '假设 Q 列是第 17 列
                    sourceSheet.Range("A1:Q" & lastRow).AutoFilter Field:=11, Criteria1:=kValue '假设 K 列是第 11 列
                    sourceSheet.Range("A1:Q" & lastRow).AutoFilter Field:=13, Criteria1:=mValue '假设 M 列是第 13 列
                    sourceSheet.Range("A1:Q" & lastRow).AutoFilter Field:=15, Criteria1:=oValue '假设 O 列是第 15 列
                    
                    Select Case newSheet.Name
                        Case qValue & "-" & kValue
                            newSheet.Range("A1").Value = "对应列 L"
                            newSheet.Range("A2").Value = sourceSheet.Cells(2, "L").Value
                            Dim lRow As Long
                            lRow = 2
                            For i = 2 To lastRow
                                If sourceSheet.Cells(i, "Q").Value = qValue And sourceSheet.Cells(i, "K").Value = kValue And sourceSheet.AutoFilterMode Then
                                    lRow = lRow + 1
                                    newSheet.Range("A" & lRow).Value = sourceSheet.Cells(i, "L").Value
                                End If
                            Next i
                        Case qValue & "-" & mValue
                            newSheet.Range("A1").Value = "对应列 N"
                            newSheet.Range("A2").Value = sourceSheet.Cells(2, "N").Value
                            Dim nRow As Long
                            nRow = 2
                            For i = 2 To lastRow
                                If sourceSheet.Cells(i, "Q").Value = qValue And sourceSheet.Cells(i, "M").Value = mValue And sourceSheet.AutoFilterMode Then
                                    nRow = nRow + 1
                                    newSheet.Range("A" & nRow).Value = sourceSheet.Cells(i, "N").Value
                                End If
                            Next i
                        Case qValue & "-" & oValue
                            newSheet.Range("A1").Value = "对应列 P"
                            newSheet.Range("A2").Value = sourceSheet.Cells(2, "P").Value
                            Dim pRow As Long
                            pRow = 2
                            For i = 2 To lastRow
                                If sourceSheet.Cells(i, "Q").Value = qValue And sourceSheet.Cells(i, "O").Value = oValue And sourceSheet.AutoFilterMode Then
                                    pRow = pRow + 1
                                    newSheet.Range("A" & pRow).Value = sourceSheet.Cells(i, "P").Value
                                End If
                            Next i
                    End Select
                    
                    newWorkbook.SaveAs desktopPath & "\" & qValue & "_folder\" & qValue & "-" & kValue & ".xlsx"
                    newWorkbook.Close False
                    
                    MkDir desktopPath & "\" & qValue & "_folder"
                Next oValue
            Next mValue
        Next kValue
    Next qValue
   
    sourceSheet.AutoFilterMode = False
End Sub

TA的精华主题

TA的得分主题

发表于 2024-9-30 08:22 | 显示全部楼层
楼主可以考虑把多个需求拆分成单一需求分别求助,利于解决问题。需求太多,写代码太费时间,大部分人就不愿出手,毕竟不是付费求助。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-30 08:36 | 显示全部楼层
ykcbf1100 发表于 2024-9-30 08:22
楼主可以考虑把多个需求拆分成单一需求分别求助,利于解决问题。需求太多,写代码太费时间,大部分人就不愿 ...

好的,我马上拆分一下需求

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-30 08:45 | 显示全部楼层
ykcbf1100 发表于 2024-9-30 08:22
楼主可以考虑把多个需求拆分成单一需求分别求助,利于解决问题。需求太多,写代码太费时间,大部分人就不愿 ...

老师,已经将需求拆分了,看这样可以吗

TA的精华主题

TA的得分主题

发表于 2024-9-30 08:59 | 显示全部楼层
lele400024 发表于 2024-9-30 08:45
老师,已经将需求拆分了,看这样可以吗

你数量用的是哪一列的数据?我看了你拆分后的工作表,数量都是1,和源数据对不上啊。

TA的精华主题

TA的得分主题

发表于 2024-9-30 09:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
而且,人防就三个记录,你拆分成三个工作簿,而这三个工作簿中的数据都是一样的。你这个拆分逻辑有点问题啊。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 05:57 , Processed in 0.050073 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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