VBA将一行数据分为多行
时间:2022-07-22
本文章向大家介绍VBA将一行数据分为多行,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、需求:
有个表格,有许多单元格的数据,制作者为了方便,很多数据是写在一行的,类似下面这种:
做这个工作的人,一看就能知道,其实第1、2行数据都是包含了4条数据,第3、4行包含了2条数据,制作者为了方便把他们放在了一起。
这样做表格,虽然能够看懂,可是一旦我们需要使用VLookup等函数查找某一个数据的时候,就非常的不方便了,我们需要转换为下面这种:
2、举例:
本人工作中经常收到这种表格,不处理好的话,就需要手动去查找,而且是重复的工作,非常的麻烦!
3、代码实现
这个要用代码实现的话,逻辑上还是比较简单的,就是按照特定的字符把字符串拆开,然后插入行,复制数据。
本人使用一般是先手动选择一些需要处理的单元格,再运行程序。因为一般收到的表格数据是比较乱的,不敢完全按照是否包含某个字符来进行拆分!
Private Type SplitDataStruct
rng As Range '要处理的单元格
StrSplit As String '要根据什么字符来拆分
FlagPre As Boolean '是否保持前缀
End Type
Sub SplitRows()
Dim d As SplitDataStruct
Dim rngSelect As Range
If VBA.TypeName(Selection) <> "Range" Then
MsgBox "请选择单元格。"
Exit Sub
End If
Set rngSelect = Selection
If rngSelect.Columns.Count > 1 Then
MsgBox "请选择单列。"
Exit Sub
End If
Dim kCells As Long, i As Long
kCells = rngSelect.Cells.Count
'这里主要是为了方便自动输入一些经常碰到的要拆分的字符
Dim strDefault As String
strDefault = "/"
Dim strRng As String
strRng = rngSelect.Cells(1).Value
If VBA.InStr(strRng, " ") Then
strDefault = " "
ElseIf VBA.InStr(strRng, "、") Then
strDefault = "、"
End If
d.StrSplit = Application.InputBox("请输入拆分字符。", "输入", strDefault, Type:=2)
If VBA.Len(d.StrSplit) Then
If d.StrSplit <> "False" Then
If VBA.MsgBox("插入时是否保持前缀?" & vbNewLine & vbNewLine & "如ABCDEFG1/2,拆分后是ABCDEFG1和ABCDEFG2,ABCDEFG为前缀", vbYesNo) = vbYes Then
d.FlagPre = True
Else
d.FlagPre = False
End If
'因为要插入行,所以从最底下的单元格往上处理
For i = kCells To 1 Step -1
Set d.rng = rngSelect.Cells(i)
SplitRngToRows d
Next
End If
End If
End Sub
Function SplitRngToRows(d As SplitDataStruct) As Long
Dim strValue As String, strPre As String
Dim tmp, k As Long, i As Long, flag As Boolean
strValue = VBA.CStr(d.rng.Value)
If VBA.InStr(strValue, d.StrSplit) Then
tmp = VBA.Split(strValue, d.StrSplit)
k = UBound(tmp) '需要插入的行,本身有一行,tmp下标是0,所以要插入的是k行
d.rng.Offset(1, 0).Resize(k, 1).EntireRow.Insert xlShiftDown
'其他列的数据都复制保持一致
d.rng.EntireRow.Copy d.rng.Offset(1, 0).Resize(k, 1).EntireRow
d.rng.Value = tmp(0)
If d.FlagPre Then
strPre = VBA.Left$(tmp(0), VBA.Len(tmp(0)) - VBA.Len(tmp(1)))
End If
For i = 1 To k
If d.FlagPre Then
d.rng.Offset(i, 0).Value = strPre & VBA.CStr(tmp(i))
Else
d.rng.Offset(i, 0).Value = tmp(i)
End If
Next
End If
End Function
- linux开机流程
- 大整数乘法
- ntp服务配置
- Linux系统下如何查看及修改文件读写权限
- Apache Commons CLI命令行启动
- rsync+inotify实时同步
- 18本纸质书:OpenCV、Python和机器学习,总有一本适合你
- 三种Linux服务器监控技术的对比
- http和www服务基础知识
- 手把手教你在VirtualBox中与主机共享文件夹
- Kafka与Logstash的数据采集对接 —— 看图说话,从运行机制到部署
- Kafka入门初探+伪集群部署
- Beats数据采集---PacketbeatFilebeatTopbeatWinlogBeat使用指南
- linux NFS网络文件系统
- 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 数组属性和方法
- 如何分析交易记录?
- [技术创作101训练营]小程序云开发实战:从零搭建科技爱好者周刊小程序
- 【技术创作101训练营】innerHTML插入运行js字符串问题探究
- 组合体惯量法A: matlab程序—机械臂动力学建模
- vue+echarts 实现两个小例子
- 2020CV秋招求职的若干思考
- 快速学习-ElasticJob高可用
- 快速学习-Elastic调度部署
- 快速学习-ElasticJob应用API
- 快速学习-ElasticJob-Lite Quick Start
- 快速学习-ElasticJob-Cloud Quick Start
- @JacksonInject与@JsonAlias注解-JSON框架Jackson精解第4篇
- 医疗NLP相关数据集整理
- 我们如何用 K8S 搞定 1000 个应用的测试环境
- 如何实现rsync多并发同步?