ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] [求助] VBA怎样根据总表中数据按类别筛选数据到相应表中?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-27 17:59 | 显示全部楼层
Sub test0()
  
  Dim ar, dict As Object, wks As Worksheet, ran As Range
  Dim rowsHeight() As Double, strKey As String
  Dim i As Long, j As Long, titleRow As Long, splitCol As Long
  
  titleRow = 3   '标题所在 行
  splitCol = 8   '拆分依据 列
  
  DoApp False
  
  Set dict = CreateObject("Scripting.Dictionary")
  
  ar = Array("总表", "统计表", "封面")  '不必删除的 工作表  在这里列出来
  For j = 0 To UBound(ar)
    dict.Add ar(j), ""
  Next
  
  For Each wks In Worksheets
    If Not dict.Exists(wks.Name) Then wks.Delete
  Next
  
  dict.RemoveAll
  ReDim rowsHeight(1 To titleRow + 1)
  
  With Worksheets("总表")
    For j = 1 To UBound(rowsHeight)
      rowsHeight(j) = .Rows(j).RowHeight
    Next
    With .Range("A1").CurrentRegion
      ar = .Value
      Set ran = .Resize(titleRow)
    End With
    For i = titleRow + 1 To UBound(ar) '- 1
      strKey = Trim(ar(i, splitCol))
      If Len(strKey) Then
        If Not dict.Exists(strKey) Then Set dict(strKey) = ran
        Set dict(strKey) = Union(dict(strKey), .Range("A" & i).Resize(, UBound(ar, 2)))
      End If
    Next
  End With
  
  For j = 0 To dict.Count - 1
    With Worksheets.Add(After:=Worksheets(Worksheets.Count))
      ran.Copy
      .Range("A1").PasteSpecial xlPasteColumnWidths
      dict.Items()(j).Copy .Range("A1")
      For i = 1 To UBound(rowsHeight) - 1
        .Rows(i).RowHeight = rowsHeight(i)
      Next
      .Rows(i & ":" & .Cells.Find("*", , xlValues, , xlByRows, xlPrevious).Row).RowHeight = rowsHeight(i)
      .Name = dict.Keys()(j)
      .DrawingObjects.Delete
    End With
  Next
  
  Worksheets("总表").Activate
  
  Set ran = Nothing
  Set dict = Nothing
  DoApp
  Beep
End Sub

Function DoApp(Optional b As Boolean = True)
  With Application
    .ScreenUpdating = b
    .DisplayAlerts = b
    .Calculation = -b * 30 - 4135
  End With
End Function

TA的精华主题

TA的得分主题

发表于 2024-3-27 18:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-3-27 21:58 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-3-28 07:29 | 显示全部楼层
my3022 发表于 2024-3-27 17:38
点拆分和删除都会把增加进去的统计表和封面删除掉,怎么修改代码,删除的处理了,能保留下新增的统计表和 ...

要改好几个地方,还是把你的真实表格发上来吧,
这种方式新增内容时直接按钮点一下,就全部重新生成了,数据会更新的

TA的精华主题

TA的得分主题

发表于 2024-3-28 08:12 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-28 09:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 my3022 于 2024-3-28 09:34 编辑
ykcbf1100 发表于 2024-3-27 17:01
之所以没有保留你原来的表,我这里是因为有些表数据拆分不进去,不知道是不是你的表名和总表中的类型名不 ...

谢谢大佬细心解释,如果要我在这个表中新增固定的统计表和封面,如何在点拆分时不会删除新增固定的统计表和封面,现在一点拆分就会删除掉

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-28 09:38 | 显示全部楼层
沈默00 发表于 2024-3-27 16:40
把你的原表发上来,数据你截取一部分就行了,不然我也不知道要保留哪些表,,,,

也会修改按学校拆分了,用你后来发的代码也能解决拆分后不会删除需要保留的表了,只是拆分时感觉没有原来的代码流畅,有卡顿,也没有原来用时短

TA的精华主题

TA的得分主题

发表于 2024-3-28 09:45 | 显示全部楼层
my3022 发表于 2024-3-28 09:38
也会修改按学校拆分了,用你后来发的代码也能解决拆分后不会删除需要保留的表了,只是拆分时感觉没有原来 ...

自己会改可以试着摸索一下,只要数据量不是太大,不至于很卡的,

TA的精华主题

TA的得分主题

发表于 2024-3-28 09:48 | 显示全部楼层
my3022 发表于 2024-3-28 09:28
谢谢大佬细心解释,如果要我在这个表中新增固定的统计表和封面,如何在点拆分时不会删除新增固定的统计表 ...

上传附件。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-28 10:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
1、如何在拆分时保留“统计表、总封面和分封面”

2、如果要按年级和班级拆分,怎么修改代码(也就是拆分成班级名册,原来只是按一列类别进行拆分,现在变成要按两列的类别进行拆分)
谢谢各位大佬的指点,按1列类别进行拆分已勉强会根据需要修改了

按年级和班级拆分.rar

19.64 KB, 下载次数: 2

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

本版积分规则

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

GMT+8, 2024-4-28 07:48 , Processed in 0.043516 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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