excel VBA正则匹配单元格符号,并按符号把单元格拆分行(这里是按第一列分行,分行是从活动单元格的行开始,分行前需要选择所有需要填充内容的列,否则需要后期手动填充)
Sub W()
' MsgBox "行数:" & Selection.Rows.Count
Dim rows_count As Integer
Dim rows_id As Integer
Dim column_count As Integer
column_count = Selection.Columns.Count '获取选择区域的列数
'MsgBox column_count '打印列数
rows_id = ActiveCell.Row '获取活动单元格行id,获取列id的是ActiveCell.Count
rows_count = Selection.Rows.Count '获取选择区域的行数
Dim str As String
'str = InputBox("是否进行分列:")
'MsgBox rows_count
'MsgBox "行号:" & ActiveCell.Row
Dim h
Dim j As Integer
j = 0 '参数用于填充空格参数作用为使每次拆分都能指向原来需要拆分的行id,因为每次拆分都会影响下一个需要拆分行的行id,所以需要设置拆分后下一个需要拆分的行id应为上一个行id+拆分时候插入的行数
Dim n1 As Integer '分行单元格在第几列
Dim m1 As Integer '填充到的列
Dim p As Integer '所有内容的列数,这里设置所有列数等于单元格选中的列数,下面填充的列数等于这个列数
Dim p2 As Integer
n1 = 1 'InputBox("需要根据第几列分行:"),如果需要按其它列分行,可修改参数
m1 = 1 'InputBox("需要填充到第几列:"),需要填充到分行的列,所有次参数需要与n1相等
p = column_count 'InputBox("所有内容的列数:")
p2 = rows_id 'InputBox("从第几行开始分:")
'p3 = InputBox("按什么分行:")
'For i = p2 To Range("a65536").End(xlUp).Row '如果不能完全填充,加大这里的行数
For i = p2 To 10000 'p2 + p
i = i '+ j 不需要加j,否则后面需要置0,加j和不加
'MsgBox i
Dim zhengze, Rng
Rng = Cells(i, n1) '把需要拆分的行赋值给Rng,用于正则检索是否存在需要分行的符号
Set regx = CreateObject("vbscript.regexp") 'VBA正则模块
With regx
.Global = True '匹配所有结果集
.Pattern = "[,,\\/、 ;:+-]+" '写正则表达式
Set mat = .Execute(Rng)
If .test(Rng) Then '匹配到结果则执行拆分,否则不拆分
For Each mg In mat '把匹配到的符号,通过循环按每个符号依次拆分,直到把匹配到的值都拆分完
zhengze = mg
p3 = mg
h = Split(Cells(i, n1), p3)
If UBound(h) > 0 Then
Rows(i + 1).Resize(UBound(h)).Insert '在i+1行插入UBound(h)个空白行
Cells(i, m1).Resize(UBound(h) + 1, 1) = Application.Transpose(h) '在i行m1列以列形式填充拆分后的值
j = UBound(h)
For num = 1 To j '因为i的值依次加1循环,需要在第一次循环拆分时就填充新加的空行,例:第一行拆分成3行,需要通过两次循环填充新加的空行,当检测第二行时,由于不需要拆分,就不会进入到这里,不会执行填充操作,假如不需要这层循环,空行就不会被填充。
For column = 1 To p '此循环为了控制粘贴值的列数,有多少列值需要复制就to 多少,哪里是填充拆分值的列,就在内层if处理,不进行向下填充
If column = m1 Then
Cells(i, column) = Cells(i, column) '拆分列等于原单元格的值
Else
Cells(i + num, column) = Cells(i, column) '其它列即插入的空单元格等于上一个单元格的值
End If
Next
Next
Else
Cells(i, m1) = Application.Transpose(h)
'j = 0 '按第一个值如逗号分完后,需要重置为0,因为需要重新从第一个单元格拆出来的第一个值检测是否还有其它拆分的符号
End If
Next
Else
Cells(i, m1) = Cells(i, m1)
'j = 0 '当一开始就检测不到需要拆分行的符号,需要重设参数,否则受上一个拆分值的影响,会跳过一些行不进行拆分,比如第一行拆了3行,第二行不需要拆,这时候原来的第三行的行id为5,如果此时不重置参数j,就会跳到行id为7的行进行拆分,因为参数j会变成1,导致6+1变为7
End If
End With
Next
End Sub
excel VBA正则匹配单元格符号,并按符号把单元格拆分行(这里是按第一列分行,分行是从活动单元格的行开始,分行前需要选择所有需要填充内容的列,否则需要后期手动填充)的更多相关文章
- excel vba 数据分析
(Visual Basic Application) VBA(Visual Basic for Application)是Microsoft Office系列软件的内置编程语言,其语法结构与Visua ...
- Excel VBA语句集
Excel VBA语句集 引子 最近批阅学生成绩,用Excel 处理学生成绩,用到VBA 提高办公效率.需要经常查阅VBA的一些用法 正文 定制模块行为 (1) Option Explicit '强制 ...
- Js使用word书签填充内容
Js使用word书签填充内容 1.在模板文件中需要填充的地方插入书签 填充内容为:(|光标所在处) 填写书签名,点击添加完成: 2.使用js打开模板,获取书签位置,填充数据: function pri ...
- excel VBA把一个单元格内容按逗号拆分并依次替换到另一个单元格的括号里面(本题例子,把文本中的括号换成{答案}的格式,并按顺序填空)
方法1:运用excel单元格拆分合并实现 思路:用VBA正则查询左侧括号个数,对右侧单元格逐一按逗号.顿号等符号分列,同时左侧按括号分列(分列只能按括号单边分列),分列完成后按要求合并,本题事例把括号 ...
- excel VBA返回选中单元格区域的行数、列数,以及活动单元格的行号和列号
Private Sub Worksheet_SelectionChange(ByVal Target As Range) '可以直接sub(),不然选择就会触发vba Dim rows_coun ...
- 个人永久性免费-Excel催化剂功能第52波-相同内容批量合并单元格,取消合并单元格并填充内容
在高级Excel用户群体中无比痛恨的合并单元格,在现实的表格中却阴魂不散的纠缠不断.今天Excel催化剂也来成为“帮凶”,制造更多的合并单元格.虽然开发出此功能,请使用过程中务必要保持节制,在可以称为 ...
- Excel VBA入门(八)单元格边框
本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...
- excel 根据单元格内容自动调整列宽
excel 根据单元格内容自动调整列宽 CreateTime--2018年5月28日08:49:40 Author:Marydon 1.情景展示 单元格宽度超过了列宽 2.解决方案 第一步:同时选 ...
- Excel表格中无法中间插入新行列! 提示:在当前工作表的最后一行或列中,存在非空单元格,解决方案
excel中新增行列时报错: 提示:在当前工作表的最后一行或列中,存在非空单元格,所以无法插入新行或新列.
随机推荐
- mac SSH私钥取消密码(passphrase)
取消私钥中的密码: 1.使用openssl命令去掉私钥的密码openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa_new 2.备份旧私钥mv ~/.ssh/ ...
- fail to start File System Check
fail to start File System Check 方法A: 输入root的密码 cd /etc 1 vim /etc/fstab 将所有分区最后的数字 1和2 全都改为0 reboot ...
- Linux——定时清空日志内容和删除日志文件
前言 最近在做性能压测试,会生成大量的日志,导致后续越压越慢,最终磁盘空间占满之类的问题.老是要手动删除日志文件,为避免此类问题发生,编写一个Linux日志定时清理的脚本,一劳永逸. 1.shell脚 ...
- VMware安装RedHat7、CentOS7后无网卡解决办法
由于Vmware虚拟网卡和linux兼容问题导致驱动无法正常安装,默认的网卡类型不兼容找到我们的Vmware虚拟机文件夹,将VMware 虚拟机配置 (.vmx),追加一条设置,网卡类型etherne ...
- [转发]PotPlayer 无损截取视频片段
PotPlayer 无损截取视频片段 2019-03-29 21:04:21 ForeverStrong 阅读数 2928 收藏 更多 分类专栏: 视频图像编辑 PotPlayer 无损截取视频 ...
- linux进阶之子网划分
一.定义 当我们对一个网络进行子网划分时,基本上就是将它分成小的网络.比如,当一组IP地址指定给一个公司时,公司可能将该网络"分割成"小的网络,每个部门一个.这样,技术部门和管理部 ...
- 物联网技术nbiot与LoRa的区别有哪些
http://zixun.258.com/1870021.html 物联网技术nbiot与LoRa的区别有哪些 万物物联是大趋势,在中国nbiot与LoRa是热门的低功耗广域网技术,这两者作为最典型的 ...
- C#中的数据结构
Array 连续性的内存空间 快速定位查找元素,随机访问性强,查找效率高 已知的统一的元素类型,减小运行时开销 固定长度,不能再新增元素 ArrayList 连续性的内存空间 快速定位查找元素,随机访 ...
- 在 Android 使用 QuickJS JavaScript 引擎教程
quickjs-android 是 QuickJS JavaScript 引擎的 Android 接口框架,整体基于面向对象设计,提供了自动GC功能,使用简单.armeabi-v7a 的大小仅 350 ...
- 通过CSS设计模式搭建自己系统的CSS架构
theme: qklhk-chocolate 传统的CSS书写风格是随意命名,堆叠样式,造成了混乱不堪的结果,复杂页面的样式书写通常会出现几百行甚至上千行的代码,CSS设计模式在实际应用中的横空出世拯 ...