社群答疑精选03:拆分数据到新工作表
时间:2022-07-23
本文章向大家介绍社群答疑精选03:拆分数据到新工作表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
下面是完美Excel社群中佳佳朋友的提问(我稍作整理):
如下图1所示,根据是否是户主创建新工作表并将户主及对应的家庭成员复制到该工作表中,并以户主姓名命名该工作表。
图1
这种问题最适合使用VBA来解决。仔细观察后发现,户主对应的人数就是该户家庭在工作表中所占的行数,这样只要定位到户主,就知道了该户所有成员的范围,这就方便提取相应的数据了。VBA代码如下:
Sub test1()
Dim lngLast As Long
Dim str As String
Dim rng As Range
Dim rngData As Range
Dim firstRng As String
Dim wks As Worksheet
'要查找的内容
str = "户主"
'工作表中最后一个数据所在行行号
lngLast =Worksheets("Sheet1").Range("D" &Rows.Count).End(xlUp).Row
'被查找的数据区域
Set rngData =Worksheets("Sheet1").Range("D2:D" & lngLast)
'查找第1个数据
Set rng = rngData.Find(What:=str,LookIn:=xlValues)
'如果找到
If Not rng Is Nothing Then
'获取第1个找到的数据的单元格地址
firstRng = rng.Address
'继续查找
Do
'如果工作表已存在
If SheetExists(rng.Offset(0, -3))Then
'屏蔽警告信息
Application.DisplayAlerts =False
'删除该工作表
Worksheets(rng.Offset(0,-3).Value).Delete
'新建工作表并以户主姓名命名
Set wks =Worksheets.Add(After:=Sheets(Sheets.Count))
wks.Name = rng.Offset(0, -3)
Else
'新建工作表并以户主姓名命名
Set wks =Worksheets.Add(After:=Sheets(Sheets.Count))
wks.Name = rng.Offset(0, -3)
End If
'复制相对应的数据到新工作表中
Worksheets("Sheet1").Range("A" & rng.Row &":D" & rng.Row + rng.Offset(0, -1).Value - 1).Copy
wks.Range("A1").PasteSpecial xlPasteAll
'查找下一个数据
Set rng =rngData.FindNext(After:=rng)
Loop While Not rng Is Nothing Andrng.Address <> firstRng
End If
'恢复警告信息
Application.DisplayAlerts = True
End Sub
'判断工作表是否存在
FunctionSheetExists(strName As String)
On Error Resume Next
SheetExists = CBool(Not Worksheets(strName)Is Nothing)
On Error GoTo 0
End Function
又问:
如果没有人口数的话,如何实现?
很简单,只要有“户主”这个标志就行。下面的代码使用数组来存储户主所在行的行号以及该户所占的行数(也就是每户的人口数),其他的与上面的代码相同。
Sub test2()
Dim lngLast As Long
Dim str As String
Dim rng As Range
Dim rngData As Range
Dim firstRng As String
Dim wks As Worksheet
Dim wksData As Worksheet
Dim strName As String
Dim arr1() As Long
Dim arr2() As Long
Dim i As Long
Dim j As Long
Dim k As Long
i = 0
'查找的内容
str = "户主"
'查找的数据所在的工作表
Set wksData =Worksheets("Sheet1")
'数据所在工作表的最后一行行号
lngLast = wksData.Range("D" &Rows.Count).End(xlUp).Row
'被查找的数据区域
Set rngData =wksData.Range("D2:D" & lngLast)
'重定义数组
ReDim Preserve arr1(i)
'查找数据,确保从开头查找
Set rng = rngData.Find(What:=str,After:=wksData.Range("D" & lngLast), LookIn:=xlValues)
'如果找到
If Not rng Is Nothing Then
'找到的第1个数据所在的单元格地址
firstRng = rng.Address
'继续查找
Do
'保存找到的数据所在的行号
arr1(i) = rng.Row
i = i + 1
ReDim Preserve arr1(i)
'查找下一个
Set rng =rngData.FindNext(After:=rng)
Loop While Not rng Is Nothing Andrng.Address <> firstRng
End If
'每户所占的行数
For j = 0 To UBound(arr1) - 2
ReDim Preserve arr2(j)
arr2(j) = arr1(j + 1) - arr1(j)
Next j
'最后一户所占的行数
ReDim Preserve arr2(j)
arr2(j) = lngLast - arr1(j) + 1
'新建工作表并复制户主数据到该工作表
For k = 0 To UBound(arr2)
strName = wksData.Range("A"& arr1(k))
If SheetExists(strName) Then
Application.DisplayAlerts = False
Worksheets(strName).Delete
Set wks =Worksheets.Add(After:=Sheets(Sheets.Count))
wks.Name = strName
Else
wks.Name = strName
End If
wksData.Range("A" &arr1(k) & ":D" & arr1(k) + arr2(k) - 1).Copywks.Range("A1")
Next k
Application.DisplayAlerts = True
'释放对象
Set rng = Nothing
Set rngData = Nothing
Setwks = Nothing
End Sub
'判断工作表是否存在
FunctionSheetExists(strName As String)
On Error Resume Next
SheetExists = CBool(Not Worksheets(strName)Is Nothing)
On Error GoTo 0
End Function
示例结果如下图2所示。
图2
- 你不知道的javaScript笔记(7)
- Contact Manager Web API 示例[4] 异常处理(Exception Handling)
- 你不知道的javaScript笔记(6)
- 创建支持多种屏幕尺寸的Android应用
- 封装多线程处理大量数据操作
- 你不知道的javaScript笔记(5)
- 无特性的 MEF 配置方法
- HTTP协议状态码详解(HTTP Status Code)
- android 中resources管理
- 你不知道的javaScript笔记(4)
- Android网格视图(GridView)
- http响应Last-Modified和ETag以及asp.net web api实现
- 列表视图(ListView和ListActivity)
- 你不知道的javaScript笔记(3)
- 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 数组属性和方法
- Linux文件 目录与权限
- 简易数据分析(三):Web Scraper 批量抓取豆瓣数据与导入已有爬虫
- 嵌入式Linux开发环境搭建 配置Ubuntu
- 简易数据分析(五):Web Scraper 翻页、自动控制抓取数量 & 父子选择器
- 【深度】韦东山:一文看看尽linux对中断处理的前世今生
- 嵌入式开发之交叉编译程序万能命令_以freetype为例
- Python-EEG处理和事件相关电位(ERP)
- 嵌入式Linux开发 配置网络
- 问号脸:为什么 Java 中 “1000==1000” 为 false,而 ”100==100“ 为 true?
- 【硬核】韦东山:使用freetype显示一行文字
- 动画函数封装
- 事件基础及操作元素
- JQuery生成图片列表
- Linux系统编程-几个多线程DEMO
- 自定义属性操作