VBA拆分表格
时间:2022-07-22
本文章向大家介绍VBA拆分表格,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、需求:
根据某一列内容,将1个Sheet表格拆分为多个分表。
2、举例:
还是接着上一次的例子,分年龄段统计人数工作完成后,你又接到任务需要将总表根据年龄段拆分为多个分表。
因为例子里只有5个年龄段,所以你完全可以筛选复制5次就搞定了,不过,如果后面又有变化,比如需要根据职务或者其他情况来拆分,那你又得手动去处理了,让我们看看用VBA代码如何来完成这个工作,一旦情况变化,你只要重新运行一次程序就可以。
3、代码实现
这个功能的实现原理其实和筛选也差不多,我们需要获取作为拆分表格列的不重复项目,然后得到每一个不重复项目的单元格,再复制单元格就可以了。
要获取不重复的项目,字典自然是最好的选择,我们使用字典对象来记录每一个关键字对应的所有单元格,最后将字典记录下来的单元格复制到新表即可:
Enum RetCode
ErrRT = -1
SuccRT = 1
End Enum
Enum Pos
RowStart = 2
年龄段 = 6
KeyCol = 年龄段
Cols = 年龄段
End Enum
Type DataStruct
Src() As Variant
Rows As Long
Cols As Long
Result() As Variant
End Type
Sub vba_main()
Dim d As DataStruct
If RetCode.ErrRT = ReadSrc(d) Then Exit Sub
If RetCode.ErrRT = GetResult(d) Then Exit Sub
End Sub
Private Function GetResult(d As DataStruct) As RetCode
Dim dic As Object
Set dic = VBA.CreateObject("Scripting.Dictionary")
Dim i As Long
Dim strkey As String
For i = Pos.RowStart To d.Rows
strkey = VBA.CStr(d.Src(i, Pos.KeyCol))
If dic.Exists(strkey) Then
'再次出现的关键字,合并
Set dic(strkey) = Excel.Union(Cells(i, 1).Resize(1, Pos.Cols), dic(strkey))
Else
'第一次出现的关键字,记录标题及当前行单元格
Set dic(strkey) = Excel.Union(Cells(1, 1).Resize(1, Pos.Cols), Cells(i, 1).Resize(1, Pos.Cols))
End If
Next
Dim keys As Variant
keys = dic.keys()
Dim items As Variant
items = dic.items()
'新建表并复制单元格
For i = 0 To UBound(keys)
strkey = VBA.CStr(keys(i))
'注:这里没有去考虑sheet的名称是否合规,sheet名称是不能包含" / 等字符的"
Worksheets.Add().Name = strkey
items(i).Copy Range("A1")
Next
End Function
Private Function ReadSrc(d As DataStruct) As RetCode
ReadSrc = ReadData(d.Src, d.Rows, Pos.Cols, Pos.KeyCol, Pos.RowStart)
End Function
Private Function ReadData(ByRef RetArr() As Variant, ByRef RetRow As Long, Cols As Long, KeyCol As Long, RowStart As Long) As RetCode
ActiveSheet.AutoFilterMode = False
RetRow = Cells(Cells.Rows.Count, KeyCol).End(xlUp).Row
If RetRow < RowStart Then
MsgBox "没有数据"
ReadData = RetCode.ErrRT
Exit Function
End If
RetArr = Cells(1, 1).Resize(RetRow, Cols).Value
ReadData = RetCode.SuccRT
End Function
如果后面需求有变化,需要按别的列进行拆分,只要修改Pos枚举里的KeyCol即可。
- Go语言学习(一):hello world
- JAVA基础知识点:内存、比较和Final
- python django 学习(一)数据库 目的根据已有BBS建立新的网站步骤
- SpringMVC中@RequestMapping的基本用法
- Java面试系列13
- 【Go 语言 时间相关操作 demo】
- redis AOF保存机制
- 用 TensorFlow 让你的机器人唱首原创给你听
- 不用synchronized块的话如何实现一个原子的i++?
- Oracle升级中的参数补充(r9笔记第2天)
- 【Go 语言,服务器模块】日志系统源码
- wait方法和sleep方法的区别
- Java面试系列10
- python django整理(三)页面基础(仿BBS)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 宇智波程序笔记8-【高并发】ThreadLocal学会了这些,你也能和面试官扯皮了!
- 情感分析数据预处理过程
- java的内部类和静态内部类(嵌套类)
- python爬取B站视频弹幕分析并制作词云
- mybatis扩展之自定义类型处理器处理枚举类型
- IMDB影评数据集预处理(使用word2vec)
- 【leetCode】使用两个栈搞一个队列day05
- bert训练代码
- mybatis文件映射之自定义返回结果集
- maven之第一个maven程序
- 【LeetCode】重建二叉树day04
- 【LeetCode】从尾到头反过来返回每个节点的值(用数组返回)day03
- mybatis文件映射之利用association进行关联查询(二)
- 【JUC】CountDownLatch你真的了解吗?
- mybatis动态sql之foreach补充(一)