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. 《前端运维》一、Linux基础--03Shell基础及补充

    诶诶欸?不是学Linux么?怎么要讲shell了?shell是啥?啥是shell? 别急,我们先简单了解下shell是什么.Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁. ...

  2. .jnlp 文件打开方式

    .jnlp 文件打开方式 jnlp文件打开需要安装jre ,java环境,通过java环境运行即可,下面介绍详细步骤 1.下载.安装最新版jre环境,直接下一步即可 2 java配置 打开控制面板,查 ...

  3. zabbix自带的模板监控mysql

    科技小能手 2017-11-12 1208浏览量 简介: zabbix官方支持监控MySQL,但直接使用默认的模板是不可用的,还需要经过额外的设置才可以使用.如果只需要对mysql数据库做简单的监控, ...

  4. 002.Ansible之Inventory文件

    一 简介 在使用Ansible来批量管理主机的时候,通常我们需要先定义要管理哪些主机或者主机组,而这个用于管理主机与主机组的文件就叫做Inventory,也叫主机清单.该文件默认位于/etc/ansi ...

  5. linux中getopt的用法-(转自pengyingh)

    getopt被用来解析命令行选项参数.就不用自己写东东处理argv了. #include <unistd.h>       extern char *optarg;   //选项的参数指针 ...

  6. [LeetCode] 1074. 元素和为目标值的子矩阵数量

    矩阵前缀和.因为矩阵中可能包含负值,所以这题肯定不会存在什么剪枝,动态规划的可能性.所以这个题也就没什么弯弯绕绕.个人感觉算不上个Hard题目. 最直观的思路就是枚举子矩阵,既枚举矩阵的左上角节点和右 ...

  7. java中存储mysql数据库时间类型【date、time、datetime、timestamp】

    在MySQL中对于时间的存储自己见表的时候都是设置的varchar类型的,感觉挺方便的. 昨天拿别人建好的表写代码,发现这张表中时间类型为datetime的,凭感觉试了一下不行,网上查了刚开始试了好几 ...

  8. 常用深度学习框——Caffe/ TensorFlow / Keras/ PyTorch/MXNet

    常用深度学习框--Caffe/ TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tenso ...

  9. 在cuDNN中简化Tensor Ops

    在cuDNN中简化Tensor Ops 在Tesla V100 GPU中引入神经网络模型以来,神经网络模型已迅速利用NVIDIA Tensor Cores进行深度学习.例如,基于Tensor Core ...

  10. 10分钟内基于gpu的目标检测

    10分钟内基于gpu的目标检测 Object Detection on GPUs in 10 Minutes 目标检测仍然是自动驾驶和智能视频分析等应用的主要驱动力.目标检测应用程序需要使用大量数据集 ...