用ExcelVBA实现自动拆分单元格中的内容到多行中

一、背景

  我们在使用Excel办公软件的时候,有时会遇到这种情况:我们想把一个或多个单元格中的内容拆分到多行。例如表1所示:

药品名称 简述 详述
健胃消食片 1、成分;
2、性状;
3、功能主治;
4、规格;
5、用法用量;
1、太子参、陈皮、山药、炒麦芽、山楂。辅料为蔗糖、硬脂酸镁。
2、本品为浅棕黄色的片。气微香,味微甜、酸。
3、健胃消食。用于脾胃虚弱所致的食积,症见不思饮、嗳腐酸臭、腕腹胀满;消化不良见上述证候者。
4、每片重0.5克。
5、口服,可以咀嚼。一次4-6片,一日3次。小儿酌减。
6、怎么多了一项?

  我们有时想把表1的第2列、第3列,拆成表2的形式:

药品名称 简述 详述
健胃消食片 1、成分; 1、太子参、陈皮、山药、炒麦芽、山楂。辅料为蔗糖、硬脂酸镁。
健胃消食片 2、性状; 2、本品为浅棕黄色的片。气微香,味微甜、酸。
健胃消食片 3、功能主治; 3、健胃消食。用于脾胃虚弱所致的食积,症见不思饮、嗳腐酸臭、腕腹胀满;消化不良见上述证候者。
健胃消食片 4、规格; 4、每片重0.5克。
健胃消食片 5、用法用量; 5、口服,可以咀嚼。一次4-6片,一日3次。小儿酌减。
健胃消食片 6、怎么多了一项?

二、我们怎样拆它?

  • 手动拆  我们可以在Excel里手动拆,当然,批量操作时,很耗时间的 ╥﹏╥...
  • 自动拆  可以考虑编写ExcelVBA程序来实现,这能提高不少效率呢~

  我呢,当然是选择自动拆啦 ( ╯▽╰)

三、我心目中的自动拆

  怎样才算是合格的自动拆呢?只要我们编写出来的程序能实现下面三个功能就OK啦:

  1. 可拆一,也可拆多:既可以拆分一个单元格中的内容,也可以拆分一行多列单元格区域中的内容;
  2. 一行多列,不完全对应时,也能拆:比如表1中,虽然“详述”列多了第6项,但仍可以拆成表2的形式;
  3. 未拆的部分,自动复制:比如表2中,“健胃消食片”就是自动复制的。

四、代码时刻

  代码分了三部分:
    第1步,把拆分的数据存放到数组里;
    第2步,在所选区域上方,插入行,并且复制所选区域的内容;
    第3步,将数组中的数据覆盖拆分区域。
  接下来就是激动人心的代码时刻了(≧∇≦)ノ

Sub ChaiFenDanYuanGe()
'声明变量
Dim arr() As String '定义一个字符串数组,用来存放单元格拆分后的数据
Dim m%              '定义一个整数,用来记录单元格内容需拆分的总行数
Dim n%              '定义一个整数,用来记录要拆分单元格的总个数
Dim row1, col1      '记录所选单元格所在的行数 和 列数
Dim i%, j%          '循环计数变量
Dim max%            '记录最大整数

'第1步,把拆分的数据存放到数组arr里
    '第1.1步,确定要拆多少行,即确定m的值
        '第1.1.1步,选择区域有几列?也就是要拆分的单元格的总个数,即n的值
        '注意:我们选择的区域都是1行1列 或 1行多列
        n = Selection.Count
    If n = 1 Then   '如果选择区域仅有一个单元格,那么...
        m = UBound(VBA.Split(Selection.Cells(1, n), Chr(10)))
    Else            '如果选择区域不止一个单元格,那么通过比较,确定出选中区域,单元格能拆分的最多行数
        m = UBound(VBA.Split(Selection.Cells(1, 1), Chr(10)))
        For i = 2 To n
            max = UBound(VBA.Split(Selection.Cells(1, i), Chr(10)))
            If max > m Then
                m = max
            End If
        Next i
    End If
    
    '第1.2步,存数据到数组,
    'split分隔符是chr(10),也就是单元格里的alt+enter这种回车
    '如果要用其他的分隔符,如用分号分隔,则直接split(单元格,";")即可
    ReDim arr((n - 1), m) '数组arr()是m+1行,n列
    For i = 0 To (n - 1)
        '获取单元格split后的字符串个数,防止下标j越界
        max = UBound(Application.Transpose(Application.Transpose(VBA.Split(Selection.Cells(1, i + 1), Chr(10))))) - 1
        For j = 0 To m
            If j <= max Then
                arr(i, j) = Application.Transpose(Application.Transpose(VBA.Split(Selection.Cells(1, i + 1), Chr(10))))(j + 1)
            End If
        Next j
    Next i

'第2步,在所选区域上方,插入m行,并且复制所选区域的内容
    '第2.1步,获取activecell所在的行数,selection第一个单元格的列数
    row1 = ActiveCell.Row
    col1 = Selection.Cells(1, 1).Column
    '第2.2步,插入m行
    For i = 1 To m
        Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
    Next i
    '第2.3步,复制行
    Cells(row1 + m, 1).EntireRow.Copy
    Range(Cells(row1, 1), Cells(row1 + m - 1, 1)).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False

'第3步,将数组arr中的数据覆盖拆分区域
For i = 0 To n - 1
    For j = 0 To m
        Cells(row1 + j, col1 + i) = arr(i, j)
    Next j
Next i
'大功告成,将焦点放在A1单元格
Cells(1, 1).Select
End Sub

五、温馨提示

  • 插入按钮:可以在Excel工作表中插入按钮控件,关联此程序,即可实现点击按钮就自动拆分的效果,如下图所示:
    自动拆分效果图
  • 学习ExcelVBA:推荐到我要自学网(www.51zxw.net)上学习哦~

最后,感谢大家阅读此文,感谢大家给予肯定和提出改进建议,谢谢O(∩_∩)O~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • VBA订制工具栏 http://club.excelhome.net/thread-1047254-1-1.htm...
    大海一滴写字的地方阅读 2,238评论 0 0
  • Ctrl 组合快捷键 快捷键说明 Ctrl+PgDn在工作表选项卡之间从左至右进行切换。 Ctrl+PgUp在工作...
    一一休阅读 1,056评论 0 0
  • 觉得每天写日记似的内容略显无趣,今天又是带娃回娘家的日子。整理娃东西的时候赫然发现我选的双肩背包简直是小款背包中的...
    张家小林阅读 390评论 0 2
  • 工作、看书、学习、精进 不知不觉已经蓉飘了两年多,从16年初来成都到现在,见证了成都房价的飞涨、也感受到了...
    朝丽月雨lxq阅读 331评论 0 0