方法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把一个单元格内容按逗号拆分并依次替换到另一个单元格的括号里面(本题例子,把文本中的括号换成{答案}的格式,并按顺序填空)的更多相关文章

  1. 用jquery把一个List里面的对象的属性,依次填入到一个table里面啊

    假设list格式如下list = [{"id":"1","name":"A","age":20}, ...

  2. 如何将excel中纵向的转换成横向保证格式不变,

    先选定,复制,然后用--编辑---选择性粘贴--转置--确定.试试能不能实现 ,能把文件发过来看一下​

  3. excel VBA根据单元格内的逗号把内容拆分行

    Sub test1()    Dim h    Dim j As Integer    j = 0  '用于辅助循环的进行,可以在拆分行获取下一个需要拆分单元格的行号    'Application. ...

  4. 如何调试Excel VBA代码

    Excel VBA出错时给出的错误信息极少,需要充分利用各种工具来进行调试. 1.编译错误 常见的编译错误有: 错误的源代码格式,比如if后面缺少then:在编辑器中该行会变成红色. 错误的语法结构, ...

  5. 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. ...

  6. Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

    项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...

  7. POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取

    第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个 ...

  8. EXCEL中,如何引用一个单元格中的数据,作为另一个单元格内容中的一部分?

    https://zhidao.baidu.com/question/230715654.html 假设单元格A1值是8(该值由函数计算得出),我要在单元格B1中引用A1的值,但只是作为B1单元格内容中 ...

  9. Excel VBA 从一个工作簿查找另一个一个工作簿中的一些内容复制到另外一个工作簿

    帮朋友来写个Excel VBA 以前写过ASP,所以对vb略微熟悉,但VBA 没有仔细研究过. 以前只研究过 vba 写一个 计算个人所得税的程序. 这次写的功能也算是简单,但也耗费了两天的功夫. 需 ...

随机推荐

  1. 在微信框架模块中,基于Vue&Element前端的后台管理功能介绍

    微信开发包括公众号.企业微信.微信小程序等方面的开发内容,需要对腾信的微信API接口进行封装:包括事件.菜单.订阅用户.多媒体文件.图文消息.消息群发.微信支付和企业红包.摇一摇设备.语义理解.微信小 ...

  2. 【vue2】(一)基础使用

    [vue2](一)基础使用 MVVM MVVM: View - Model - ViewModel View: Dom层,视图层 Model: Plain JavaScript Objects,数据层 ...

  3. spring总结归纳

    愿历尽千帆,归来仍是少年 简介 spring: 1.是分层的full-stack(全栈)轻量级开源框架.2. 内核:IOC和AOP.3.提供web层springMvc和业务层事务管理,整合众多的开源框 ...

  4. NPM包管理器入门(附加cnpm : 无法加载文件错误解决方案)

    NPM 包管理器 1.作用: 快速构建nodejs工程 快速安装和依赖第三个模块 2.使用方法 快速构建 npm init 会得到一package.json文件 { "name": ...

  5. [bug] org.apache.spark.sql.AnalysisException: Table or view not found spark

    参考 https://blog.csdn.net/weixin_44634893/article/details/89629399

  6. [刷题] 237 Delete Nodes in a Linked List

    要求 给定链表中的一个节点,删除该节点 思路 通过改变节点的值实现  实现 1 struct ListNode { 2 int val; 3 ListNode *next; 4 ListNode(in ...

  7. make clean 和 make distclean区别-(转自秋水Leo)

    make clean仅仅是清除之前编译的可执行文件及配置文件. 而make distclean要清除所有生成的文件. Makefile 在符合GNU Makefiel惯例的Makefile中,包含了一 ...

  8. python 中 list 的append与extend区别

    append 添加的是一个对象 extend 添加的是序列与原序列合并

  9. 使用Mybatis插件 PageHelper 模拟百度分页(Day_20)

    生活中,要学会沉淀生命,沉淀心情,沉淀自己 模拟百度分页最终实现效果如图: 本篇博客运行环境 JDK8 + IntelliJ IDEA 2018.3 + Tomcat 8.5.31 准备好了我们就开始 ...

  10. rocketmq常见问题及使用 新手篇

    一 部署阶段 1.启动命令 nameServer启动:nohup sh bin/mqnamesrv  -n ip地址:9876 & broker启动:nohup sh bin/mqbroker ...