方法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. Docker部署微服务项目

    测试包准备工作 1.spring.io或者ide创建demo工程 spring官网 2.本地demo代码,打包成jar包 使用Dockerfile构建微服务镜像 3.将jar包上传到你的vps lin ...

  2. Swift系列七 - 汇编分析值类型

    通过汇编分下值类型的本质. 一.值类型 值类型赋值给var,let或者给参数传参,是直接将所有内容拷贝一份.类似于对文件进行复制粘贴操作,产生了全新的文件副本,属于深拷贝(deep copy). 示例 ...

  3. 百万级数据mysql查询优化

    一.limit越往后越慢的原因 当我们使用limit来对数据进行分页操作的时,会发现:查看前几页的时候,发现速度非常快,比如 limit 200,25,瞬间就出来了.但是越往后,速度就越慢,特别是百万 ...

  4. Zabbix agent端 配置

    Zabbix agent端 配置 agent端环境 zabbix-client:RHEL8 IP:192.168.121.11 一.安装 Zabbix 源 [root@zabbix-client ~] ...

  5. kvm虚拟机迁移(6)

    一.迁移简介 迁移:      系统的迁移是指把源主机上的操作系统和应用程序移动到目的主机,并且能够在目的主机上正常运行. 在没有虚拟机的时代,物理机之间的迁移依靠的是系统备份和恢复技术.在源主机上实 ...

  6. unity项目字符串转为Vector3和Quaternion

    运用环境:一般在读取csv表格的数据时是string类型转为Vector3或者Quaternion类型 字符串格式:x,x,x /x,x,x,x (英文逗号) 方法: /// <summary& ...

  7. gin使用validator库参数校验若干实用技巧

    validator库参数校验若干实用技巧 本文介绍了使用validator库做参数校验的一些十分实用的使用技巧,包括翻译校验错误提示信息.自定义提示信息的字段名称.自定义校验方法等. validato ...

  8. AlexeyAB DarkNet YOLOv3框架解析与应用实践(五)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(五) RNNs in Darknet 递归神经网络是表示随时间变化的数据的强大模型.为了更好地介绍RNNs,我强烈推荐Andrej K ...

  9. cuGraph-GPU图形分析

    cuGraph-GPU图形分析 所述RAPIDS cuGraph库是GPU的集合加速图形算法,在GPU DataFrames中发现过程数据.cuGraph的愿景是使图分析无处不在,以至于用户只是根据分 ...

  10. 编译器设计-RunTime运行时环境

    编译器设计-RunTime运行时环境 Compiler Design - Run-Time Environment 作为源代码的程序仅仅是文本(代码.语句等)的集合,要使其活动,它需要在目标计算机上执 ...