excel VBA把一个单元格内容按逗号拆分并依次替换到另一个单元格的括号里面(本题例子,把文本中的括号换成{答案}的格式,并按顺序填空)
方法1:运用excel单元格拆分合并实现

思路:用VBA正则查询左侧括号个数,对右侧单元格逐一按逗号、顿号等符号分列,同时左侧按括号分列(分列只能按括号单边分列),分列完成后按要求合并,本题事例把括号换成{}+把对应答案的空填入,本题先按逗号分列,再按顿号。分列后按左侧分出来的第一列和右侧分出来第一列先合并,第二第三.....依次类推,合并再次用正则匹配,此时匹配{}的个数,如果同行{}个数和替换之前()的一致,说明是拆分正确的。然后筛选不一致的,重新按新的符号拆分,拆分后操作和第一次的一致,依次类推,直到都处理完为止。
结果展示:

技巧:1.分列前可用通过vba匹配括号数最多的行来决定最大的分列数量,防止分列覆盖其它值。
2.合同按左1和右1,左2和右,左3和右3此方式,同时合并的时候要增加文本{}的合并。例子=F3&"{"&N3&"}"&G3&"{"&O3&"}"&H3&"{"&P3&"}"&I3
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
方法2:VBA代码实现方法1
Function zhengze(ze As String, Rng As Range, Rng1 As Range)
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True
.Pattern = ze '写正则表达式
Set mat = .Execute(Rng)
result = Split(Rng1, ",") '知识点:Split函数将一个字符串,以特定符号为分隔符,分列成一个下标为0的数组
result1 = Split(Rng, "()")
l = UBound(result) + 1 'UBound返回数组上限,加1为数组长度
l1 = UBound(result1) + 1
If .test(Rng) Then '无匹配值则为空|匹配成功执行循环
Dim m As String
If mat.Count > 1 Then '为多个匹配结果则合并显示,否则显示当前值
For i = 1 To l 'vba中数值循环需要用for i=value to var/其它用for each i in var
m = m & result1(i - 1) & "{" & result(i - 1) & "}" '循环并合并匹配结果
Next
If l1 - 1 = l Then '此层IF用于判断需要填充的个数和单元格按符号拆除的是否一致,不一致说明拆分有误,返回原单元格文本
If l1 = l Then '此层IF用于判断,当填充符号不处于末端且原文本按填充符号拆分后列表个数比需要填充值的个数多时分情形合并
zhengze = m
ElseIf l1 > l Then
zhengze = m & result1(l)
Else
zhengze = Rng
End If
Else
zhengze = Rng
End If
Else
zhengze = mat(0).value '参数存储是一个列表形式,不能直接=号取值,必须用列表固有取值方式
End If
Else
zhengze = Rng
End If
End With
End Function
效果展示

注释:参数1为正则表达式/需匹配的文本,事例为中文状态下的括号;参数2为需要操作的文本;参数3为需要按特定符号拆分的文本。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
方法3:VBA代码实现方法2
Function zhengze2(ze As String, Rng As Range, Rng1 As Range, Split_symbol)
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = False
.Pattern = ze '写正则表达式
Set m = Rng '把要执行替换的单元格赋值给参数m,在后续步骤通过循环把每一次执行首次匹配的符号换掉并生成新的文本,依次执行,直到完全替换为止
n = Split(Rng, ze)
n1 = Split(Rng1, Split_symbol)
n_length = UBound(n)
n1_length = UBound(n1) + 1 '此处多加1是因为一般拆分的符合一般位于文本中间,而被替换的符号可能位于头和尾,拆分后会比符号数量多1,所以不需要加1
If n_length = n1_length Then
For i = 1 To n_length
m = .Replace(m, "{" & n1(i - 1) & "}") '此处运用可能会出现的问题:当n_length大于n1_length,会导致n1(n-1)不存在而返回错误值,所以外层增加if循环既可以避免返回错误值,也可以达到提示拆分错误的效果
Next
zhengze2 = m
Else
zhengze2 = "拆分错误,不能按此符号拆分"
End If
End With
End Function
效果展示

本例子实现思路:运用正则表达式,通过设置.Global = False,只匹配B7第一次出现括号的地方,把C7按逗号拆分并存储为一个数组n1,同时把B7按括号拆分并存储为一个数组n,通过循环,逐一替换B7每一次第一次出现括号的地方,并以n的长度即括号个数决定循环次数来实现把B7单元格的括号全部替换完成。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
扩展:替换结果如果要恢复原来的格式,可以插入辅助符号如“|”改变格式“|{月结}|”,然后按“|”拆分,再把答案位于的列合并后再用替换函数对每个答案逐一替换即可
VBA代码实现:

Function zhengze1(ze As String, Rng As Range)
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True
.Pattern = ze '写正则表达式
Set mat = .Execute(Rng)
'MsgBox mat.Count
If .test(Rng) Then '无匹配值则为空|匹配成功执行循环
Dim m As String
If mat.Count > 1 Then '为多个匹配结果则合并显示,否则显示当前值
For Each mg In mat
m = m & mg & "|" '循环并合并匹配结果
Next
zhengze1 = m
Else
zhengze1 = mat(0).value '参数存储是一个列表形式,不能直接=号取值,必须用列表固有取值方式
End If
Else
zhengze1 = " "
End If
End With
End Function
备注,如果要提取的内容中还存在句号等其他符号时,可以在正则表达式内加上即可,如{[\w\u4e00-\u9fa5%、,。]+}

excel VBA把一个单元格内容按逗号拆分并依次替换到另一个单元格的括号里面(本题例子,把文本中的括号换成{答案}的格式,并按顺序填空)的更多相关文章
- 用jquery把一个List里面的对象的属性,依次填入到一个table里面啊
假设list格式如下list = [{"id":"1","name":"A","age":20}, ...
- 如何将excel中纵向的转换成横向保证格式不变,
先选定,复制,然后用--编辑---选择性粘贴--转置--确定.试试能不能实现 ,能把文件发过来看一下
- excel VBA根据单元格内的逗号把内容拆分行
Sub test1() Dim h Dim j As Integer j = 0 '用于辅助循环的进行,可以在拆分行获取下一个需要拆分单元格的行号 'Application. ...
- 如何调试Excel VBA代码
Excel VBA出错时给出的错误信息极少,需要充分利用各种工具来进行调试. 1.编译错误 常见的编译错误有: 错误的源代码格式,比如if后面缺少then:在编辑器中该行会变成红色. 错误的语法结构, ...
- CMD批处理把txt文本中的每行写入一个新文件,第一列作文件名
需求 现在有一个文件格式如图 ID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17001 89.84 8.87 1.29 -0.0 0.0 68.99 0.0 0. ...
- Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件
项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...
- POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取
第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个 ...
- EXCEL中,如何引用一个单元格中的数据,作为另一个单元格内容中的一部分?
https://zhidao.baidu.com/question/230715654.html 假设单元格A1值是8(该值由函数计算得出),我要在单元格B1中引用A1的值,但只是作为B1单元格内容中 ...
- Excel VBA 从一个工作簿查找另一个一个工作簿中的一些内容复制到另外一个工作簿
帮朋友来写个Excel VBA 以前写过ASP,所以对vb略微熟悉,但VBA 没有仔细研究过. 以前只研究过 vba 写一个 计算个人所得税的程序. 这次写的功能也算是简单,但也耗费了两天的功夫. 需 ...
随机推荐
- KMP(The Knuth-Morris-Pratt Algorithm)
本文代码来自于中国大学MOOC KMP课件下载 注释内容为自己理解,如有错误请评论,或者私信给我,谢谢 #include <stdio.h> #include "stdlib.h ...
- Jsp授课
2.1 JSP基础 2.1.1 JSP简介 JSP全称是Java Server Page,是一种动态网页技术标准.它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/ ...
- Envoy:开启访问日志,access_log
access_log: - name: envoy.listener.accesslog typed_config: "@type": type.googleapis.com/en ...
- [java] Maven安装本地jar包
命令 mvn install:install-file -Dfile="E:\software\Apache\repository\org\apache\flink\flink-connec ...
- Docker —— 使用 Dockerfile 制作 Jdk + Tomcat 镜像
一.准备好Jdk和Tomcat apache-tomcat-8.5.50.tar.gz jdk-8u212-linux-x64.tar.gz 注意: Jdk 和 Tomcat 记得从官网下载,否则制作 ...
- 055.Python前端Django模型ORM
由于前面在centos实验的过程中,pymql一直有属性错误,很难排查出问题,重新做了一个ubuntu的桌面系统同时使用pycharm开发工具作为学习开发工具,具体原因是因为在项目命名出现问题,和自己 ...
- 2020-1-19 2.港股打新、REITs和分拆
1.港股打新介绍 港股打新升级版 财属目由尽握手中 港股中签率较高 A股提高中签率 港股提高中签之后的收益率 有可能破发 2.第一版港股打新 港股打新第一版 ■第一种策略:只选择低于1.5港币的 配售 ...
- tkinter是内置的模块,不同的版本的导入形式不同,现总结如下
#coding=utf-8 import os, sys try: from tkinter import * except ImportError: #Python 2.x PythonVersio ...
- 使用Typora编写Markdown你真的会了吗
目录 Typora 介绍 使用 常用快捷键 概述 标题 一级标题 二级标题 方式(推荐) 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 段落 粗体斜体删除线 下划线 注释 分割线 脚注 ...
- NBU Rman异机恢复Oracle
前段时间一个亿级分区表,被分割成历史表和业务表,历史表中保留15天以外的数据,每天都会从业务表中的15天外的数据copy到历史表,并删除业务表15天外的数据,逻辑也很简单,但插入历史表的where 条 ...