ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 根据A列拆分成新的工作簿里的多个工作表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-4-21 14:25 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
按下按钮直接根据A列内容拆分成新的工作簿里的多个工作表,同时删除V列开始的所有内容,并跳转为当前打开状态,或者直接跳出另存为界面,谢谢指教
1713680494584.png

希望达到的效果

希望达到的效果

测试.rar

19.55 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2024-4-21 14:36 | 显示全部楼层
你的意思是新的工作簿不退出吧。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-21 14:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ykcbf1100 发表于 2024-4-21 14:36
你的意思是新的工作簿不退出吧。

直接打开新的工作簿,或者新工作簿另存为的界面都可以

TA的精华主题

TA的得分主题

发表于 2024-4-21 14:44 | 显示全部楼层
ykcbf1100 发表于 2024-4-21 14:36
你的意思是新的工作簿不退出吧。

应该是产生一个新的工作簿里、多表就行

TA的精华主题

TA的得分主题

发表于 2024-4-21 14:55 | 显示全部楼层
shiruiqiang 发表于 2024-4-21 14:44
应该是产生一个新的工作簿里、多表就行

附件供参考,新工作簿要保存为“工作簿另存”。

测试.7z

23.51 KB, 下载次数: 17

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-21 14:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
参与一下。。。

  1. Sub ykcbf2()  '//2024.4.21
  2.     Dim arr, brr, d
  3.     Set d = CreateObject("scripting.dictionary")
  4.     Application.ScreenUpdating = False
  5.     Application.DisplayAlerts = False
  6.     Dim tm: tm = Timer
  7.     Set ws = ThisWorkbook
  8.     Set sh = ws.Sheets("成绩确认")
  9.     p = ThisWorkbook.Path & ""
  10.     bt = 2
  11.     arr = sh.UsedRange
  12.     For i = 3 To UBound(arr)
  13.         s = arr(i, 1)
  14.         If s <> Empty Then
  15.             If Not d.Exists(s) Then
  16.                 Set d(s) = CreateObject("scripting.dictionary")
  17.             End If
  18.             d(s)(i) = Application.Index(arr, i)
  19.         End If
  20.     Next i
  21.     Application.SheetsInNewWorkbook = d.Count
  22.     Set wb = Workbooks.Add
  23.     For Each k In d.keys
  24.         n = n + 1
  25.         Set sht = wb.Sheets(n)
  26.         m = d(k).Count
  27.         With sht
  28.             sh.Cells.Copy .[a1]
  29.             .Name = k
  30.             .UsedRange.Offset(m + bt).Clear
  31.             .[v:Z].Delete
  32.             .[v3:w3] = ""
  33.             .DrawingObjects.Delete
  34.             .Cells(bt + 1, 1).Resize(m, UBound(arr, 2)) = Application.Rept(d(k).Items, 1)
  35.         End With
  36.     Next k
  37.     wb.SaveAs p & "工作簿另存"
  38.     '    sh.Activate
  39.     Set d = Nothing
  40.     Application.DisplayAlerts = True
  41.     Application.ScreenUpdating = True
  42.     MsgBox "共用时:" & Format(Timer - tm) & "秒!"
  43. End Sub
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-21 15:22 | 显示全部楼层
ykcbf1100 发表于 2024-4-21 14:55
附件供参考,新工作簿要保存为“工作簿另存”。

测试完美,非常感谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-21 15:33 | 显示全部楼层
本帖最后由 cnkele 于 2024-4-21 15:34 编辑

第一个工作表里没有删除V列后面的,其他工作表删除了,是不是删除[v:Z].Delete这段代码里少了啥?
  1. Sub 成绩打印另存()  '//2024.4.21
  2.     Dim arr, brr, d
  3.     Set d = CreateObject("scripting.dictionary")
  4.     Application.ScreenUpdating = False
  5.     Application.DisplayAlerts = False
  6.     Dim tm: tm = Timer
  7.     Set ws = ThisWorkbook
  8.     Set sh = ws.Sheets("学生签名")
  9.     p = ThisWorkbook.Path & ""
  10.     bt = 2
  11.     arr = sh.UsedRange
  12.     For i = 3 To UBound(arr)
  13.         s = arr(i, 1)
  14.         If s <> Empty Then
  15.             If Not d.Exists(s) Then
  16.                 Set d(s) = CreateObject("scripting.dictionary")
  17.             End If
  18.             d(s)(i) = Application.Index(arr, i)
  19.         End If
  20.     Next i
  21.     Application.SheetsInNewWorkbook = d.Count
  22.     Set wb = Workbooks.Add
  23.     For Each k In d.keys
  24.         n = n + 1
  25.         Set sht = wb.Sheets(n)
  26.         m = d(k).Count
  27.         With sht
  28.             sh.Cells.Copy .[a1]
  29.             .Name = k
  30.             .UsedRange.Offset(m + bt).Clear
  31.             .[v:Z].Delete
  32.             .[v3:w3] = ""
  33.             .DrawingObjects.Delete
  34.             .Cells(bt + 1, 1).Resize(m, UBound(arr, 2)) = Application.Rept(d(k).Items, 1)
  35.         End With
  36.     Next k
  37.     wb.SaveAs p & "工作簿另存"
  38.     '    sh.Activate
  39.     Set d = Nothing
  40.     Application.DisplayAlerts = True
  41.     Application.ScreenUpdating = True
  42.     MsgBox "共用时:" & Format(Timer - tm) & "秒!"
  43. End Sub
复制代码
capture_20240421152922360.jpg

TA的精华主题

TA的得分主题

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

新工作簿第一个工作表没有删除V列后面的内容

TA的精华主题

TA的得分主题

发表于 2024-4-21 15:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub test1()
  2.   Dim data, rowHeights() As Double, dict As Object
  3.   Dim i As Long, j As Long, vKey As Variant
  4.   Dim dstFolder As String, ws As String
  5.   Dim titleRow As Long, splitCol As Long
  6.   
  7.   DoApp False
  8.   
  9.   titleRow = 2
  10.   splitCol = 1
  11.   j = 21
  12.   
  13.   ReDim rowHeights(1 To titleRow + 1)
  14.   
  15.   dstFolder = ThisWorkbook.Path & "\"
  16.   
  17.   Set dict = CreateObject("Scripting.Dictionary")
  18.   With ActiveSheet
  19.     data = .Range("A1").CurrentRegion.Resize(, j).Value
  20.     For i = titleRow + 1 To UBound(data)
  21.       ws = data(i, splitCol)
  22.       If Not dict.Exists(ws) Then Set dict(ws) = .Range("A1").Resize(titleRow, j)
  23.       Set dict(ws) = Union(dict(ws), .Range("A" & i).Resize(, j))
  24.     Next
  25.     For j = 1 To UBound(data, 2)
  26.       data(1, j) = .Columns(j).ColumnWidth
  27.     Next
  28.     For i = 1 To UBound(rowHeights)
  29.       rowHeights(i) = .Rows(i).RowHeight
  30.     Next
  31.   End With
  32.   
  33.   j = 0
  34.   Application.SheetsInNewWorkbook = dict.Count
  35.   With Workbooks.Add
  36.     For Each vKey In dict.Keys
  37.       j = j + 1
  38.       With .Worksheets(j)
  39.         dict(vKey).Copy .Range("A1")
  40.         .Name = vKey
  41.         For i = 1 To UBound(data, 2)
  42.           .Columns(i).ColumnWidth = data(1, i)
  43.         Next
  44.         For i = 1 To UBound(rowHeights) - 1
  45.           .Rows(i).RowHeight = rowHeights(i)
  46.         Next
  47.         .Rows(i & ":" & .UsedRange.Rows.Count).RowHeight = rowHeights(i)
  48.         .DrawingObjects.Delete
  49.       End With
  50.     Next
  51.     .SaveAs dstFolder & Split(ThisWorkbook.Name, ".xls")(0) & "-拆分副本", 51
  52.     .Close
  53.   End With
  54.   'Next
  55.   
  56.   With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
  57.     .SetText ""
  58.     .PutInClipboard
  59.   End With
  60.   
  61.   Set dict = Nothing
  62.   Application.SheetsInNewWorkbook = 1
  63.   DoApp
  64.   Beep
  65. End Sub

  66. Function DoApp(Optional b As Boolean = True)
  67.   With Application
  68.     .ScreenUpdating = b
  69.     .DisplayAlerts = b
  70.     .Calculation = -b * 30 - 4135
  71.   End With
  72. End Function
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-29 08:15 , Processed in 0.049030 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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