ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 表格拆分问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-27 22:21 | 显示全部楼层 |阅读模式
具体要求如下:1.指定2个关键列进行表格拆分,一个关键列为拆分后的文件名,另一个关键列为拆分后的工作表名。

                       2.原表格是汇总表,拆分后的表格为模板表格式。 表格拆分.zip (20.32 KB, 下载次数: 9)
Snipaste_2024-08-27_22-21-31.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-27 22:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
以下是ai智障写的代码,循环第二次就出错:Sub SplitSheetByTemplate()
    Dim ws As Worksheet
    Dim templateSheet As Worksheet
    Dim wbNew As Workbook
    Dim dict As Object
    Dim lastRow As Long
    Dim lastCol As Long
    Dim fileNameCol As Long
    Dim sheetNameCol As Long
    Dim cell As Range
    Dim key As Variant
    Dim keys() As String
    Dim i As Long
    Dim mapping As Variant

    ' 设置源工作表和模板工作表
    Set ws = ThisWorkbook.Sheets("Sheet1") ' 请将 "Sheet1" 更改为实际的源工作表名称
    Set templateSheet = ThisWorkbook.Sheets("Template") ' 请将 "Template" 更改为实际的模板工作表名称

    ' 获取最后一行和最后一列
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

    ' 创建字典存储唯一的关键字组合
    Set dict = CreateObject("Scripting.Dictionary")

    ' 获取用户输入的文件名和工作表名列索引
    fileNameCol = Application.InputBox("请输入工作簿名所在列的索引(例如 A=1, B=2 等):", Type:=1)
    sheetNameCol = Application.InputBox("请输入工作表名所在列的索引(例如 A=1, B=2 等):", Type:=1)

    ' 获取用户输入的映射关系
    ReDim mapping(1 To lastCol)
    For i = 1 To lastCol
        Dim userInput As String
        userInput = Application.InputBox("请输入源表格列 " & ws.Cells(1, i).Address & " 在模板中的位置(例如 B5 表示将此列内容放到模板的 B5):", Type:=2)
        If userInput <> "" Then
            mapping(i) = userInput
        Else
            mapping(i) = "" ' 如果用户没有输入,则将映射为空
        End If
    Next i

    ' 循环遍历行,添加唯一的关键字组合到字典中
    For Each cell In ws.Range(ws.Cells(2, fileNameCol), ws.Cells(lastRow, fileNameCol))
        If Not dict.exists(cell.Value & "|" & cell.Offset(0, sheetNameCol - fileNameCol).Value) And cell.Value <> "" And cell.Offset(0, sheetNameCol - fileNameCol).Value <> "" Then
            dict.Add cell.Value & "|" & cell.Offset(0, sheetNameCol - fileNameCol).Value, cell.Row
        End If
    Next cell

    ' 循环处理每个唯一关键字,创建新的工作簿和工作表
    For Each key In dict.keys
        keys = Split(key, "|")
        Dim fileName As String
        Dim sheetName As String
        fileName = keys(0) ' 工作簿名
        sheetName = keys(1) ' 工作表名

        ' 检查工作簿是否已存在
        On Error Resume Next
        Set wbNew = Workbooks(fileName & ".xlsx")
        On Error GoTo 0

        If wbNew Is Nothing Then
            ' 如果工作簿不存在,则新建一个工作簿
            Set wbNew = Workbooks.Add
            ' 删除默认工作表
            Application.DisplayAlerts = False
            Do While wbNew.Sheets.Count > 0
                wbNew.Sheets(1).Delete
            Loop
            Application.DisplayAlerts = True
            ' 添加新工作表
            templateSheet.Copy After:=wbNew.Sheets(wbNew.Sheets.Count)
            wbNew.Sheets(wbNew.Sheets.Count).Name = sheetName
        Else
            ' 如果工作簿已存在,则添加新的工作表
            templateSheet.Copy After:=wbNew.Sheets(wbNew.Sheets.Count)
            wbNew.Sheets(wbNew.Sheets.Count).Name = sheetName
        End If

        ' 将当前行的数据根据映射关系复制到新工作表
        Dim sourceRow As Long
        sourceRow = dict(key)

        For i = 1 To lastCol
            If mapping(i) <> "" Then
                ' 将源表格中的数据放置到新工作表中的指定位置
                wbNew.Sheets(sheetName).Range(mapping(i)).Value = ws.Cells(sourceRow, i).Value
            End If
        Next i

        ' 保存并关闭新工作簿
        wbNew.SaveAs ThisWorkbook.Path & "\" & fileName & ".xlsx"
        wbNew.Close SaveChanges:=True
    Next key

    ' 提示用户过程已完成
    MsgBox "表格已根据指定的关键字拆分并保存为多个工作簿。", vbInformation
End Sub

TA的精华主题

TA的得分主题

发表于 2024-8-27 22:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这是竞赛题目哇?

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-27 23:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

怎么可能啊,大佬没出手呢,小KISS

TA的精华主题

TA的得分主题

发表于 2024-8-28 07:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub qs()
Dim arr, i, dic, sht As Worksheet, xb As Workbook
Application.DisplayAlerts = False: Application.ScreenUpdating = False
Set sht = ThisWorkbook.Sheets("拆分模板")
Set dic = CreateObject("scripting.dictionary")
Set d2 = CreateObject("scripting.dictionary")
arr = Sheet1.Range("a1").CurrentRegion.Value
For i = 2 To UBound(arr)
dic(arr(i, 1)) = ""
d2(arr(i, 4)) = ""
Next
brr = [{"按部门拆分","按月份拆分"}]
ar = Array(dic.keys, d2.keys)
For Each a In ar
    Set xb = Workbooks.Add
    For Each kk In a
    sht.Copy after:=xb.Sheets(xb.Sheets.Count)
        ActiveSheet.Name = kk
    Next
'    kk = a
    xb.Sheets("Sheet1").Delete
    sm = sm + 1
    xb.SaveAs ThisWorkbook.Path & "\" & brr(sm) & ".xlsx"
    xb.Close (0)
Next
Application.DisplayAlerts = True: Application.ScreenUpdating = True
Set sht = Nothing: Set xb = Nothing
Set dic = nothin: Set d2 = Nothing
MsgBox "ok!"
End Sub

TA的精华主题

TA的得分主题

发表于 2024-8-28 07:12 | 显示全部楼层
Sub qs()
Dim arr, i, dic, sht As Worksheet, xb As Workbook
Application.DisplayAlerts = False: Application.ScreenUpdating = False
Set sht = ThisWorkbook.Sheets("拆分模板")
Set dic = CreateObject("scripting.dictionary")
Set d2 = CreateObject("scripting.dictionary")
arr = Sheet1.Range("a1").CurrentRegion.Value
For i = 2 To UBound(arr)
dic(arr(i, 1)) = ""
d2(arr(i, 4)) = ""
Next
brr = [{"按部门拆分","按月份拆分"}]
ar = Array(dic.keys, d2.keys)
For Each a In ar
    Set xb = Workbooks.Add
    For Each kk In a
    sht.Copy after:=xb.Sheets(xb.Sheets.Count)
        ActiveSheet.Name = kk
    Next
'    kk = a
    xb.Sheets("Sheet1").Delete
    sm = sm + 1
    xb.SaveAs ThisWorkbook.Path & "\" & brr(sm) & ".xlsx"
    xb.Close (0)
Next
Application.DisplayAlerts = True: Application.ScreenUpdating = True
Set sht = Nothing: Set xb = Nothing
Set dic = Nothing: Set d2 = Nothing
MsgBox "ok!"
End Sub

TA的精华主题

TA的得分主题

发表于 2024-8-28 07:13 | 显示全部楼层

TA的精华主题

TA的得分主题

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

表格拆分.rar

52.68 KB, 下载次数: 13

TA的精华主题

TA的得分主题

发表于 2024-8-28 07:18 | 显示全部楼层
按部门拆分和按月份拆分都写了。

附件供参考。。。

表格拆分.zip

90.9 KB, 下载次数: 12

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-8-28 07:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
按部门拆分
  1. Sub ykcbf()   '//2024.8.28    按部门拆分
  2.     Application.ScreenUpdating = False
  3.     Application.DisplayAlerts = False
  4.     Dim tm: tm = Timer
  5.     Set fso = CreateObject("Scripting.FileSystemObject")
  6.     Set d = CreateObject("Scripting.Dictionary")
  7.     p = ThisWorkbook.Path & ""
  8.     Set ws = ThisWorkbook
  9.     Set sh = ws.Sheets("汇总表")
  10.     On Error Resume Next
  11.     arr = sh.UsedRange
  12.     For i = 2 To UBound(arr)
  13.         s = CStr(arr(i, 1)): ss = arr(i, 4)
  14.         If Not d.exists(s) Then Set d(s) = CreateObject("Scripting.Dictionary")
  15.         If Not d(s).exists(ss) Then
  16.             d(s)(ss) = Array(arr(i, 2), arr(i, 3))
  17.         Else
  18.             t = d(s)(ss)
  19.             t(0) = t(0) + arr(i, 2)
  20.             t(1) = t(1) + arr(i, 3)
  21.             d(s)(ss) = t
  22.         End If
  23.     Next
  24.     For Each k In d.keys
  25.         Application.SheetsInNewWorkbook = d(k).Count
  26.         Set wb = Workbooks.Add
  27.         m = 0
  28.         For Each kk In d(k).keys
  29.             m = m + 1
  30.             t = d(k)(kk)
  31.             ws.Sheets("拆分模板").Cells.Copy wb.Sheets(m).[a1]
  32.             With wb.Sheets(m)
  33.                 .Name = kk
  34.                 .[c2] = kk
  35.                 .[b4] = k
  36.                 .[d4] = t(0)
  37.                 .[b6] = t(1)
  38.             End With
  39.         Next
  40.         wb.SaveAs p & k
  41.         wb.Close
  42.     Next
  43.     Set d = Nothing
  44.     Application.ScreenUpdating = True
  45.     MsgBox "拆分完毕,共用时:" & Format(Timer - tm) & "秒!"
  46. End Sub

复制代码


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

本版积分规则

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

GMT+8, 2024-11-18 18:49 , Processed in 0.033442 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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