方法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. 如何更好理解Peterson算法?

    如何更好理解Peterson算法? 1 Peterson算法提出的背景 在我们讲述Peterson算法之间,我们先了解一下Peterson算法提出前的背景(即:在这个算法提出之前,前人们都做了哪些工作 ...

  2. DataGear 变更部署数据库为SQL Server填坑指南(含转写后的SQL server代码及SQL server配置文件)

    1. 引言 2. 配置数据库链接 3. 引入数据库驱动 4. 手动初始化数据库 5. 改写SQL 6. 其他 7. 参考 1. 引言 DataGear默认使用Derby数据库作为系统的元数据库,至于待 ...

  3. [刷题] PTA 02-线性结构4 Pop Sequence

    模拟栈进出 方法一: 1 #include<stdio.h> 2 #define MAXSIZE 1000 3 4 typedef struct{ 5 int data[MAXSIZE]; ...

  4. MySQL配置HeartBeat实现心跳监控和浮动IP

    1. 初始化环境配置 /sbin/chkconfig --add mysqld /sbin/chkconfig mysqld on ln -s /usr/local/mysql/bin/mysql / ...

  5. coverage report

    转载:http://blog.sina.cn/dpool/blog/s/blog_7853c3910102yn77.html VCS仿真可以分成两步法或三步法, 对Mix language, 必须用三 ...

  6. zabbix screen 图片以邮件形式发送

    zabbix screen 图片以邮件形式发送 #! /usr/bin/env python #coding=utf-8 # Andy_f import time,os import urllib i ...

  7. 基于 BDD 理论的 Nebula 集成测试框架重构(上篇)

    本文首发于 Nebula Graph 公众号 NebulaGraphCommunity,Follow 看大厂图数据库技术实践. 测试框架的演进 截止目前为止,在 Nebula Graph 的开发过程中 ...

  8. 听说 JVM 性能优化很难?今天我小试了一把!

    文章首发于公众号「陈树义」及个人博客 shuyi.tech,欢迎关注访问. 对于 Java 开发的同学来说,JVM 性能优化可以说是比较难掌握的知识点.这不仅因为 JVM 性能优化需要掌握晦涩难懂的 ...

  9. pika详解(四) channel 通道

    pika详解(四) channel 通道   本文链接:https://blog.csdn.net/comprel/article/details/94662394 版权 ​ channel通道 通道 ...

  10. 08.ElementUI 2.X 源码学习:源码剖析之工程化(三)

    0x.00 前言 项目工程化系列文章链接如下,推荐按照顺序阅读文章 . 1️⃣ 源码剖析之工程化(一):项目概览.package.json.npm script 2️⃣ 源码剖析之工程化(二):项目构 ...