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正则匹配单元格符号,并按符号把单元格拆分行(这里是按第一列分行,分行是从活动单元格的行开始,分行前需要选择所有需要填充内容的列,否则需要后期手动填充)的更多相关文章

  1. excel vba 数据分析

    (Visual Basic Application) VBA(Visual Basic for Application)是Microsoft Office系列软件的内置编程语言,其语法结构与Visua ...

  2. Excel VBA语句集

    Excel VBA语句集 引子 最近批阅学生成绩,用Excel 处理学生成绩,用到VBA 提高办公效率.需要经常查阅VBA的一些用法 正文 定制模块行为 (1) Option Explicit '强制 ...

  3. Js使用word书签填充内容

    Js使用word书签填充内容 1.在模板文件中需要填充的地方插入书签 填充内容为:(|光标所在处) 填写书签名,点击添加完成: 2.使用js打开模板,获取书签位置,填充数据: function pri ...

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

    方法1:运用excel单元格拆分合并实现 思路:用VBA正则查询左侧括号个数,对右侧单元格逐一按逗号.顿号等符号分列,同时左侧按括号分列(分列只能按括号单边分列),分列完成后按要求合并,本题事例把括号 ...

  5. excel VBA返回选中单元格区域的行数、列数,以及活动单元格的行号和列号

    Private Sub Worksheet_SelectionChange(ByVal Target As Range) '可以直接sub(),不然选择就会触发vba    Dim rows_coun ...

  6. 个人永久性免费-Excel催化剂功能第52波-相同内容批量合并单元格,取消合并单元格并填充内容

    在高级Excel用户群体中无比痛恨的合并单元格,在现实的表格中却阴魂不散的纠缠不断.今天Excel催化剂也来成为“帮凶”,制造更多的合并单元格.虽然开发出此功能,请使用过程中务必要保持节制,在可以称为 ...

  7. Excel VBA入门(八)单元格边框

    本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...

  8. excel 根据单元格内容自动调整列宽

      excel 根据单元格内容自动调整列宽 CreateTime--2018年5月28日08:49:40 Author:Marydon 1.情景展示 单元格宽度超过了列宽 2.解决方案 第一步:同时选 ...

  9. Excel表格中无法中间插入新行列! 提示:在当前工作表的最后一行或列中,存在非空单元格,解决方案

    excel中新增行列时报错: 提示:在当前工作表的最后一行或列中,存在非空单元格,所以无法插入新行或新列.

随机推荐

  1. JAVA并发(2)-ReentrantLock的见解

    上节,我们讲了AQS的阻塞与释放实现原理,线程间通信(Condition)的原理.这次,我们就讲讲基于AQS实现的ReentrantLock(重入锁). 1. 介绍 结合上面的ReentrantLoc ...

  2. golang:协程安全

    多路复用 Go语言中提供了一个关键字select,通过select可以监听channel上的数据流动.select的用法与switch语法类似,由select开始一个新的选择块,每个选择条件由case ...

  3. [刷题] 51 N-Queens

    要求 将n个皇后摆放在n*n的棋盘中,使横.竖和两个对角线方向均不会同时出现两个皇后 思路 尝试在一行中摆放,如果摆不下,回到上一行重新摆放,直到所有行都摆下 快速判断不合法情况 竖向:col[i]表 ...

  4. 其他CSS属性

    一.设置元素的颜色和透明度 a.color color 属性规定文本的颜色.这个属性设置了一个元素的前景色(在 HTML 表现中,就是元素文本的颜色):光栅图像不受 color 影响.这个颜色还会应用 ...

  5. 007.Ansible变量Fact,魔法变量和lookup生成变量

    一 fact变量 1.1  fact简介 ansible有一个模块叫setup,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用.而setup模块获取这些信息的方法就是 ...

  6. linux进阶之gitlab仓库搭建及免密使用

    一.Gitlab简介 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 可通过Web界面进行访问公开的或者私人项目.它拥有与Github类 ...

  7. 3.23 vi/vim:纯文本编辑器

    vi/vim 是Linux命令行界面下的文字编辑器,几乎所有的Linux系统都安装了vi,只要学会了vi这个编辑工具,就可以在任何Linux系统上使用它.而vim是vi命令的增强版(Vi IMprov ...

  8. nginx反向代理网站镜像

    某些公司会墙特定网站,如果你有一个可访问的域名和服务器,就可以通过nginx反向代理来来解决这些问题.比如现在我们用mirror.example.com镜像www.baidu.com,以下是详细操作. ...

  9. Azure Synapse Link for Dataverse

    MyBuild - Scale, analyze and serve Microsoft Dynamics 365 application data with Azure 本周的微软Bulid大会上发 ...

  10. SpringBoot2 集成测试组件,七种测试手段对比

    一.背景描述 在版本开发中,时间段大致的划分为:需求,开发,测试: 需求阶段:理解需求做好接口设计: 开发阶段:完成功能开发和对接: 测试上线:自测,提测,修复,上线: 实际上开发阶段两个核心的工作, ...